4

場所を保存するdjangoベースのWebアプリがあります。

Webアプリから場所を取得し、場所をWebアプリに保存するAndroidモバイルアプリがあります。場所が戻ってきて、アプリのマップオーバーレイにロードしました。

現在の座標を送信し、特定の範囲内にある場所のリストを返したいと思います。たとえば、私は自分の位置を送信し、半径 2 km 以内のアイテムを取得します。(Google Places API の仕組みと同様に、データを検索するだけです)。

場所の座標を送信し、このすべてのロジックを python django アプリで実行するのがおそらく最善です。次に、正しい場所のリストを返し、地図上に場所を表示するだけです。

これをどこから始めればよいかわかりません。特定の座標セットに基づいて、特定の半径 (km) 内に保存されている場所を除外するにはどうすればよいですか?

4

4 に答える 4

13

Haversine 方程式は、あなたの質問に対する答えです。ただし、解読するのは少し難しいので、ここで簡単な説明を提供します。

簡単に言えば:

以下は、座標 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;

SQL は任意のものに変換できます。つまり、原則は変わらないということです。

于 2012-06-05T10:30:28.220 に答える
1

最も簡単な方法は、すべての場所までの距離を計算し、特定の距離内のポイントを選択することです。検索を高速化したい場合は、場所をより洗練されたデータ構造 ( kd-treeなど) で整理できます。

于 2012-06-05T10:11:13.977 に答える
1

GeoDjangoは、これらすべての距離ルックアップを無料で提供する Postgres 用の優れた PostGIS アドオンと統合されています。

Postgres 型として保存されているモデル内に LatLong が保存されている場合、単純な ORM クエリを実行して、現在の LatLong から特定の距離内にあるすべての場所を取得できます。

GeoDjango は非常に強力で、多くのオプションがあります。指定された距離内にあるリストから場所を見つけるだけでよい場合は、距離 = sqrt(dx^2 + dy ^2)

于 2012-06-05T10:23:32.497 に答える
0

私は現在、Androidアプリでこの機能に取り組んでいます.これに出くわしました.これが役立つことを願っています. 最初はサーバーから JSON の結果を除外するつもりでしたが、これにたどり着き、Mysql が最初に認識したよりもはるかに洗練されていることに気付きました。

https://www.scribd.com/doc/2569355/Geo-Distance-Search-with-MySQL

上記のコメントは私にとってはうまくいきませんでしたが、彼らはHaversine Equationを使用してお金を稼いでいます。サーバー側でこれらのほとんどを行う方がはるかに効率的であるため、何にも使用されない情報で電話が圧倒されることはありません。それは、完全に膨らんだ 10 インチのケーキを焼いて、その 8 分の 1 をスライスし、残りを捨てるようなものです。半径 2 インチの小さなケーキを焼くだけではどうですか? それが大きな違いを生むようには思えないかもしれませんが、他の優れたプログラムと同様に、すべてが必要でない限り、必要なものだけを入手してください。

ライブ作業バージョンを使用して、独自のコードで小さなテストを実行するには、以下のリンクを使用してください。 http://sqlfiddle.com/#!2/abba1/2

この投稿がお役に立てば幸いです。

于 2014-10-10T12:54:40.927 に答える