ヒュベニの距離計算式 ↑
2点間の緯度・経度から距離を計算する ↑
- 地球の外周はざっと4万キロメートルだから、緯度経度の角度にして1度111kmってのが簡単です。でも、それは地球が完全球体であるとした場合の話で、実際にはかなりでこぼこしているらしいです。そこで、いろいろな補正を加えた、ヒュベニの式というのがあるそうなので、これを使って計算します。
- お手本はこちら、http://vldb.gsi.go.jp/sokuchi/surveycalc/bl2stf.html です。実際の式は次のようになるみたいです。これはカシミール3Dのヘルプから引用しました。
D=sqrt((M*dP)*(M*dP)+(N*cos(P)*dR)*(N*cos(P)*dR)) D: 2点間の距離(m) P: 2点の平均緯度 dP: 2点の緯度差 dR: 2点の経度差 M: 子午線曲率半径 N: 卯酉線曲率半径 M=6334834/sqrt((1-0.006674*sin(P)*sin(P))^3) N=6377397/sqrt(1-0.006674*sin(P)*sin(P))
PHPでスクリプトを作ってみる ↑
- せっかくだから、上記の式でPHPスクリプトを作ってみる。下記の2つのファイルをPHPが動くサーバーに送り込む。
-------------test01.html <html> <HEAD> <META HTTP-EQUIV="Content-Type" CONTENT="text/html;charset=euc-jp"> <TITLE>ヒュベニの距離計算</TITLE> </HEAD> <body> <BODY BGCOLOR="#FFFF99"> <p>ヒュベニの距離計算</p> <HR> <BR> <form action="test01.php" method="post"> 始点 緯度:<input type="text" name="sitenido" value="35" size="2"> 度<input type="text" name="sitenihun" value="6" size="2"> 分<input type="text" name="sitenibyou" value="2.000" size="7"> 秒(秒は小数可)<br> 始点 経度:<input type="text" name="sitenkeido" value="140" size="3"> 度<input type="text" name="sitenkeihun" value="5" size="2"> 分<input type="text" name="sitenkeibyou" value="28.000" size="7"> 秒(秒は小数可)<br> <HR> 終点 緯度:<input type="text" name="syutenido" value="35" size="2"> 度<input type="text" name="syutenihun" value="6" size="2"> 分<input type="text" name="syutenibyou" value="18.000" size="7"> 秒(秒は小数可)<br> 終点 経度:<input type="text" name="syutenkeido" value="140" size="3"> 度<input type="text" name="syutenkeihun" value="4" size="2"> 分<input type="text" name="syutenkeibyou" value="41.000" size="7"> 秒(秒は小数可)<br> <HR> <input type="submit" name="exec" value="入力データをおくる"> <BR> <input type="reset" name="exec" value="やりなおし"> </form> <HR> </body> </html>
---------test01.php <? //始点 緯度 変数の取出し $sitenido = $HTTP_POST_VARS["sitenido"]; $sitenihun = $HTTP_POST_VARS["sitenihun"]; $sitenibyou = $HTTP_POST_VARS["sitenibyou"]; //始点 経度 変数の取出し $sitenkeido = $HTTP_POST_VARS["sitenkeido"]; $sitenkeihun = $HTTP_POST_VARS["sitenkeihun"]; $sitenkeibyou = $HTTP_POST_VARS["sitenkeibyou"]; //終点 緯度 変数の取出し $syutenido = $HTTP_POST_VARS["syutenido"]; $syutenihun = $HTTP_POST_VARS["syutenihun"]; $syutenibyou = $HTTP_POST_VARS["syutenibyou"]; //終点 経度 変数の取出し $syutenkeido = $HTTP_POST_VARS["syutenkeido"]; $syutenkeihun = $HTTP_POST_VARS["syutenkeihun"]; $syutenkeibyou = $HTTP_POST_VARS["syutenkeibyou"]; //始点 緯度 度分秒を度(小数)に変換後さらにラジアンに変換 $sitenido = $sitenido + $sitenihun/60 + $sitenibyou/3600; $sirad = $sitenido*M_PI/180; // 始点 経度 度分秒を度(小数)に変換後さらにラジアンに変換 $sitenkeido = $sitenkeido + $sitenkeihun/60 + $sitenkeibyou/3600; $skrad = $sitenkeido*M_PI/180; // 終点 緯度 度分秒を度(小数)に変換後さらにラジアンに変換 $syutenido = $syutenido + $syutenihun/60 + $syutenibyou/3600; $syirad = $syutenido*M_PI/180; // 終点 経度 度分秒を度(小数)に変換後さらにラジアンに変換 $syutenkeido = $syutenkeido + $syutenkeihun/60 + $syutenkeibyou/3600; $sykrad = $syutenkeido*M_PI/180; //2点間の平均緯度を計算 $aveirad = ($sirad + $syirad)/2; //2点間の緯度差を計算 $deffirad = $sirad - $syirad; //2点間の経度差を計算 $deffkrad = $skrad - $sykrad; //子午線曲率半径を計算 $temp = 1 - 0.006674*(sin($aveirad)*sin($aveirad)); $dmrad = 6334834 / sqrt($temp*$temp*$temp); //卯酉線曲率半径を取得 $dvrad = 6377397 / sqrt($temp); //ヒュベニの距離計算式 $t1 = $dmrad * $deffirad; $t2 = $dvrad*Cos($aveirad)*$deffkrad; $d = sqrt($t1*$t1 + $t2*$t2); echo "2点間の距離は"; echo $d; echo "mです。"; ?>
- これで、上から4桁くらいは正しく計算できるようですが、5桁目以降からhttp://vldb.gsi.go.jp/sokuchi/surveycalc/bl2stf.htmlの結果と違ってくるようです。計算上の誤差でしょうか。でも、有効4桁あればたいていのことはできるので、これでよしとしましょう。