私は答えをかなり探していましたが、正しい用語を使用していないだけかもしれません。データベースにアクセスして、ユーザーの場所から特定の距離内にいる他のユーザーのリストを返すアプリを作成しています。私はこのタイプのデータを扱ったことがないので、値が何を意味するのかよくわかりません。MySQL または PHP を使用してバックエンドですべての計算を実行したいと考えています。現在、緯度と経度を倍精度でデータベースに格納しています。それらにアクセスして保管することはできますが、距離に基づいてそれらをソートする方法がわかりません。おそらく、この分野で一般的な別のタイプまたは何らかのテクニックを使用する必要があります。ティア。
2 に答える
2セットの長/緯度座標間の距離を取得するhaversine式を使用する必要があるようです(地球の曲率を調整します)。
それを出力としてクエリを実行すると、ユーザーからの最小距離に基づいて簡単に並べ替えることができます。
これは、一般的に使用される 9 つの言語でhaversineを実装するためのリンクです。SQL クエリ内で実装する SO の質問は次のとおりです。
適応できるクエリは次のとおりです (25 マイル以内のものを、最も近いものから最も遠いものへと並べ替えて取得します)。
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;
Vincenty の方が正確であることが示されているため、Haversine Great Circle 距離の代わりにVicenty の逆式 ( http://en.wikipedia.org/wiki/Vincenty 's_formulae) を使用することをお勧めします (Vincenty は地球が偏球であると想定しています)。より正確である完全な球の。)
式の元の Vincenty 論文は次のとおりです 。 http://www.ngs.noaa.gov/PUBS_LIB/inverse.pdf - セクション 4
これは、Vincenty の逆式を使用する distanceTo(Location) の距離を計算するために使用される Android プラットフォームの実際のコードです: https://github.com/android/platform_frameworks_base/blob/master/location/java/android/location/ Location.java#L272
データベース クエリに基づいて距離を並べ替える場合、最適なパフォーマンスを得るには、空間クエリが可能な空間データベースを使用する必要があります。MySQL には空間データベース プラグインがあります: http://dev.mysql.com/doc/refman/5.0/en/spatial-extensions.html
Vicenty: Geo-Search (Distance) in PHP/MySQL (Performance)を使用した精度に関する注意事項を含め、そこから先に進むための詳細を提供するこの投稿を確認してください。