如何使用geodjango返回距离点最近距离的记录?

时间:2012-07-19 08:52:46

标签: django geodjango

我正在使用geodjango并在我的数据库中有一个点集合。要获取某个区域内的点的查询集,我使用:

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

我的问题是如何才能从我通过的点返回一个点(最低距离点)?

修改

我应该提一下,我正在传递坐标,并希望用它们创建一个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))

3 个答案:

答案 0 :(得分:4)

最后,从GeoDjango distance filter with distance value stored within model - query的线索收集了一个解决方案,引导我进入post。根据这些信息,我能够在距离查询中收集必须指定 度量参数。 您将在下面的代码段中看到,我将度量导入为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]

答案 1 :(得分: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

答案 2 :(得分: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函数使用度数中的地理数据(&#34; 1&#34;在查询中)。