こんにちは、さるまりんです。
2地点の緯度経度よりその間の距離を計算する関数を作ります。
距離の計算にはこちらのサイトの
地点A(経度x1, 緯度y1)、地点B(経度x2, 緯度y2)とすると
2点間距離=rcos-1(sin(y1)sin(y2)+cos(y1)cos(y2)cos(x2-x1))になります。
の式を使わせてもらっています。
地球の半径は赤道半径の6378.137kmとして球面三角法で計算します。
関数です。
function distance($points) {
// 地球の半径 (赤道半径)
$r = 6378.137;
// それぞれを°(度)からrad(ラジアン)に
$x1 = deg2rad($points[0][1]);
$y1 = deg2rad($points[0][0]);
$x2 = deg2rad($points[1][1]);
$y2 = deg2rad($points[1][0]);
// 公式を適用
return $r * acos(sin($y1) * sin($y2) + cos($y1) * cos($y2) * cos($x2 - $x1));
}
引数の$points
は緯度経度を[緯度, 経度]で2地点分持っています。
以下の2点間の距離を出してみます。
東京駅
35.68141918235243, 139.76739838183735
阪神甲子園球場
34.721367285227274, 135.36216055346574
呼び出し部のコードです。
$points = [
[35.68141918235243, 139.76739838183735], // 東京駅の緯度経度
[34.721367285227274, 135.36216055346574] // 阪神甲子園球場の緯度経度
];
// 結果を出力
echo "distance: " . distance($points) . " km.\n";
実行するとこうなります。
distance: 414.67585190353 km.
距離計算について読むと、地球は完全な球体ではないし、誤差はいろんなところで出てきそうですが、今回やりたかったことにはこれで十分そうでした。厳密にするとなるとどうするんでしょうね。
読んでくださってありがとうございました。
それではまた!