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 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, 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″')