サンプル・プログラム
サンプル・プログラムの解説
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: }

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

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

押下されたボタンの種類に応じ、リセット処理、距離計算処理、パラメータ入力処理の 3 つに分かれるが、表示部分の HTML は共用している。
参考サイト
- 位置に関するメタデータとその応用
- ヒュベニの距離計算式(カシミール 3D)
- ヒュベニの距離計算式(www.h2caster.net)
- php で wgs84 の緯度(+43.3.14.112 みたいな)、経度(141. 22. 36. 912 のような)で A緯度,A経度と B緯度,B経度 2 点の距離をメートルで求めるのコードを探しています(人力検索はてな)