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のバイナリログ(/var/lib/mysql/binlog)を適切に削除する方法
レンタルしているVPS内のファイルを整理していると「/var/lib/mysql ...
-
-
SSH接続でMySQLにダンプファイルをインポートする方法
phpMyAdminやAdminerが入っていなかったり、ダンプファイルのサイズ ...
-
-
MySQLで歯抜けになっているint型の数値を取得する
MySQLで歯抜けになっているシーケンス番号を 取得したいケースがあった。 ■ソ ...
-
-
MySQLで月別に集計を行う。あと日付時刻関数。
現在進行形でやっているデータ集計系だけど 新たな発見があったのでメモ。 ■日付時 ...
-
-
adminerでMySQLに接続しようとするとエラーになる場合の対応方法
新しく構築したサーバにadminerを入れて接続しようとすると、「mysqlnd ...