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

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

サンプル・プログラム

プログラムを実行する

ダウンロード(PHP4/5共用)

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

0100: /**
0101:  * 2地点間の直線距離を求める(Hubenyの簡易式による;日本測地系!)
0102:  * @param string $a A地点の緯度経度(日本語またはExxx.xx.xxNxx.xx.xx表記)
0103:  * @param string $b B地点の緯度経度(日本語またはExxx.xx.xxNxx.xx.xx表記)
0104:  * @return double 直線距離(メートル)
0105: */
0106: function calc_distance($a$b) {
0107:     //A地点の経度・緯度を小数に
0108:     preg_match("/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/", $a$regs);
0109:     $a_long = $regs[1] + $regs[2] / 60 + $regs[3] / 3600 + $regs[4] / 36000;
0110:     $a_lati = $regs[5] + $regs[6] / 60 + $regs[7] / 3600 + $regs[8] / 36000;
0111: 
0112:     //B地点の経度・緯度を小数に
0113:     preg_match("/E(\d+)\.(\d+)\.(\d+)\.(\d+)N(\d+)\.(\d+)\.(\d+)\.(\d+)/", $b$regs);
0114:     $b_long = $regs[1] + $regs[2] / 60 + $regs[3] / 3600 + $regs[4] / 36000;
0115:     $b_lati = $regs[5] + $regs[6] / 60 + $regs[7] / 3600 + $regs[8] / 36000;
0116: 
0117:     //ラジアンに変換
0118:     $a_long = deg2rad($a_long);
0119:     $a_lati = deg2rad($a_lati);
0120:     $b_long = deg2rad($b_long);
0121:     $b_lati = deg2rad($b_lati);
0122: 
0123:     $latave = ($a_lati + $b_lati) / 2;
0124:     $latidiff = $a_lati - $b_lati;
0125:     $longdiff = $a_long - $b_long;
0126: 
0127:     //子午線曲率半径
0128:     $meridian = 6334834 / sqrt(pow(1 - 0.006674 * sin($latave) * sin($latave), 3));        //日本測地系
0129:     //$meridian = 6335439 / sqrt(pow(1 - 0.006694 * sin($latave) * sin($latave), 3));      //世界測地系
0130: 
0131:     //卯酉線曲率半径
0132:     $primevertical = 6377397 / sqrt(1 - 0.006674 * sin($latave) * sin($latave));       //日本測地系
0133:     $primevertical = 6378137 / sqrt(1 - 0.006694 * sin($latave) * sin($latave));       //世界測地系
0134: 
0135:     //Hubenyの簡易式
0136:     $x = $meridian * $latidiff;
0137:     $y = $primevertical * cos($latave) * $longdiff;
0138: 
0139:     return sqrt($x * $x + $y * $y);
0140: }

日本語表記の住所を緯度経度に変換する処理は、「日本語の住所から緯度経度を求めるプログラム」とほぼ同じである。2 地点間の緯度経度が分かれば、直線距離を求めることができる。
space
直線距離 といっても、地球は丸いので、ピタゴラスの定理が適用できるわけではない。球面三角法によって求める必要がある。
理論的な部分は「位置に関するメタデータとその応用」を参照していただくとして、ここでは簡便な解法である「Hubeny の簡易式」を利用し、ユーザー関数 calc_distance をコーディングした。
space
このユーザー関数 calc_distance日本測地系に準拠している。Google マップのように世界測地系の座標系を利用する場合には、コメントアウトしてある計算式を使ってほしい。
space
押下されたボタンの種類に応じ、リセット処理、距離計算処理、パラメータ入力処理の 3 つに分かれるが、表示部分の HTML は共用している。

参考サイト

参考書籍

(この項おわり)
header