123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123 |
- #!/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
- import 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
- # 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
- if errors:
- print("test_misc.py: failed")
- sys.exit(1)
- else:
- print("test_misc.py: OK")
- sys.exit(0)
|