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でデータがあれば上書き、無ければ挿入する
既存のソースを編集時に「REPLACE INTO~~」 という見たことの無いSQ ...
-
-
MySQLで「server has gone~」というエラーの対応方法
MySQLで「MySQL server has gone away」というエラー ...
-
-
MySQLでパターンマッチの逆
LIKE検索の逆ってなったのでメモ。 NOT LIKE '%あああ%' が正解み ...
-
-
PHPでmysqli関数使用時のプリペアドステートメントの利用方法
PHPでMySQLを扱う際はmysqli関数を、エスケープの際はreal_esc ...
-
-
MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)
あるシステムでMySQLの検索時に「WHERE test_column coll ...