6

我正在使用 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))
4

3 回答 3

4

最后,从GeoDjango 距离过滤器的线索中收集了一个解决方案,其中距离值存储在模型查询中,这使我看到了这篇文章。从这些信息中,我能够收集到您必须在距离查询中指定测量参数。您将在下面的代码段中看到,我将measure 导入为 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 回答