0

ユーザーが緯度/経度と半径を指定できるようにするクエリを実行する方法を知っている人はいますか?次に、緯度経度 + 半径を持つ非常に大量の場所を検索し、重複があるかどうかを確認します。次に、距離によるソートを許可しますか?

企業が事業を展開している郊外の地図にマーカーを配置し、半径を指定できるようにするよう求められていますが、これを実行するクエリを Google で見つけることができません。

私は現在、仕事をする次のクエリを使用しています。

(SELECT ( 6371.01 * acos( cos( radians( $lat ) ) * cos( radians( location.lat ) ) 
 cos( radians( location.lng ) - radians( $lng ) )
 sin( radians( $lat ) ) * sin( radians( location.lat ) ) ) ) AS distance
FROM location 
HAVING distance <= $radius 
ORDER BY distance ASC) as distance

しかし明らかに、これは場所が半径を持つことを許可しません。

この質問の 2 番目の部分です。この検索クエリはすでに非常に大きなクエリの一部です。これを最適化するための推奨事項はありますか? 上記のようなクエリの例をグーグルで検索するたびに、このクエリがどれほど高価であるかについて警告する人が常にいました。現時点で考えられる唯一の解決策は、別の検索サーバーを用意することです。

4

1 に答える 1

1

非常に簡単な答え: mySQL で空間ジオメトリ関数を使用します ( http://dev.mysql.com/doc/refman/5.5/en/spatial-extensions.html )

これらはしばらく前から存在していましたが、5.6 でアップグレードされ、選択が簡単になりました。http://www.percona.com/blog/2013/10/21/using-the-new-spatial-functions-in-mysql-5-6-for-geo-enabled-applications/に詳細があります。

5.6 がない場合は、「グリッド」システムを使用してください。基本的に、ポイント (x,y) を保存するときは、より大きな正方形をカバーするグリッド識別子 (X,Y) も保存します。近くの他のポイントを検索すると、グリッド (X-1 から X+1) および (Y-1 から Y+1) 内にあることがわかります。これにより、検索に必要なポイントの数が減ります。次に、x と y の両方の実際の差が mySQL の正方形の範囲内にあることを確認し、それを大幅に減らしたら、cos/sin の計算を行います。

于 2014-09-12T07:23:04.487 に答える