python-GeoDjango和SpatiaLite-过滤附近的对象
作者:互联网
我的models.py具有用户和业务模型,具有以下字段:
location = PointField(geography=True)
我正在通过Geocode服务从用户指定的地址获取Google Maps坐标(在EPSG 4326中).
然后,将其保存在上述字段中(还有EPSG 4326).
现在,我要根据用户位置获取指定半径(例如1km)内的所有Business对象:
Business.gis.filter(location__distance_lt=(request.user.location, D(km=1)))
但这不起作用,它给了我这个错误:
ValueError: SpatiaLite does not support distance queries on geometry
fields with a geodetic coordinate system. Distance objects; use a
numeric value of your distance in degrees instead.
那么,有谁知道如何正确解决这个问题?提前致谢!
解决方法:
理论:
这是与这两个有关的相当模糊的错误:
> GeoDjango dwithin errors when using django.contrib.gis.measure.D
> Geodjango distance query not retrieving correct results
由于您使用的是大地坐标系(例如EPSG 4326),因此需要以度为单位提供距离.
关于如何足够精确地将km转换为度,这是一个很好的解释:How do I convert kilometres to degrees in Geodjango/GEOS?
最后,我建议使用dwithin
.
实践:
> 1公里〜= 0.008度
>现在查询应如下所示:
Business.gis.filter(location__dwithin=(request.user.location, 0.008))
标签:geodjango,spatialite,python,django,django-orm 来源: https://codeday.me/bug/20191011/1889199.html