PHPで2地点間の直線距離を求める

(1/1)
今回は、「日本語の住所から緯度経度を求めるプログラム」の発展形として、2 地点間の直線距離を求めるプログラムを作ってみることにする。

サンプル・プログラム

サンプル・プログラムの解説

0175: /**
0176:  * 2地点間の直線距離を求める(Hubenyの簡易式による;日本測地系!)
0177:  * @param string $a A地点の緯度経度(日本語またはExxx.xx.xxNxx.xx.xx表記)
0178:  * @param string $b B地点の緯度経度(日本語またはExxx.xx.xxNxx.xx.xx表記)
0179:  * @return double 直線距離(メートル)
0180: */
0181: function calc_distance($a$b) {
0182:     //A地点の経度・緯度を小数に
0183:     preg_match("/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/", $a$regs);
0184:     $a_long = $regs[1] + $regs[2] / 60 + $regs[3] / 3600 + $regs[4] / 36000;
0185:     $a_lati = $regs[5] + $regs[6] / 60 + $regs[7] / 3600 + $regs[8] / 36000;
0186: 
0187:     //B地点の経度・緯度を小数に
0188:     preg_match("/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/", $b$regs);
0189:     $b_long = $regs[1] + $regs[2] / 60 + $regs[3] / 3600 + $regs[4] / 36000;
0190:     $b_lati = $regs[5] + $regs[6] / 60 + $regs[7] / 3600 + $regs[8] / 36000;
0191: 
0192:     //ラジアンに変換
0193:     $a_long = deg2rad($a_long);
0194:     $a_lati = deg2rad($a_lati);
0195:     $b_long = deg2rad($b_long);
0196:     $b_lati = deg2rad($b_lati);
0197: 
0198:     $latave = ($a_lati + $b_lati) / 2;
0199:     $latidiff = $a_lati - $b_lati;
0200:     $longdiff = $a_long - $b_long;
0201: 
0202:     //子午線曲率半径
0203:     $meridian = 6334834 / sqrt(pow(1 - 0.006674 * sin($latave) * sin($latave), 3));        //日本測地系
0204:     //$meridian = 6335439 / sqrt(pow(1 - 0.006694 * sin($latave) * sin($latave), 3));      //世界測地系
0205: 
0206:     //卯酉線曲率半径
0207:     $primevertical = 6377397 / sqrt(1 - 0.006674 * sin($latave) * sin($latave));       //日本測地系
0208:     $primevertical = 6378137 / sqrt(1 - 0.006694 * sin($latave) * sin($latave));       //世界測地系
0209: 
0210:     //Hubenyの簡易式
0211:     $x = $meridian * $latidiff;
0212:     $y = $primevertical * cos($latave) * $longdiff;
0213: 
0214:     return sqrt($x * $x + $y * $y);
0215: }

日本語表記の住所を緯度経度に変換する処理は、「日本語の住所から緯度経度を求めるプログラム」とほぼ同じである。2 地点間の緯度経度が分かれば、直線距離を求めることができる。

直線距離 といっても、地球は丸いので、ピタゴラスの定理が適用できるわけではない。球面三角法によって求める必要がある。
理論的な部分は「位置に関するメタデータとその応用」を参照していただくとして、ここでは簡便な解法である「Hubeny の簡易式」を利用し、ユーザー関数 calc_distance をコーディングした。

このユーザー関数 calc_distance日本測地系に準拠している。Google マップのように世界測地系の座標系を利用する場合には、コメントアウトしてある計算式を使ってほしい。

押下されたボタンの種類に応じ、リセット処理、距離計算処理、パラメータ入力処理の 3 つに分かれるが、表示部分の HTML は共用している。

参考サイト

(この項おわり)
header