- PHP
- 2010-10-28 - 更新:2015-09-30
この記事は最終更新日から1年以上経過しています。
ある地点から指定した半径以内に該当する座標を絞り込みたいとき、検索に使用する値を得るサンプルです。
考え方としては、指定した半径を基に矩形を作成し、その範囲に含まれる座標を検索する、というものです。
残念ながら“指定した半径を基に作成した円の中に含まれる”ではありません。
通常は2点間の距離を算出し、半径以内に収まるかを出したほうがいいのですが、比較するデータが多い場合は1つ1つ処理しているとかなり負荷がかかります。
そのため、ざっくり検索する方法をご紹介します。
今回はPHPのコードですが、JavaScriptなど他の言語でも利用できます。
まず、算出に必要な度数毎の距離を宣言します。
// 緯度1秒の平均距離 約30.9m // 緯度35度上の緯度1秒の距離 約30.8m $lat_length = 30.9; // 緯度35度上の経度1秒の距離 約25m $lng_length = 25;
探したい範囲の半径(km)を設定します。
関数化したときに引数として受け取るようにしておくと便利です。
データ型はDouble(倍精度浮動小数点型)になります。
$radius = 5.0; //座標にて周辺の物件を探す場合の半径(km)
半径をm単位に変換します。
$rad = $radius * 1000; //半径をm単位に変換
指定した半径の範囲を取得するため、起点に加減する値を出します。
$lat_scope = number_format(($rad / $lat_length) / 3600, 6); $lng_scope = number_format(($rad / $lng_length) / 3600, 6);
北東の隅の座標
$scope_nw_lat = (起点の緯度) + $lat_scope; $scope_nw_lng = (起点の経度) + $lng_scope;
南西の隅の座標
$scope_se_lat = (起点の緯度) - $lat_scope; $scope_se_lng = (起点の経度) - $lng_scope;
検索する際は以下のようなSQL文になります。
$sql = "select * from `[TABLE NAME]` where (latitude between $scope_se_lat and $scope_nw_lat) and (longitude between $scope_se_lng and $scope_nw_lng)";
3,959 views