/ / Djangoモデルプロパティジオ距離 - django

Djangoモデルプロパティジオ距離 - django

私はDjangoとPostgresqlを使って緯度と経度に基づいて近接検索を実装しようとしています。ここには私が持っているモデルの抽象版があります。

class Item(models.Model):
"""docstring for Item"""
uuid = UUIDField(primary_key=True, auto=True)
name = models.CharField(_("name"), max_length=200)
address = models.CharField(_("street address"), max_length=255, blank=True, null=True)
location = models.CharField(_("location"), max_length=40, blank=True, null=True)

@property
def geo_distance(self, location=None):
if location is not None:
cursor = connection.cursor()
cursor.execute("SELECT geo_distance(CAST("%s")) AS POINT, CAST("%s") AS POINT)" %
self.location, location)
return round(float(cursor.fetchone() * 1.621371192237), 2)

私はこのようなことをviews.pyでやりたいと思っています:

items = Item.objects.filter(name__istartwith="Anything")
results = []
for item in items:
results.append({
"name": item.name,
"distance": item.geo_distance("(11.23123, -12.123213)")
})

私はこれが最善の方法ではないことを認識しています。どんな提案も大歓迎です。

回答:

回答№1は2

緯度と経度に基づいた検索をお勧めします ジオジャンゴ。ポイントXから2つのポイントまたはその周辺エリアまでの距離を計算するには、 Haversine式。距離計算を書く方が良いでしょう。 手順。私の知る限り、djangoは作成をサポートしていません手順、私は距離を計算する面でいくつかのベンチマークを作った、私は高速ではなく、ジャンゴエンドで計算する手順を見つけた。がんばろう。


回答№2の場合は1

まあ、あなたのコードは恐ろしいことではありません。 item.geo_distance()が繰り返し実行されたためにパフォーマンスに懸念があると思いますか?問題はありませんが、これはしばらくの間計算される必要があります。ソリューションは問題ありませんが、ここではいくつかの参考になります:

  • geopy(またはgeodjango)を使用する
  • ソース(データベース)でデータをフィルタリングしてください。

第2のポイントについては、データをフィルタリングしてください。 私はあなたが名前でフィルタリングしていることを知っています。つまり、あなたは距離を使ってフィルタリングしません。ある点からの距離をフィルタとして使用したい場合(たとえば、40マイル以上)、ジオピーとジオジャンゴが助けることができるいくつかの新しい問題が発生します。ここでの一般的な解決策は、距離を(正方形で)近似し、この近似に基づいてデータをフィルタリングし、正確な距離を計算することです。