勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ

MySQLで経度緯度から半径○Kmのデータを抽出する方法

   2024/01/13  MySQL / MariaDB

経度と緯度を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

http://blog.asial.co.jp/473

 

予約語

https://dev.mysql.com/doc/refman/5.6/ja/reserved-words.html

 - MySQL / MariaDB

  関連記事

MySQLのTEMPORARY TABLE(テンポラリテーブル)で高速化を図る方法
MySQLのTEMPORARY TABLE(テンポラリテーブル)で高速化を図る方法

MySQLで5000万件ぐらいデータが入っているテーブルから日本語検索しないとい ...

MySQLのREGEXPで半角記号を検索したい場合の対応方法
MySQLのREGEXPで半角記号を検索したい場合の対応方法

MySQLのREGEXPで半角記号を検索したい場合\\を付けてエスケープしないと ...

MySQLのintのカラムで2147483647の値
MySQLのintのカラムで2147483647の値

MySQLでintのカラムに数値を入れると「2147483647」という値になっ ...

MySQLでサイズの大きいファイルをインポートする際の注意点
MySQLでサイズの大きいファイルをインポートする際の注意点

MySQLでサイズの大きい(3GBほどの)dumpファイルを異なるサーバに移行し ...

MySQLが起動も再起動もできない際の対応方法
MySQLが起動も再起動もできない際の対応方法

サイトで障害が発生した。FTPやSSH接続は出来るけどサイト自体は表示されない。 ...