PHPで2地点の緯度経度より距離を計算する

こんにちは、さるまりんです。

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.

距離計算について読むと、地球は完全な球体ではないし、誤差はいろんなところで出てきそうですが、今回やりたかったことにはこれで十分そうでした。厳密にするとなるとどうするんでしょうね。

読んでくださってありがとうございました。

それではまた!