道のり計算方法について    update:09Feb2010 >>TOP       

Google Maps API で各地点の緯度・経度を容易に調べることが可能になった。
そこで,次に知りたくなるのは2点間の距離(その延長が道のり)であるが,幸いにも Google Map の Ver.2 からは distanceFrom を使えば目的は達成できる。約0.3%の誤差があるそうだ。

しかし,距離の計算方法について知りたいという興味にかられはまってしまった。
緯度・経度が判れば距離を求められるはず。調べてみると楕円体での計算となり少し面倒な数式を使う必要があり,理解しプログラムを組むのに未熟な自分には難問だった。

理解するには,昔?勉強した数学(三角関数,偏微分)が必要だった。
以下で示されている道のりにおいて

  (1) は Google の distanceFrom,
  (2) は楕円体における地表面距離計算(PHP版計算プログラム・サンプル),
  (3) は測地線航海算法の公式(PHP版計算プログラム・サンプル),

を使用して計算した結果を比較表示したもの。
(3)の式が間違っていたので一部修正しました(09Feb2010)。


     
    マウスの位置(緯度,経度):?

   道のり0:0.000 [ km ]  ----- (1)
   道のり1:0.000 [ km ]  ----- (2)
   道のり2:0.000 [ km ]  ----- (3)


(2)は
d = 2・N・ψ

ここに,
地点1の緯度φ1,経度λ1,地点2の緯度φ2,経度λ2のときの直交座標地を
それぞれ (x1,y1,z1),(x2,y2,z2) とすると2地点間の直距離 Rn

Rn = sqrt{ (x2 - x1)2 + (y2 - y1)2 + (z2 - z1)2 }

A = 6378140m(地球赤道半径),B = 6356755m(地球極半径),e2 = (A2 - B2)/A2 e:離心率

N1 = A/sqrt(1 - e2・sin2φ1),  N2 = A/sqrt(1 - e2・sin2φ2)
x1 = N1・cosφ1cosλ1,           x2 = N2・cosφ2cosλ2
y1 = N1・cosφ1sinλ1,            y2 = N2・cosφ2sinλ2
z1 = N1・(1 - e2)sinφ1,          z2 = N2・(1 - e2)sinφ2

中心から2地点を見込んだ中心角の半分の角 ψ は

ψ = sin-1( (Rn/2)/N ),   N = (N1 + N2)/2

ただし,計算に使用した緯度・経度はラジアンに変換。標高は無視して計算。


(3)は
d = A・(X + ⊿ρ)

ここに,
地点1の緯度φ1,経度λ1,地点2の緯度φ2,経度λ2のときそれぞれの化成緯度 Φ1,Φ2

Φ1 = tan-1(B/A・tanφ1), Φ2 = tan-1(B/A・tanφ2)

A = 6378140m(地球赤道半径),B = 6356755m(地球極半径),F = (A - B)/A, F:偏平率
球面上の距離 X は

X = cos-1{ sinΦ1・sinΦ2 + cosΦ1・cosΦ2・cos(λ1 - λ2) }

Lambert-Andoyer Correction ⊿ρ は

⊿ρ = F/8・{ (sinX - X)・(sinΦ1 + sinΦ2)2/cos2(X/2) - (sinX + X)・(sinΦ1 - sinΦ2)2/sin2(X/2) }

ただし,計算に使用した緯度・経度はラジアンに変換