./topimag900x150

www.h2caster.net

Linux&LAMP PHP&MySQL GPS&PDA BikeTrial blog Others

ヒュベニの距離計算式

2点間の緯度・経度から距離を計算する

 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でスクリプトを作ってみる

 -------------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です。";
 
 ?>

Copyrite 2005 caster productions

www.h2caster.net