勉強したことのメモ

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にて直近のクエリで発行されたAUTO_INCREMENTの値を取得する方法
MySQLにて直近のクエリで発行されたAUTO_INCREMENTの値を取得する方法

やりたかったことは「MySQLで新規登録(INSERT)なら、登録時のAUTO_ ...

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

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

MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)
MySQLで全角半角を区別せずに検索する方法(collate utf8_unicode_ci)

あるシステムでMySQLの検索時に「WHERE test_column coll ...

MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方
MySQLでデータベース単位とテーブル単位のデータサイズ(容量)の調べ方

VPSの各種ファイルを整理している際に「MySQLも不要なデータを削除すればいい ...

MySQLのトリガーを使用して特定のテーブルの操作を行った際に別テーブルにログを残す方法
MySQLのトリガーを使用して特定のテーブルの操作を行った際に別テーブルにログを残す方法

MySQLにトリガーという機能があるらしくどのようなものか調べたところ、事前に「 ...