2017-07-20 2 views
1

fand ich diesen Code auf Stack-Überlauf:Warum erzeugt diese Python-Haversine-Formel falsche Antworten?

from math import radians, cos, sin, asin, sqrt, atan2 

def haversine(lon1, lat1, lon2, lat2): 
     """ 
     Calculate the great circle distance between two points 
     on the earth (specified in decimal degrees) 
     """ 
     # convert decimal degrees to radians 
     lon1, lat1, lon2, lat2 = map(radians, [lon1, lat1, lon2, lat2]) 

     print(lon1, lat1, lon2, lat2) 

     # haversine formula 
     dlon = abs(lon2 - lon1) 
     dlat = abs(lat2 - lat1) 
     a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
     c = 2 * atan2(sqrt(a), sqrt(1-a)) 
     r = 6371 # Radius of earth in kilometers. Use 3956 for miles 
     return c * r 

Wenn ich die Funktion mit diesen Koordinaten verwenden: haversine(-94.5930, 39.1230, -94.4839, 39.1561), gibt sie 10.103458011601726.

Wenn ich diese Koordinaten durch Online-GPS-Koordinaten-Entfernungsrechner ausführen, produzieren sie alle eine Antwort rund 12 Kilometer.

Ich kann keine Unterschiede zwischen diesem Code und der Haversine Formel here gefunden nicht gefunden, so dass ich nicht weiß, warum es

Antwort

2

(in Verbindung mit dem einen) solche Antworten anders als von den Online-Rechner produzieren Zwischen Ihrer Online-Validierung und der Verwendung Ihrer Funktion mischen Sie die Reihenfolge von Längen- und Breitengrad. Diese Funktion erwartet es in lon/lat-Paaren, während lat/long die typischere Reihenfolge von Paaren ist. Ihre Beobachtung ist wiederholbar, wenn Sie sie online falsch eingeben here.

print haversine(-94.5930, 39.1230, -94.4839, 39.1561) # 10.1034580116 
print haversine(39.1230, -94.5930, 39.1561, -94.4839) # 12.1348612974 
0
from math import sin, cos, sqrt, atan2, radians 

# approximate radius of earth in km 
R = 6373.0 

lat1 = radians(-94.5930) 
lon1 = radians(39.1230) 
lat2 = radians(-94.4839) 
lon2 = radians(39.1561) 

dlon = lon2 - lon1 
dlat = lat2 - lat1 

a = sin(dlat/2)**2 + cos(lat1) * cos(lat2) * sin(dlon/2)**2 
c = 2 * atan2(sqrt(a), sqrt(1 - a)) 

distance = R * c 

print("Result:", distance) 

Ergebnis: 12,138670702897617

Verwandte Themen