12

私は次のモデルを持っています。

class Location(models.Model):
    name = models.CharField(max_length = 128, blank = True)
    address =models.CharField(max_length = 200, blank= True)
    latitude = models.DecimalField(max_digits=6, decimal_places=3)
    longitude = models.DecimalField(max_digits=6, decimal_places=3)

    def __unicode__(self):
        return self.name

現在の緯度と経度が次の場合:

current_lat = 43.648
current_long = 79.404

私はいくつかの調査を行い、2 つの位置座標間の距離を計算するHaversine 方程式に出会いました。以下は私が見つけた方程式です:

import math

def distance(origin, destination):
    lat1, lon1 = origin
    lat2, lon2 = destination
    radius = 6371 # km

    dlat = math.radians(lat2-lat1)
    dlon = math.radians(lon2-lon1)
    a = math.sin(dlat/2) * math.sin(dlat/2) + math.cos(math.radians(lat1)) \
        * math.cos(math.radians(lat2)) * math.sin(dlon/2) * math.sin(dlon/2)
    c = 2 * math.atan2(math.sqrt(a), math.sqrt(1-a))
    d = radius * c

    return d

半径 10 km 以内にあるすべての Location オブジェクトを返したいのですが、この半径 10 km 以内にあるすべての Location オブジェクトのみを返すようにフィルタリングするにはどうすればよいですか?

LocationsNearMe = Location.objects.filter(#This is where I am stuck)

とにかく、Haversine 方程式をフィルタリングに実装して、半径 10 km 以内の位置オブジェクトのみを返すようにすることはできますか?

詳細な回答を探しています。助けに感謝します。

4

3 に答える 3

12

ただし、前のステップの結果をフィルタリングすることで、Brian によって提案されたアプローチをいつでも改善できます (これは、より小さなサブセットにする必要があります)。それぞれについて、半径内にあるかどうかを確認します。

あなたのユーザーは黒点です。ブライアンによって与えられた二乗近似は、緑だけでなくオレンジ色の点も返します。距離の相違は、最悪の場合、ユーザーが予想よりも sqrt(2) 倍 (距離の 40% 余分に) 移動しなければならない場合に、重大になる可能性があります。そのため、すべてのオレンジ色と緑色のポイントについて、ブラック ポイント (たとえば、都市でのナビゲーションなど、これが実際に短い距離である場合はユークリッド) からの距離が、想定される半径よりも大きくないかどうかを確認する価値があります。

ここに画像の説明を入力

アップデート:

Haversine 距離を使用したい場合、または (より良い) GeoDjango hava について言及したい場合は、このスニペットを見て、近くの検索を扱う 2 つの Django ビューを比較してください。

https://gist.github.com/andilabs/4232b463e5ad2f19c155

于 2014-01-29T11:12:40.047 に答える