6

geodjangoを使用していて、データベースにポイントのコレクションがあります。特定の領域内のポイントのクエリセットを取得するには、次を使用します。

queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m))

私の質問は、通過したポイントから1つのポイント(距離が最も短いポイント)のみを返すにはどうすればよいですか?

編集

私は座標を渡し、それらを使用してPointオブジェクトを作成したいと思っていることを言及する必要があります。次に、そのポイントを原点として渡し、それに対してフィルタリングします。たとえば、私は試しました:

from spots.models import *
from django.contrib.gis.geos import *

origin = Point(28.011030, -26.029430)
distance_m = 1000

queryset = Spot.objects.filter(point__distance_lte=(origin, distance_m))
for q in queryset:
    print q.distance

このコードスニペットは私にこのエラーを与えます:

Traceback (most recent call last):
  File "<console>", line 2, in <module>
AttributeError: 'Spot' object has no attribute 'distance'

興味深いことに、私が次のことをすれば十分です。

origin = Spot.objects.get(name='Montecasino').point
distance_m = 1000

for city in Spot.objects.distance(origin):
    print(city.name, city.distance)

(u'Design Quarter Parking', Distance(m=677.347841801))
(u'Montecasino', Distance(m=0.0))
(u'Fourways', Distance(m=1080.67723755))
4

3 に答える 3

4

最後に、モデル内に保存された距離値を持つGeoDjango距離フィルターからの手がかりから収集されたソリューション-この投稿につながるクエリ。この情報から、距離クエリでメジャーパラメータを指定する必要があることがわかりました。以下のスニペットで、メジャーをDとしてインポートします。次に、それをクエリで使用します。指定しない場合、次のエラーが発生します。

ValueError: Tuple required for `distance_lte` lookup type.

私が使用した最短距離のポイントだけを取るためにorder_by('distance')[:1][0]

from spots.models import *
from django.contrib.gis.geos import *
from django.contrib.gis.measure import D

distance_m = 20000
origin = Point(28.011030, -26.029430)

closest_spot = Spot.objects.filter(point__distance_lte=(origin, D(m=distance_m))).distance(origin).order_by('distance')[:1][0]
于 2012-07-19T14:03:15.187 に答える
0
queryset = Spot.objects.distance(origin).filter(distance__lte=distance_m)
point = queryset.order_by('distance')[:1][0]

https://docs.djangoproject.com/en/dev/ref/contrib/gis/geoquerysets/#distance

于 2012-07-19T09:28:44.273 に答える
0

geodjangoを使用して場所に対して結果を並べ替える方法の例を探していたので、私のユースケースはこれに非常に近いものでした。受け入れられたソリューションは機能しましたが、ビッグデータセット(140000行以上)のパフォーマンスは非常に悪かったです。

簡単な説明:distance_lte関数は、テーブルの各行の原点までの距離を計算する必要があり、地理インデックスを利用できません。dwithin関数はそのようなインデックスを利用でき、制限が行われる前に各行の原点までの距離を実際に計算する必要がないようです。そのため、はるかに効率的です。

origin = Point(28.011030, -26.029430)
closest_spot = Spot.objects.filter(point__dwithin=(origin, 1)) \
    .distance(origin).order_by('distance')[:1][0]

dwithin関数は、地理データを度数(クエリの「1」)で処理します。

于 2016-10-03T20:47:39.693 に答える