浜松のWEBシステム開発・スマートフォンアプリ開発・RTK-GNSS関連の開発はお任せください
株式会社シーポイントラボ
TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:静岡県浜松市中区富塚町1933-1 佐鳴湖パークタウンサウス2F

【MySQL】指定した緯度経度からの距離が近い順にデータを取得する

今後も使うことがありそうなので、備忘録としてまとめ。
タイトル通り、指定した位置情報の緯度経度から近い順にデータをソートして取得する方法です。
なお当然ですが、緯度経度の項目がテーブルに存在している必要があります。

今回参考にさせていただいた記事はこちらから。

[MySQL]指定した緯度経度を中心に指定半径内のスポットデータを近い順に取得する(geometry型不使用編)
https://qiita.com/yangci/items/dffaacf424ebeb1dd643

 

実行する SQL 文はこんな感じです。

SELECT
  spot_name,
  X(spot_latlng) as lat,
  Y(spot_latlng) as lng,
  (
    6371 * acos(
      cos(radians([中心座標の緯度]))
      * cos(radians(X(report_latlng)))
      * cos(radians(Y(report_latlng)) - radians([中心座標の経度]))
      + sin(radians([中心座標の緯度]))
      * sin(radians(X(report_latlng)))
    )
  ) as distance
FROM
  spots
ORDER BY
  distance
LIMIT 10

ポイントは 5~13 行目で、ここで指定した緯度経度からの距離を計算しています。
取得したデータの項目名は distance にしています。
あとは、この項目で昇順に並び替えれば、距離が近い順にデータを取得することができます。

なお、spot_latlng というカラムは、Geometry 型 で想定していますので、ここから緯度経度を取得する場合は、X(spot_latlng)Y(spot_latlng) とする必要があります。
また、それぞれの項目名は lat と lng に変更しましたが、変える必要がなければそのままでも問題はありません。

そして、最初の 6371 という値を 3959 に変更すれば、距離の単位をマイルで取得することもできます。
サンプルでは、キロメートルで取得しています。
こちらはお好みで変更してください。

 

以上、MySQL で指定した位置情報の緯度経度から近い順にデータを取得する方法でした。
ご参考になれば幸いです。

  • この記事いいね! (0)