#!/usr/bin/env python # # Test gps/misc.py # # This code runs compatibly under Python 2 and 3.x for x >= 2. # Preserve this property! from __future__ import absolute_import, print_function, division import sys, gps.misc errors = 0 # values from here: https://en.wikipedia.org/wiki/Decimal_degrees#Precision # Note the wikipedia numbers are NOT ellipsoid corrected: # EarthDistanceSmall() is ellipsoid corrected. tests = [ # slow convergence ( 0.00000000, 0.00000000, 0.50000000, 179.5000000, 19936288), # failure to converge, happens at antipodal points # fall back to EarthDistanceSmall() # the real answer should be 19944127 ( 0.00000000, 0.00000000, 0.50000000, 179.7000000, 19870094), # boston to new york ( 42.3541165, -71.0693514, 40.7791472, -73.9680804, 298396), # equator 10 degree ( 0.00000000, 0.00000000, 10.00000000, 0.00000000, 1105854), ( 0.00000000, 0.00000000, 0.00000000, 10.00000000, 1113194), ( 0.00000000, 0.00000000, 10.00000000, 10.00000000, 1565109), # 23N 10 degree ( 23.00000000, 0.00000000, 33.00000000, 0.00000000, 1108210), ( 23.00000000, 0.00000000, 23.00000000, 10.00000000, 1025026), ( 23.00000000, 0.00000000, 33.00000000, 10.00000000, 1480049), # 45N 10 degree ( 45.00000000, 0.00000000, 55.00000000, 0.00000000, 1112285), ( 45.00000000, 0.00000000, 45.00000000, 10.00000000, 787967), ( 45.00000000, 0.00000000, 55.00000000, 10.00000000, 1320437), # 67N 10 degree ( 67.00000000, 0.00000000, 77.00000000, 0.00000000, 1115839), ( 67.00000000, 0.00000000, 67.00000000, 10.00000000, 435729), ( 67.00000000, 0.00000000, 77.00000000, 10.00000000, 1164036), # equator 5 degree ( 0.00000000, 0.00000000, 5.00000000, 0.00000000, 552885), ( 0.00000000, 0.00000000, 0.00000000, 5.00000000, 556597), ( 0.00000000, 0.00000000, 5.00000010, 5.00000000, 784028), # 23N 5 degree ( 23.00000000, 0.00000000, 28.00000000, 0.00000000, 553904), ( 23.00000000, 0.00000000, 23.00000000, 5.00000000, 512587), ( 23.00000000, 0.00000000, 28.00000000, 5.00000000, 747800), # 45N 5 degree ( 45.00000000, 0.00000000, 50.00000000, 0.00000000, 555902), ( 45.00000000, 0.00000000, 45.00000000, 5.00000000, 394171), ( 45.00000000, 0.00000000, 50.00000000, 5.00000000, 671179), # 67N 5 degree ( 67.00000000, 0.00000000, 72.00000000, 0.00000000, 557775), ( 67.00000000, 0.00000000, 67.00000000, 5.00000000, 218040), ( 67.00000000, 0.00000000, 72.00000000, 5.00000000, 590565), # equator 1 degree ( 0.00000000, 0.00000000, 1.00000000, 0.00000000, 110574), ( 0.00000000, 0.00000000, 0.00000000, 1.00000000, 111319), ( 0.00000000, 0.00000000, 1.00000010, 1.00000000, 156899), # 23N 1 degree ( 23.00000000, 0.00000000, 24.00000000, 0.00000000, 110751), ( 23.00000000, 0.00000000, 23.00000000, 1.00000000, 102522), ( 23.00000000, 0.00000000, 24.00000000, 1.00000000, 150659), # 45N 1 degree ( 45.00000000, 0.00000000, 46.00000000, 0.00000000, 111141), ( 45.00000000, 0.00000000, 45.00000000, 1.00000000, 78846), ( 45.00000000, 0.00000000, 46.00000000, 1.00000000, 135869), # 67N 1 degree ( 67.00000000, 0.00000000, 68.00000000, 0.00000000, 111528), ( 67.00000000, 0.00000000, 67.00000000, 1.00000000, 43619), ( 67.00000000, 0.00000000, 68.00000000, 1.00000000, 119427), # equator 10e-7 ( 0.00000000, 0.00000000, 0.00000010, 0.00000000, 0.011057), ( 0.00000000, 0.00000000, 0.00000000, 0.00000010, 0.011132), ( 0.00000000, 0.00000000, 0.00000010, 0.00000010, 0.015690), # 23N 10e-7 ( 23.00000000, 0.00000000, 23.00000010, 0.00000000, 0.011074), ( 23.00000000, 0.00000000, 23.00000000, 0.00000010, 0.010252), ( 23.00000000, 0.00000000, 23.00000010, 0.00000010, 0.015091), # 45N 10e-7 ( 45.00000000, 0.00000000, 45.00000010, 0.00000000, 0.011113), ( 45.00000000, 0.00000000, 45.00000000, 0.00000010, 0.007885), ( 45.00000000, 0.00000000, 45.00000010, 0.00000010, 0.013626), # 67N 10e-7 ( 67.00000000, 0.00000000, 67.00000010, 0.00000000, 0.011152), ( 67.00000000, 0.00000000, 67.00000000, 0.00000010, 0.004360), ( 67.00000000, 0.00000000, 67.00000010, 0.00000010, 0.011974), ] # EarthDistanceSmall for ( lat1, lon1, lat2, lon2, dist) in tests : distance = gps.misc.EarthDistanceSmall( (lat1, lon1), (lat2, lon2)) # compare to 1% diff = dist - distance max_diff = dist * 0.01 if abs( diff ) > max_diff: sys.stderr.write( \ "misc small: %.8f %.8f, %.8f %.8f, expected %.7f got %.7f\n" \ % (lat1, lon1, lat2, lon2, dist, distance)) errors += 1 else: print("OK" ) # EarthDistance for ( lat1, lon1, lat2, lon2, dist) in tests : distance = gps.misc.EarthDistance( (lat1, lon1), (lat2, lon2)) # compare to 0.001% diff = dist - distance max_diff = dist * 0.00001 if abs( diff ) > max_diff: sys.stderr.write( \ "misc large: %.8f %.8f, %.8f %.8f, expected %.7f got %.7f\n" \ % (lat1, lon1, lat2, lon2, dist, distance)) errors += 1 else: print("OK" ) if errors: sys.exit(1) else: sys.exit(0)