def testGreatCircle(S): # run tests for spherical module S t = Tests(__file__, __version__, S) # Indian Pond, in Piermond, NH. My old Boy Scout Camp IndianPond = S.LatLon(43.930912, -72.053811) Eiffel = S.LatLon(48.858158, 2.294825) Versailles = S.LatLon(48.804766, 2.120339) StGermain = S.LatLon(48.897728, 2.094977) Orly = S.LatLon(48.747114, 2.400526) # distance between the Eiffel Tower and Versailles in meter dEiffelToVersailles = 14084.280704919687 mEiffelToVersailles = '%.4f' # '%.8f' # initial and final bearings between Eiffel tower and Versailles ibEiffelToVersailles = 245.13460296861962 fbEiffelToVersailles = 245.00325395138532 fmtEiffelToVersailles = '%.8f' # '%.14f' # initial and final bearing between Versailles and Eiffel tower ibVersaillesToEiffel = 65.003253951385318 fbVersaillesToEiffel = 65.134602968619618 fmtVersaillesToEiffel = '%.9f' # '%.15f' # initial bearing for two locations that are the same b = IndianPond.initialBearingTo(IndianPond) t.test('InitialBearingSameLocations', b, 0.0, '%.1f') # initial bearing for two locations that are the equal b = IndianPond.initialBearingTo(IndianPond.copy()) t.test('InitialBearingEqualLocations', b, 0.0, '%.1f') # final bearing for two locations that are the same b = IndianPond.finalBearingTo(IndianPond) t.test('FinalBearingSameLocations', b, 180.0, '%.1f') # 0.0 # final bearing for two locations that are the equal b = IndianPond.finalBearingTo(IndianPond.copy()) t.test('FinalBearingEqualLocations', b, 180.0, '%.1f') # 0.0 # distance for two locations that are the same d = IndianPond.distanceTo(IndianPond) t.test('DistanceSameLocations', d, 0.0, '%.1f') # distance for two locations that are equal d = IndianPond.distanceTo(IndianPond.copy()) t.test('DistanceEqualLocations', d, 0.0, '%.1f') # distance between Eiffel Tower and Versailles d = Eiffel.distanceTo(Versailles) t.test('DistanceEiffelToVersailles', d, dEiffelToVersailles, mEiffelToVersailles, known=True) # distance between Versailles and Eiffel Tower d = Versailles.distanceTo(Eiffel) t.test('DistanceVersaillesToEiffel', d, dEiffelToVersailles, mEiffelToVersailles, known=True) # initial bearing between Eiffel Tower and Versailles b = Eiffel.initialBearingTo(Versailles) t.test('InitialBearingEiffelToVersailles', b, ibEiffelToVersailles, fmtEiffelToVersailles) t.test('InitialBearingEiffelToVersailles(DMS)', bearingDMS(b, F_DMS, prec=4), '245°08′04.5707″') # initial bearing between Versailles and Eiffel Tower b = Versailles.initialBearingTo(Eiffel) t.test('InitialBearingVersaillesToEiffel', b, ibVersaillesToEiffel, fmtVersaillesToEiffel) t.test('InitialBearingVersaillesToEiffel(DMS)', bearingDMS(b, F_DMS, prec=4), '65°00′11.7142″') # final bearing between Eiffel Tower and Versailles b = Eiffel.finalBearingTo(Versailles) t.test('FinalBearingEiffelToVersailles', b, fbEiffelToVersailles, fmtEiffelToVersailles) t.test('FinalBearingEiffelToVersailles(DMS)', bearingDMS(b, F_DMS, prec=4), '245°00′11.7142″') # final bearing between Versailles and Eiffel Tower b = Versailles.finalBearingTo(Eiffel) t.test('FinalBearingVersaillesToEiffel', b, fbVersaillesToEiffel, fmtVersaillesToEiffel) t.test('FinalBearingVersaillesToEiffel(DMS)', bearingDMS(b, F_DMS, prec=4), '65°08′04.5707″') # generating a location for Versailles based on bearing and distance v = Eiffel.destination(dEiffelToVersailles, ibEiffelToVersailles) t.test('GenerateLocationVersailles', v, str(Versailles)) # generating a location for Eiffel based on bearing and distance. e = Versailles.destination(dEiffelToVersailles, ibVersaillesToEiffel) t.test('GenerateLocationEiffel', e, str(Eiffel)) # midpoint between the Eiffel and Versailles a = Eiffel.midpointTo(Versailles) b = Eiffel.destination(dEiffelToVersailles / 2.0, ibEiffelToVersailles) t.test('MidpointEiffelToVersailles', a, str(b)) t.test('MidpointEiffelToVersailles(DMS)', a.toStr(F_DMS, prec=4), '48°49′53.3817″N, 002°12′27.1279″E') a = Eiffel.distanceTo(a) b = Versailles.distanceTo(b) t.test('MidpointEiffelToVersailles(m)', a, str(b), known=True) # midpoint between Versailles and the Eiffel Tower a = Versailles.midpointTo(Eiffel) b = Versailles.destination(dEiffelToVersailles / 2.0, ibVersaillesToEiffel) t.test('MidpointVersaillesToEiffel', a, str(b), known=True) t.test('MidpointVersaillesToEiffel(DMS)', a.toStr(F_DMS, prec=4), '48°49′53.3817″N, 002°12′27.1279″E') a = Versailles.distanceTo(a) b = Eiffel.distanceTo(b) t.test('MidpointVersaillesToEiffel(m)', a, str(b), known=True) # intersection. b = StGermain.initialBearingTo(Orly) i = StGermain.intersection(b, Eiffel, ibEiffelToVersailles) t.test('Intersection', i.toStr(F_D, prec=9), '48.83569095°N, 002.221252031°E') # '48.83569094988361°N, ... t.test('Intersection', i.toStr(F_D, prec=13), '48.8356909498836°N, 002.2212520313074°E' ) # 002.2212520313073583°E' # cross-track distance test of a point 90° and 200 meters away m = Eiffel.midpointTo(Versailles) b = Eiffel.initialBearingTo(Versailles) p = m.destination(200.0, (b + 90) % 360.0) d = p.crossTrackDistanceTo(Eiffel, Versailles) t.test('CrossTrackDistance90Degrees200Meters', d, 200.0, '%0.1f') # cross-track distance test of a point 270° and 200 meters away m = Eiffel.midpointTo(Versailles) b = Eiffel.initialBearingTo(Versailles) p = m.destination(200.0, (b + 270) % 360.0) d = p.crossTrackDistanceTo(Eiffel, Versailles) t.test('CrossTrackDistance270Degrees200Meters', d, -200.0, '%0.1f') # cross-track distance that should be very close to 0 m = Eiffel.midpointTo(Versailles) d = abs(m.crossTrackDistanceTo(Eiffel, Versailles)) t.test('CrossTrackDistanceThatShouldBeVeryCloseToZero', d, '0.00000000', '%.8f') t.results() return t
def testGreatCircle(self, module): # spherical only self.subtitle(module, 'GreatCircle') LatLon = module.LatLon # Indian Pond, in Piermond, NH. My old Boy Scout Camp IndianPond = LatLon(43.930912, -72.053811) Eiffel = LatLon(48.858158, 2.294825) Versailles = LatLon(48.804766, 2.120339) StGermain = LatLon(48.897728, 2.094977) Orly = LatLon(48.747114, 2.400526) # distance between the Eiffel Tower and Versailles in meter dEiffelToVersailles = 14084.280704919687 xEiffelToVersailles = '%.6f' # '%.8f' # initial and final bearings between Eiffel tower and Versailles ibEiffelToVersailles = 245.13460296861962 fbEiffelToVersailles = 245.00325395138532 xbEiffelToVersailles = '%.8f' # '%.14f' # initial and final bearing between Versailles and Eiffel tower ibVersaillesToEiffel = 65.003253951385318 fbVersaillesToEiffel = 65.134602968619618 xbVersaillesToEiffel = '%.9f' # '%.15f' xMidpoint = '%.8f' c = crosserrors(False) # no CrossErrors # initial bearing for two locations that are the same b = IndianPond.initialBearingTo(IndianPond) self.test('InitialBearingSameLocations', b, 0.0, '%.1f') # initial bearing for two locations that are the equal b = IndianPond.initialBearingTo(IndianPond.copy()) self.test('InitialBearingEqualLocations', b, 0.0, '%.1f') # final bearing for two locations that are the same b = IndianPond.finalBearingTo(IndianPond) self.test('FinalBearingSameLocations', b, 180.0, '%.1f') # 0.0 # final bearing for two locations that are the equal b = IndianPond.finalBearingTo(IndianPond.copy()) self.test('FinalBearingEqualLocations', b, 180.0, '%.1f') # 0.0 c = crosserrors(c) try: # should raise CrossError b = IndianPond.initialBearingTo(IndianPond) except CrossError as x: self.test( 'FinalBearingCrossError', str(x), 'coincident points: LatLon(43°55′51.28″N, 072°03′13.72″W)') # distance for two locations that are the same d = IndianPond.distanceTo(IndianPond) self.test('DistanceSameLocations', d, 0.0, '%.1f') # distance for two locations that are equal d = IndianPond.distanceTo(IndianPond.copy()) self.test('DistanceEqualLocations', d, 0.0, '%.1f') # distance between Eiffel Tower and Versailles d = Eiffel.distanceTo(Versailles) self.test('DistanceEiffelToVersailles', d, dEiffelToVersailles, fmt=xEiffelToVersailles, known=True) # distance between Versailles and Eiffel Tower d = Versailles.distanceTo(Eiffel) self.test('DistanceVersaillesToEiffel', d, dEiffelToVersailles, fmt=xEiffelToVersailles, known=True) # initial bearing between Eiffel Tower and Versailles b = Eiffel.initialBearingTo(Versailles) self.test('InitialBearingEiffelToVersailles', b, ibEiffelToVersailles, fmt=xbEiffelToVersailles) self.test('InitialBearingEiffelToVersailles(DMS)', bearingDMS(b, F_DMS, prec=4), '245°08′04.5707″') # initial bearing between Versailles and Eiffel Tower b = Versailles.initialBearingTo(Eiffel) self.test('InitialBearingVersaillesToEiffel', b, ibVersaillesToEiffel, fmt=xbVersaillesToEiffel) self.test('InitialBearingVersaillesToEiffel(DMS)', bearingDMS(b, F_DMS, prec=4), '65°00′11.7142″') # final bearing between Eiffel Tower and Versailles b = Eiffel.finalBearingTo(Versailles) self.test('FinalBearingEiffelToVersailles', b, fbEiffelToVersailles, fmt=xbEiffelToVersailles) self.test('FinalBearingEiffelToVersailles(DMS)', bearingDMS(b, F_DMS, prec=4), '245°00′11.7142″') # final bearing between Versailles and Eiffel Tower b = Versailles.finalBearingTo(Eiffel) self.test('FinalBearingVersaillesToEiffel', b, fbVersaillesToEiffel, fmt=xbVersaillesToEiffel) self.test('FinalBearingVersaillesToEiffel(DMS)', bearingDMS(b, F_DMS, prec=4), '65°08′04.5707″') # generating a location for Versailles based on bearing and distance v = Eiffel.destination(dEiffelToVersailles, ibEiffelToVersailles) self.test('GenerateLocationVersailles', v, str(Versailles)) # generating a location for Eiffel based on bearing and distance. e = Versailles.destination(dEiffelToVersailles, ibVersaillesToEiffel) self.test('GenerateLocationEiffel', e, str(Eiffel)) # midpoint between the Eiffel and Versailles a = Eiffel.midpointTo(Versailles) b = Eiffel.destination(dEiffelToVersailles / 2.0, ibEiffelToVersailles) self.test('MidpointEiffelToVersailles', a, str(b)) self.test('MidpointEiffelToVersailles(DMS)', a.toStr(F_DMS, prec=4), '48°49′53.3817″N, 002°12′27.1279″E') a = Eiffel.distanceTo(a) m = Versailles.distanceTo(b) self.test('MidpointEiffelToVersailles(m)', a, m, fmt=xMidpoint, known=True) # midpoint between Versailles and the Eiffel Tower a = Versailles.midpointTo(Eiffel) b = Versailles.destination(dEiffelToVersailles / 2.0, ibVersaillesToEiffel) self.test('MidpointVersaillesToEiffel', a, str(b), known=True) self.test('MidpointVersaillesToEiffel(DMS)', a.toStr(F_DMS, prec=4), '48°49′53.3817″N, 002°12′27.1279″E') a = Versailles.distanceTo(a) m = Eiffel.distanceTo(b) self.test('MidpointVersaillesToEiffel(m)', a, m, fmt=xMidpoint, known=True) # intersection. b = StGermain.initialBearingTo(Orly) i = StGermain.intersection(b, Eiffel, ibEiffelToVersailles) self.test( 'Intersection', i.toStr(F_D, prec=9), '48.83569095°N, 002.221252031°E') # '48.83569094988361°N, ... self.test('Intersection', i.toStr(F_D, prec=13), '48.8356909498836°N, 002.2212520313074°E' ) # 002.2212520313073583°E' # cross-track distance test of a point 90° and 200 meters away m = Eiffel.midpointTo(Versailles) b = Eiffel.initialBearingTo(Versailles) p = m.destination(200.0, (b + 90) % 360.0) d = p.crossTrackDistanceTo(Eiffel, Versailles) self.test('CrossTrackDistance200m+90°', d, 200.0, fmt='%0.1f') # cross-track distance test of a point 270° and 200 meters away m = Eiffel.midpointTo(Versailles) b = Eiffel.initialBearingTo(Versailles) p = m.destination(200.0, (b + 270) % 360.0) d = p.crossTrackDistanceTo(Eiffel, Versailles) self.test('CrossTrackDistance200m+270°', d, -200.0, fmt='%0.1f') # cross-track distance that should be very close to 0 m = Eiffel.midpointTo(Versailles) d = abs(m.crossTrackDistanceTo(Eiffel, Versailles)) self.test('CrossTrackDistanceCloseToZero', d, '0.0000000', fmt='%.7f')
def _dfr(d, f, r): r = wrap360(r + 180) # final bearing to back azimuth t = d, normDMS(bearingDMS(f, form=F_DMS, prec=4), norm=' '), \ normDMS(bearingDMS(r, form=F_DMS, prec=4), norm=' ') return '%.4f, %s, %s' % t
def testKarneyVincenty(self, module, LatLon, d): self.subtitle(module, 'KarneyVincenty', datum=d.name) p = LatLon(-37.95103342, 144.42486789, datum=d) t = p.distanceTo(p) self.test('coincident', t, '0.0') t = p.distanceTo3(p) self.test('coincident', fstr(t), '0.0, 0.0, 0.0') q = p.destination(54972.271, 306.86816) t = q.toStr(F_D, prec=4) self.test('destination', t, '37.6528°S, 143.9265°E') self.test('destination', isinstance(q, LatLon), True) q, f = p.destination2(54972.271, 306.86816) t = q.toStr(F_D) + ', ' + compassDMS(f, prec=4) self.test('destination2', t, '37.652821°S, 143.926496°E, 307.1736°NW') self.test('destination2', isinstance(q, LatLon), True) f = p.finalBearingOn(54972.271, 306.86816) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn', t, '307.1736°, 307°10′25.07″NW') # <https://GitHub.com/chrisveness/geodesy/blob/master/test/latlon-ellipsoidal-vincenty-tests.js> # ... Test case (UK), using WGS-84 p = LatLon(50.06632, -5.71475, datum=d) q = LatLon(58.64402, -3.07009, datum=d) m = p.distanceTo(q) self.test('distanceTo', m, '969954.166', fmt='%.3f') t = p.distanceTo3(q) t = fstr(t, prec=6) self.test('distanceTo3', t, '969954.166314, 9.141877, 11.29722') t = p.distanceTo2(q) t = fstr(t, prec=5) self.test('distanceTo2', t, '972708.16174, 11.22502') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '9.1419°, 9°08′30.76″N') t = p.destination(m, b) self.test('destination', t.toStr(form=F_D, prec=5), '58.64402°N, 003.07009°W') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '11.2972°, 11°17′49.99″NNE') f = p.finalBearingOn(m, b) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn', t, '11.2972°, 11°17′49.99″NNE') p = LatLon(52.205, 0.119) q = LatLon(48.857, 2.351) m = p.distanceTo(q) self.test('distanceTo', m, '404607.806', fmt='%.3f') t = p.distanceTo3(q) t = fstr(t, prec=6) self.test('distanceTo3', t, '404607.805988, 156.11064, 157.8345') t = p.distanceTo2(q) t = fstr(t, prec=6) self.test('distanceTo2', t, '402574.597287, 157.726344') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '156.1106°, 156°06′38.31″SSE') t = p.destination(m, b) self.test('destination', t.toStr(form=F_D, prec=5), '48.857°N, 002.351°E') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '157.8345°, 157°50′04.2″SSE') # 157.9 f = p.finalBearingOn(m, b) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn', t, '157.8345°, 157°50′04.2″SSE') p = LatLon(37.95103, 144.42487, datum=d) q = LatLon(37.65280, 143.9265, datum=d) m = p.distanceTo(q) self.test('distanceTo', m, '54973.295', fmt='%.3f') t = p.distanceTo3(q) t = fstr(t, prec=5) self.test('distanceTo3', t, '54973.29527, 233.13008, 232.82461') t = p.distanceTo2(q) t = fstr(t, prec=5) self.test('distanceTo2', t, '54903.41209, 232.9209') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '233.1301°, 233°07′48.28″SW') t = p.destination(m, b) self.test('destination', t.toStr(form=F_D, prec=5), '37.6528°N, 143.9265°E') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '232.8246°, 232°49′28.59″SW') f = p.finalBearingOn(m, b) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn', t, '232.8246°, 232°49′28.59″SW') # <https://GitHub.com/maurycyp/vincenty> Maurycy Pietrzak Boston = LatLon(42.3541165, -71.0693514, datum=d) NewYork = LatLon(40.7791472, -73.9680804, datum=d) m = Boston.distanceTo(NewYork) self.test('distanceToMP', m, '298396.057', fmt='%.3f') self.test('distanceToSM', m2SM(m), 185.414, fmt='%.3f') p = LatLon(0, 0, datum=d) q = LatLon(0, 1, datum=d) m = p.distanceTo(q) self.test('distanceToMP', m, '111319.491', fmt='%.3f') q = LatLon(1, 0, datum=d) m = p.distanceTo(q) self.test('distanceToMP', m, '110574.389', fmt='%.3f') # <https://PyPI.org/project/pygc> Kyle Wilcox p = LatLon(0, 50, datum=d) q = LatLon(0, 52, datum=d) m = p.distanceTo(q) self.test('distanceToKW', m, '222638.982', fmt='%.3f') q = LatLon(0, 49, datum=d) m = p.distanceTo(q) self.test('distanceToKW', m, '111319.491', fmt='%.3f') # <https://www.Movable-Type.co.UK/scripts/latlong-vincenty.html> # ... Test case (from Geoscience Australia), using WGS-84 FindersPeak = LatLon('37°57′03.72030″S', '144°25′29.52440″E') Buninyong = LatLon('37°39′10.15610″S', '143°55′35.38390″E') m, b, f = FindersPeak.distanceTo3(Buninyong) self.test('distanceTo3', m, '54972.271', fmt='%.3f') self.test('distanceTo3', bearingDMS(b, F_DMS), '306°52′05.37″') self.test('distanceTo3', bearingDMS(f, F_DMS), '307°10′25.07″') m, b = FindersPeak.distanceTo2(Buninyong) self.test('distanceTo2', m, '54902.390', fmt='%.3f') self.test('distanceTo2', bearingDMS(b, F_DMS), '307°04′38.41″')
def testVincenty(self, LatLon, datum): d = datum n = ' (%s)' % (d.name, ) Newport_RI = LatLon(41.49008, -71.312796, datum=d) Cleveland_OH = LatLon(41.499498, -81.695391, datum=d) m = Newport_RI.distanceTo(Cleveland_OH) self.test('distanceTo' + n, '%.5f' % m, '866455.43292') try: t = None m = Newport_RI.distanceTo(Newport_RI) except VincentyError as x: t = x # Python 3+ self.test( 'VincentyError' + n, t, 'LatLon(41°29′24.29″N, 071°18′46.07″W) coincident with LatLon(41°29′24.29″N, 071°18′46.07″W)' ) if hasattr(LatLon, 'toCartesian'): try: m = Newport_RI.distanceTo( Cleveland_OH.convertDatum(Datums.OSGB36)) self.test('ValueError' + n, None, 'other Ellipsoid mistmatch: ...' + d.ellipsoid.name) except ValueError as x: self.test( 'ValueError' + n, x, 'other Ellipsoid mistmatch: Ellipsoids.Airy1830 vs Ellipsoids.' + d.ellipsoid.name) except Exception as x: self.test('ValueError' + n, x, 'ValueError ...' + d.ellipsoid.name) Boston = LatLon(42.3541165, -71.0693514, datum=d) NewYork = LatLon(40.7791472, -73.9680804, datum=d) m = Boston.distanceTo(NewYork) p = LatLon(-37.95103342, 144.42486789, datum=d) self.test('isellipsoidal', p.isellipsoidal, 'True') self.test('isspherical', p.isspherical, 'False') q = p.copy() self.test('copy', q.equals(p), 'True') self.test('isellipsoidal', q.isellipsoidal, 'True') self.test('isspherical', q.isspherical, 'False') self.test('copy', q.toStr(F_DMS, prec=4), '37°57′03.7203″S, 144°25′29.5244″E') q = p.destination(54972.271, 306.86816) t = q.toStr(F_D, prec=4) self.test('destination' + n, t, '37.6528°S, 143.9265°E') self.test('destination' + n, isinstance(q, LatLon), 'True') q, f = p.destination2(54972.271, 306.86816) t = q.toStr(F_D) + ', ' + compassDMS(f, prec=4) self.test('destination2' + n, t, '37.652821°S, 143.926496°E, 307.1736°NW') self.test('destination2' + n, isinstance(q, LatLon), 'True') f = p.finalBearingOn(54972.271, 306.86816) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn' + n, t, '307.1736°, 307°10′25.07″NW') p = LatLon(50.06632, -5.71475, datum=d) q = LatLon(58.64402, -3.07009, datum=d) m = p.distanceTo(q) self.test('distanceTo' + n, '%.3f' % m, '969954.166') t = p.distanceTo3(q) t = fStr(t, prec=6) self.test('distanceTo3' + n, t, '969954.166314, 9.141877, 11.29722') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo' + n, t, '9.1419°, 9°08′30.76″N') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo' + n, t, '11.2972°, 11°17′49.99″NNE') p = LatLon(52.205, 0.119) q = LatLon(48.857, 2.351) m = p.distanceTo(q) self.test('distanceTo' + n, '%.3f' % m, '404607.806') t = p.distanceTo3(q) t = fStr(t, prec=6) self.test('distanceTo3' + n, t, '404607.805988, 156.11064, 157.8345') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo' + n, t, '156.1106°, 156°06′38.31″SSE') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo' + n, t, '157.8345°, 157°50′04.2″SSE') # 157.9 p = LatLon(37.95103, 144.42487, datum=d) q = LatLon(37.65280, 143.9265, datum=d) m = p.distanceTo(q) self.test('distanceTo' + n, '%.3f' % m, '54973.295') t = p.distanceTo3(q) t = fStr(t, prec=5) self.test('distanceTo3' + n, t, '54973.29527, 233.13008, 232.82461') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo' + n, t, '233.1301°, 233°07′48.28″SW') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo' + n, t, '232.8246°, 232°49′28.59″SW') # <https://github.com/maurycyp/vincenty> Maurycy Pietrzak Boston = LatLon(42.3541165, -71.0693514, datum=d) NewYork = LatLon(40.7791472, -73.9680804, datum=d) m = Boston.distanceTo(NewYork) self.test('distanceToMP' + n, '%.3f' % m, '298396.057') p = LatLon(0, 0, datum=d) q = LatLon(0, 1, datum=d) m = p.distanceTo(q) self.test('distanceToMP' + n, '%.3f' % m, '111319.491') q = LatLon(1, 0, datum=d) m = p.distanceTo(q) self.test('distanceToMP' + n, '%.3f' % m, '110574.389') # <https://pypi.python.org/pypi/pygc> Kyle Wilcox p = LatLon(0, 50, datum=d) q = LatLon(0, 52, datum=d) m = p.distanceTo(q) self.test('distanceToKW' + n, '%.3f' % m, '222638.982') q = LatLon(0, 49, datum=d) m = p.distanceTo(q) self.test('distanceToKW' + n, '%.3f' % m, '111319.491')
def testVincenty(self, module, datum): d = datum self.subtitle(module, 'Vincenty', datum=d.name) LatLon = module.LatLon Newport_RI = LatLon(41.49008, -71.312796, datum=d) Cleveland_OH = LatLon(41.499498, -81.695391, datum=d) m = Newport_RI.distanceTo(Cleveland_OH) self.test('distanceTo', m, '866455.43292', fmt='%.5f') try: t = None m = Newport_RI.distanceTo(Newport_RI) except VincentyError as x: t = x # Python 3+ self.test( 'VincentyError', t, 'LatLon(41°29′24.29″N, 071°18′46.07″W) coincides with LatLon(41°29′24.29″N, 071°18′46.07″W)' ) if hasattr(LatLon, 'toCartesian'): try: m = Newport_RI.distanceTo( Cleveland_OH.convertDatum(Datums.OSGB36)) self.test('ValueError', None, 'other Ellipsoid mistmatch: ...' + d.ellipsoid.name) except ValueError as x: self.test( 'ValueError', x, 'other Ellipsoid mistmatch: Ellipsoids.Airy1830 vs Ellipsoids.' + d.ellipsoid.name) except Exception as x: self.test('ValueError', x, 'ValueError ...' + d.ellipsoid.name) p = LatLon(-37.95103342, 144.42486789, datum=d) self.test('isEllipsoidal', p.isEllipsoidal, True) self.test('isSpherical', p.isSpherical, False) self.test('epsilon', p.epsilon, 1e-12) self.test('iterations', p.iterations, 50) q = p.copy() self.test('copy', q.equals(p), True) self.test('isEllipsoidal', q.isEllipsoidal, True) self.test('isSpherical', q.isSpherical, False) self.test('copy', q.toStr(F_DMS, prec=4), '37°57′03.7203″S, 144°25′29.5244″E') q.epsilon, q.iterations = EPS, 200 self.test('epsilon', q.epsilon, EPS) self.test('iterations', q.iterations, 200) q = p.destination(54972.271, 306.86816) t = q.toStr(F_D, prec=4) self.test('destination', t, '37.6528°S, 143.9265°E') self.test('destination', isinstance(q, LatLon), True) q, f = p.destination2(54972.271, 306.86816) t = q.toStr(F_D) + ', ' + compassDMS(f, prec=4) self.test('destination2', t, '37.652821°S, 143.926496°E, 307.1736°NW') self.test('destination2', isinstance(q, LatLon), True) f = p.finalBearingOn(54972.271, 306.86816) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingOn', t, '307.1736°, 307°10′25.07″NW') p = LatLon(50.06632, -5.71475, datum=d) q = LatLon(58.64402, -3.07009, datum=d) m = p.distanceTo(q) self.test('distanceTo', m, '969954.166', fmt='%.3f') t = p.distanceTo3(q) t = fStr(t, prec=6) self.test('distanceTo3', t, '969954.166314, 9.141877, 11.29722') t = p.distanceTo2(q) t = fStr(t, prec=5) self.test('distanceTo2', t, '972708.16174, 11.22502') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '9.1419°, 9°08′30.76″N') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '11.2972°, 11°17′49.99″NNE') p = LatLon(52.205, 0.119) q = LatLon(48.857, 2.351) m = p.distanceTo(q) self.test('distanceTo', m, '404607.806', fmt='%.3f') t = p.distanceTo3(q) t = fStr(t, prec=6) self.test('distanceTo3', t, '404607.805988, 156.11064, 157.8345') t = p.distanceTo2(q) t = fStr(t, prec=6) self.test('distanceTo2', t, '402574.597287, 157.726344') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '156.1106°, 156°06′38.31″SSE') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '157.8345°, 157°50′04.2″SSE') # 157.9 p = LatLon(37.95103, 144.42487, datum=d) q = LatLon(37.65280, 143.9265, datum=d) m = p.distanceTo(q) self.test('distanceTo', m, '54973.295', fmt='%.3f') t = p.distanceTo3(q) t = fStr(t, prec=5) self.test('distanceTo3', t, '54973.29527, 233.13008, 232.82461') t = p.distanceTo2(q) t = fStr(t, prec=5) self.test('distanceTo2', t, '54903.41209, 232.9209') b = p.initialBearingTo(q) t = bearingDMS(b, prec=4) + ', ' + compassDMS(b, form=F_DMS, prec=2) self.test('initialBearingTo', t, '233.1301°, 233°07′48.28″SW') f = p.finalBearingTo(q) t = bearingDMS(f, prec=4) + ', ' + compassDMS(f, form=F_DMS, prec=2) self.test('finalBearingTo', t, '232.8246°, 232°49′28.59″SW') # <http://github.com/maurycyp/vincenty> Maurycy Pietrzak Boston = LatLon(42.3541165, -71.0693514, datum=d) NewYork = LatLon(40.7791472, -73.9680804, datum=d) m = Boston.distanceTo(NewYork) self.test('distanceToMP', m, '298396.057', fmt='%.3f') self.test('distanceToSM', m2SM(m), 185.414, fmt='%.3f') p = LatLon(0, 0, datum=d) q = LatLon(0, 1, datum=d) m = p.distanceTo(q) self.test('distanceToMP', m, '111319.491', fmt='%.3f') q = LatLon(1, 0, datum=d) m = p.distanceTo(q) self.test('distanceToMP', m, '110574.389', fmt='%.3f') # <http://pypi.python.org/pypi/pygc> Kyle Wilcox p = LatLon(0, 50, datum=d) q = LatLon(0, 52, datum=d) m = p.distanceTo(q) self.test('distanceToKW', m, '222638.982', fmt='%.3f') q = LatLon(0, 49, datum=d) m = p.distanceTo(q) self.test('distanceToKW', m, '111319.491', fmt='%.3f') # <http://www.movable-type.co.uk/scripts/latlong-vincenty.html> # ... Test case (from Geoscience Australia), using WGS-84 FindersPeak = LatLon('37°57′03.72030″S', '144°25′29.52440″E') Buninyong = LatLon('37°39′10.15610″S', '143°55′35.38390″E') m, b, f = FindersPeak.distanceTo3(Buninyong) self.test('distanceTo3', m, '54972.271', fmt='%.3f') self.test('distanceTo3', bearingDMS(b, F_DMS), '306°52′05.37″') self.test('distanceTo3', bearingDMS(f, F_DMS), '307°10′25.07″') m, b = FindersPeak.distanceTo2(Buninyong) self.test('distanceTo2', m, '54902.390', fmt='%.3f') self.test('distanceTo2', bearingDMS(b, F_DMS), '307°04′38.41″')