web-dev-qa-db-ja.com

MySQLの経度と緯度内でのクエリ

特定のコード例を尋ねる前に、次の疑似コードのようなクエリを作成できるかどうかを確認したいと思います。

緯度/経度=-特定の緯度/経度のポイントからxマイル以内にあるテーブルからアイテムを選択します

それは可能ですか?それとも、いくつかのフープをジャンプする必要がありますか?推奨できる優れたアプローチがあればすばらしいでしょう。

25
Genadinik

Haversineの式を検索する必要がありますが、良いスタートは次のとおりです。

最初のURLからの引用:

これは、37、-122座標から半径25マイル以内にある最も近い20の場所を見つけるSQLステートメントです。その行の緯度/経度とターゲットの緯度/経度に基づいて距離を計算し、距離の値が25未満の行のみを求め、クエリ全体を距離順に並べ、結果を20に制限します。マイルではなくキロメートルで検索するには、3959を6371に置き換えます。

SELECT
    id,
    ( 3959
      * acos( cos( radians(37) )
              * cos(  radians( lat )   )
              * cos(  radians( lng ) - radians(-122) )
            + sin( radians(37) )
              * sin( radians( lat ) )
            )
    )
    AS distance
FROM markers
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;
56
daroczig

この種の操作にはSpatiaLiteまたはPostGISを使用することを強くお勧めします。彼らはあなたがコードを手に入れようとしている種類の関数を組み込みました。また、MySQLには実際には存在しない空間データも適切にサポートされています。

MySQLのソリューションとは異なりますが、将来空間リクエストを続けたい場合は、より良いソリューションです。

7
TheSteve0