球面上の距離

昨日は,Google Maps APIを利用して学会マップなるものを作成しました.
今日は,マップ上の任意の2点間の距離を計算する方法を考えてみました.


Google Maps APIでは,マップ上における"click"イベントを捕まえることで,任意の地点の経度,緯度情報を取得することができます.
そこで,経度,緯度情報から球面上の弧の距離を計算する方法を考えてみました.


経度とは,ロンドンの旧グリニッジ天文台を基点に±180°で等間隔に割り当てられています(参照:経度 - Wikipedia).
緯度とは,赤道を基点に±90°で等間隔に割り当てられています(参照:緯度 - Wikipedia).


経度を\alpha,緯度を\beta,地球の半径をrとし,地球の中心を原点とした極座標系を考えます.
ここから,直交座標系におけるx,y,zをそれぞれ計算すると,

x = r\cos\alpha\cos\beta
y = r\sin\alpha\cos\beta
z = r\sin\beta

となります.
これにより,任意の2点間の直線距離が求められます.
しかし,これは球面上の距離ではありません.


ここで,第2余弦定理(参照:余弦定理 - Wikipedia)により,原点から任意の2点へ引いた2本の直線(地球の中心から引くので長さrの線)に挟まれた角度θが,


任意の2点間の直線距離をdとし,
d^2 = r^2 + r^2 - 2r^2\cos\thetaより,
\cos\theta = 1 - \displaystyle \frac{d^2}{2r^2}
とあらわされます.


これにより,地球上の2点と,地球の中心とが成す角度\thetaが求められます.


以上から,任意の2点間の球面上における距離lは,
l = r\theta
となります.
(あってるかな?)


実際には,

x = \cos\alpha\cos\beta
y = \sin\alpha\cos\beta
z = \sin\beta

のように,rを乗ずることなく計算しておき,

\cos\theta = 1 - \displaystyle \frac{d^2}{2}

とすることで,はじめのものよりも,小数点以下の精度を幾分か高く保持することができます.


Webを探してみると,以下のような計算式も見つかりました(参照:).

球面三角法の公式から,
経度:x1,x2
緯度:y1,y2
とすると,
cosθ=cos(y1)*cos(y2)*cos(x1-x2) + sin(y1)*sin(y2)
(ただし,θ(rad))

2点間の距離=6369(km)*θ

により求められる.


どちらの方法で求めても,結果は同じになります.
出来上がったもの→