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のTEMPORARY TABLE(テンポラリテーブル)で高速化を図る方法
MySQLで5000万件ぐらいデータが入っているテーブルから日本語検索しないとい ...
-
-
MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法
MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...
-
-
MySQLにてSELECT時にdate型のカラムから年齢を計算し取得する方法
MySQLにdate型のカラムに誕生年月日が格納されており、そこから年齢を計算し ...
-
-
MySQLでテーブルとデータの複製(コピー)する方法
MySQLでテーブルとデータを複製したかった。ダンプとかではなく、簡単なSQL文 ...
-
-
MySQLで特定の値を加算しつつNULL値の場合は0にする方法
いくつかのコードに対して投票を行い、その合計値をスコアとして出したい。ただ、投票 ...