2017-07-20 3 views
1

Iは、スタックオーバーフローに、このコードが見つかりました:私はこれらの座標と機能を使用する場合このPython Haversine式が間違った答えを生成するのはなぜですか?

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 

haversine(-94.5930, 39.1230, -94.4839, 39.1561)、それは10.103458011601726を返します。

私はこれらの座標をオンラインGPS座標距離計算機で実行すると、それらはすべて約12キロメートルの答えを出します。

私はこのコードとhereを発見した半正矢式との差異を見つけることができませんので、それは(リンク内のものを含む)は、オンライン電卓

答えて

2

からのものとは異なる答えを生産している理由を私は知りませんオンライン検証と関数の使用の間で、緯度と経度の順序が混ざり合っています。この関数はlon/latペアでそれを期待していますが、lat/longはより典型的なペアの順序です。 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) 

結果:12.138670702897617

関連する問題