1. ホーム
  2. パイソン

[解決済み】緯度・経度から2点間の距離を求める方法

2022-04-05 12:47:45

質問

この数式を実装してみました。 http://andrew.hedges.name/experiments/haversine/ このアプレットは、私がテストしている2つの点については良好に動作します。

しかし、私のコードはうまくいきません。

from math import sin, cos, sqrt, atan2

R = 6373.0

lat1 = 52.2296756
lon1 = 21.0122287
lat2 = 52.406374
lon2 = 16.9251681

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
print "Should be", 278.546

それが返す距離は 5447.05546147 . なぜ?

どのように解決するのか?

編集する。 なお、2点間の距離を簡単に求めるのであれば、以下の方法をお勧めします。 Kurtの回答 その根拠は彼の投稿をご覧ください。

この回答は、OPが遭遇した特定のバグに答えることだけに焦点を合わせています。


Pythonでは、すべての三角関数が ラジアン 度ではなく、度数です。

手動で数値をラジアンに変換するか、あるいは radians という関数があります。

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

# approximate radius of earth in km
R = 6373.0

lat1 = radians(52.2296756)
lon1 = radians(21.0122287)
lat2 = radians(52.406374)
lon2 = radians(16.9251681)

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)
print("Should be:", 278.546, "km")

distance が正しい値を返すようになりました。 278.545589351 kmです。