MySQLで経度緯度から半径○Kmのデータを抽出する方法
2024/01/13
経度と緯度をtext型として格納しているMySQLのテーブルがあり、指定した経度緯度から半径○kmのデータ一覧を抽出したかった。以下に方法をメモ。
ソース
$km = 1; //半径km。半径500mを出したい場合は0.5にする
$sql = '
SELECT
*,
(6371 * ACOS(
COS(RADIANS(緯度))
* COS(RADIANS(lat))
* COS(RADIANS(`long`) - RADIANS(経度))
+ SIN(RADIANS(緯度))
* SIN(RADIANS(lat))
)) AS distance
FROM
table
WHERE status = 1
HAVING
distance <= ' . $km . '
ORDER BY
distance
';
SQL文内のlongを`(アクサングラーブ)で囲んでいるのは予約語に当たるため。
その他
最初は経度と緯度から0.001ずつぐらい引いたり足したりして抽出したけどかなり位置情報が偏った。今回の方法はきっちりと指定した経度緯度を中心に抽出できた。
尚、経度緯度をMySQLで扱う場合はfloatやtextではなくgeometryを使うのが良いっぽい。
参考サイト
https://www.firstlogic.co.jp/blog/lab/raku/71
予約語
関連記事
-
-
MySQLでグループ化したものを条件で絞る(HAVING)
正規化したテーブルがあってその中には idとtagのカラムがある。 でtagの方 ...
-
-
MySQLでIPを整数値としてカラムに格納する
MySQLでIPを整数値としてカラムに格納しているケースがあった。今までIPが必 ...
-
-
mysqldumpが使えないレンタルサーバでMySQLのバックアップ
mysqldumpが使えないレンタルサーバで開発を行うことがあり、尚且つ他社に使 ...
-
-
mysqlで正規化できない時はシリアライズ使う
アンケートか何かに機能追加している際、配列を カンマ区切りで結合して文字列でDB ...
-
-
MySQLでテーブルとデータの複製(コピー)する方法
MySQLでテーブルとデータを複製したかった。ダンプとかではなく、簡単なSQL文 ...