|
2008,08,04, Monday
マッシュアップで「カッテモバイル地図」を作っています。
最近は、安いガソリンスタンドを探す機能を作りましたが、この中で、見つかったGSと現在地との位置関係を表示するため、 2点の緯度経度から方角と距離を算出するプログラムを作りました。 この部分だけ、切り出すと何かの役に立つかもしれませんので、計算フォームページを作りました。 http://prog47.blogdns.org/etc/show_dist_dir.php 2点の緯度、経度から距離を求めるのは http://www.yuyuyu.jp/other/google_maps/cal/distance_disp3.php での測地線航海算法の公式を使っています。 function GeoDistance($lat1,$lng1,$lat2,$lng2,$decimal ){ // 引数 $decimal は小数点以下の桁数 if( (abs($lat1-$lat2) < 0.00001) && (abs($lng1-$lng2) < 0.00001) ){ $distance = 0; }else{ $lat1 = $lat1*pi()/180;$lng1 = $lng1*pi()/180; $lat2 = $lat2*pi()/180;$lng2 = $lng2*pi()/180; $A = 6378140; $B = 6356755; $F = ($A-$B)/$A; $P1 = atan(($B/$A)*tan($lat1)); $P2 = atan(($B/$A)*tan($lat2)); $X = acos( sin($P1)*sin($P2) + cos($P1)*cos($P2)*cos($lng1-$lng2) ); $L = ($F/8)*( (sin($X)-$X)*pow((sin($P1) + sin($P2)),2)/pow(cos($X/2) ,2) - (sin($X)-$X)*pow(sin($P1)-sin($P2),2)/pow(sin($X),2) ); $distance = $A*($X+$L); $decimal_no=pow(10,$decimal); $distance = round($decimal_no*$distance/1000)/$decimal_no; } $format='%0.'.$decimal.'f'; return sprintf($format,$distance); } 方角は http://oshiete1.goo.ne.jp/qa721140.html での回答2によります。 function GeoDir($lat1,$lng1,$lat2,$lng2){ // 緯度経度$lat1,$lng1 の点を出発として、緯度経度$lat2,$lng2への方位 // 北を0度で右回りの角度0〜360度 $Y = cos($lng2*pi()/180) * sin($lat2*pi()/180 - $lat1*pi()/180); $X = cos($lng1*pi()/180) * sin($lng2*pi()/180) - sin($lng1*pi()/180) * cos($lng2*pi()/180) * cos($lat2*pi()/180 - $lat1*pi()/180); $dirE0=180*atan2($Y, $X)/pi(); // 東向きが0度の方向 if($dirE0<0){ $dirE0=$dirE0+360; //0〜360 にする。 } $dirN0=fmod( ($dirE0+90), 360); //($dirE0+90)÷360の余りを出力 北向きが0度の方向 return ($dirN0); } というところです。 GeoDirの返り値を東西南北の言葉にするのは、省略です。
宿探しなら「JTB旅館・ホテル予約」
| http://prog47.blogdns.org/blog/index.php?e=283 | | Google Earth | 11:07 PM | comments (0) | trackback (1) | |
|
コメント
コメントする
|
|
この記事のトラックバックURL
http://prog47.blogdns.org/blog/tb.php/283
トラックバック
ジオ系を触っていて、緯度、経度から二点間の距離とその方向を計算するロジックは色々なところで必要になるので、メモ。 元記事は下で、JavaScript に書き直しただけです。 緯度、経...
| それはBlog | 2010/09/07 01:59 PM |
|

