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

  • 2020年3月2日
  • SQL

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

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

[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 で指定した位置情報の緯度経度から近い順にデータを取得する方法でした。
ご参考になれば幸いです。

>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG