勉強したことのメモ

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

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

   2024/01/13  MySQL

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

  関連記事

PHPでmysqli関数使用時のプリペアドステートメントの利用方法
PHPでmysqli関数使用時のプリペアドステートメントの利用方法

PHPでMySQLを扱う際はmysqli関数を、エスケープの際はreal_esc ...

MySQLで全国の市区町村のデータを入手し、抽出する方法
MySQLで全国の市区町村のデータを入手し、抽出する方法

都道府県と市区町村が連携したセレクトメニューを作成したかった。具体的には大阪府を ...

MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法
MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法

MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...

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

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

MySQLで「Incorrect integer value: '' for column」エラーの対応方法
MySQLで「Incorrect integer value: '' for column」エラーの対応方法

MySQLで「Incorrect integer value: '' for c ...