gpt4 book ai didi

python - 使用 django.contrib.gis.measure.D 时出现 GeoDjango dwithin 错误

转载 作者:行者123 更新时间:2023-11-29 12:37:41 24 4
gpt4 key购买 nike

首先:RHEL 6.5 上的 Python 2.7.6、Django 1.6.5、Postgres 9.3.4、PostGIS 2.1.3、psycopg2 2.5.3

这是相关模型:

class Location(models.Model):
name = models.CharField(max_length=255)
geometry = models.MultiPolygonField(blank=True, default=None, null=True)
objects = models.GeoManager() # override the default manager with a GeoManager instance
parent = models.ForeignKey('self', blank=True, default=None, null=True)

def __unicode__(self):
return self.name

这个查询应该有效 according to the docs :

touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, D(km=5)))
logging.debug(type(touching_locations))
logging.debug(len(touching_locations))

但事实并非如此。第一个调试调用有效,但第二个调用抛出 ValueError:

<class 'django.contrib.gis.db.models.query.GeoQuerySet'>
ValueError: Only numeric values of degree units are allowed on geographic DWithin queries.

如果我通过将 D(km=5) 更改为 5 来做一些小改动:

touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, 5))
logging.debug(type(touching_locations))
logging.debug(len(touching_locations))

突然间它起作用了。我得到的输出是这样的:

<class 'django.contrib.gis.db.models.query.GeoQuerySet'>
54

有谁知道为什么这没有按预期工作?这可能是一个错误,还是我犯了一个我没有看到的错误?

[编辑]
我认为这可能是一个 Django 错误。我继续开了票here .一旦我弄清楚正确的解决方法是什么,我就会在此处添加答案。

最佳答案

我收到了对我提交的工单的回复 ( https://code.djangoproject.com/ticket/22830 )。显然,我发现了一个看似未记录(或至少未明确记录)的问题,即 dwithin 查询与 Distance 对象有关。一位开发者这样说:

As your objects are in geographic coordinates (geometry fields default to WGS84), you have to provide the distance as degree units. This is for example matching the PostGIS definition:

boolean ST_DWithin(geometry g1, geometry g2, double precision distance_of_srid);

distance_of_srid being degrees for WGS84. So the 5 that works in your example means 5 degrees, not 5 km!

看起来他们要澄清文档以使这一点更清楚(太棒了!)。

因为我想要的是5km,所以我需要把5km换算成度数。 1 度约为 111.325 公里。因此,1 公里 = 1/111.325 度。因此,5 公里大约为 0.0449 或大约 0.05 度。所以我只需要将调用更改为:

touching_locations = Location.objects.filter(geometry__dwithin=(location.geometry, 0.05))

关于python - 使用 django.contrib.gis.measure.D 时出现 GeoDjango dwithin 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24194710/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com