1

バックグラウンド

座標への近さに基づいてクエリセットをフィルター処理するモデル マネージャー関数を追加したいと考えています。このブログ投稿には、私がやりたいことを正確に実行しているコードが含まれています。

コード

以下のスニペットは、削除されたgeopy関数を利用しているようです。緯度と経度の範囲を制限することで、クエリセットを大まかに絞り込みます。

    # Prune down the set of all locations to something we can quickly check precisely
    rough_distance = geopy.distance.arc_degrees(arcminutes=geopy.distance.nm(miles=distance)) * 2
    queryset = queryset.filter(
        latitude__range=(latitude - rough_distance, latitude + rough_distance), 
        longitude__range=(longitude - rough_distance, longitude + rough_distance)
    )

問題

使用されている geopy 関数の一部が削除/移動されたため、このスタンザを書き直そうとしています。しかし、私は計算を理解していません---幾何学をかろうじて通過し、私の研究は実際に私を助けたというよりも私を混乱させました.

誰でも助けることができますか?大変ありがたく存じます。

4

6 に答える 6

1

ブログからのこのコードはずさんです:

  def near(self, latitude=None, longitude=None, distance=None):
    if not (latitude and longitude and distance):
      return []

緯度==0(赤道)または経度== 0(グリニッジ子午線)の場合、すぐに戻ります。する必要がありますif latitude is None or longitude is None .......

@TokenMacGuyの答えは改善ですが、:

(a)「バウンディングボックス」の全体的な考え方は、SQLまたは同様のクエリが、クエリを満たすすべてのポイントまでの距離を計算することを回避することです。適切なインデックスを使用すると、クエリの実行速度が大幅に向上します。これは、クライアントに(1)バウンディングボックスの座標の計算(2)クエリによって返される各結果の正確な距離の計算と確認を任せるという犠牲を払って行われます。

手順2を省略すると、赤道でもエラーが発生します。たとえば、「半径5マイルのピザ屋をすべて検索する」とは、ボックスの隅から最大7.07マイル(平方根(5 * 2 + 5 * 2))離れた場所で回答が得られることを意味します。

表示するコードは、半径を任意に2倍にしているように見えることに注意してください。これは、14.1マイル離れた場所でポイントを獲得することを意味します。

(b)@TokenMacGuyが言ったように、赤道から離れると、悪化します。そのように計算されたバウンディングボックスには、関心のあるすべてのポイントが含まれているわけではありません。もちろん、半径を2倍にしてやりすぎている場合を除きます。

(c)対象の円に北極または南極のいずれかが含まれている場合、計算はひどく不正確であり、調整する必要があります。関心のある円が180度の子午線(つまり、ジグザグのない日付変更線)と交差する場合、結果はナンセンスです。このケースを検出し、2つの部分からなるクエリ(子午線の両側に1つの部分)を適用する必要があります。

問題(b)および(c)の解決策については、この記事を参照してください。

于 2010-12-01T20:31:55.623 に答える
1

地球は球体ではなく、ほぼ球体です。より正確な計算が必要な場合は、pyprojを使用してください。次に、準拠楕円体(WGS84など)に基づいて位置を計算できます。

于 2010-12-01T17:57:19.540 に答える
1

マイルは海里に変換されているように見えますdistance。海里はそれぞれ、1 分角に相当し、それぞれが 1/60 の角度です。次に、その値が 2 倍になり、特定の緯度と経度に加算および減算されます。これら 4 つの値を使用して、座標の周囲に境界ボックスを形成できます。

ウィキペディアで必要な換算係数を調べることができます。そこには、水平位置の表現というタイトルの関連記事もあり、経度と緯度の配置に代わる複雑さの一部を回避することの長所と短所について説明しています。つまり、計算で緯度と経度を別の水平位置表現に置き換える際の考慮事項についてです。

于 2010-12-01T14:48:46.723 に答える
1

スニペットが実際に何をするかという点では、マルティノーの答えは正しいですが、1 分の弧は場所によって非常に異なる距離を表すことに注意することが重要です。赤道では、クエリは直径 の円を囲む最小軸整列境界ボックスをカバーしますがdistance、赤道から離れると、境界ボックスはその円を完全には含みません。

于 2010-12-01T18:13:39.137 に答える