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
予約語
関連記事
-
-
phpmyadminからプロセスの停止
重たいSQL文を叩いた際、どうにも処理できず メモリ使用率が100%から下がらな ...
-
-
MySQLでLIKE検索時に大文字・小文字・半角・全角全て区別したい
以前にMySQLであいまい検索時に大文字小文字は区別しないが、それ以外は全て区別 ...
-
-
MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法
MySQLにdate型のカラムに誕生年月日が格納されており、そこから和暦を計算し ...
-
-
MySQLでphpMyAdminやAdminer上だけ文字化けする場合の対応方法
レンタルサーバーのプログラムでWebページ上では文字化けしていないのに、phpM ...
-
-
MySQLでユニークキーをはる
MySQLでseqとcodeみたいなものをあわせて ユニークキーをはりたかった。 ...