GeoDjango和SpatiaLite-过滤附近的对象

3

我的models.py有用户和商业模型,它们都有这个字段:

location = PointField(geography=True)

我正在通过Geocode服务从用户指定的地址获取Google Maps坐标(在EPSG 4326中)。
然后将其保存在上述字段中(也是EPSG 4326)。现在,我想根据用户位置,在指定半径(例如1公里)内获取所有业务对象:
Business.gis.filter(location__distance_lt=(request.user.location, D(km=1)))

但是它不起作用,它给我这个错误:

ValueError: SpatiaLite不支持在带有大地测量坐标系的几何字段上进行距离查询。距离对象;请改用度数的数字值。

那么,有人知道如何正确解决这个问题吗?提前感谢!


我不得不在查询之前将其转换为投影系统。这样做可以工作,虽然不太精确,但在我的情况下这并不是一个问题。 - softzer0
嘿,@MikiSoft,我回答有点晚了,看一下吧。 - John Moutafis
@JohnMoutafis 嘿,我很久以前就用我上面描述的方法解决了它,但是我仍然将你的答案标记为解决方案,以感谢你的努力。 :) - softzer0
1个回答

0

理论:

这是一个与以下两个相关的相当晦涩的错误:

由于您正在使用地理坐标系统(如EPSG 4326),因此您需要以度为单位提供距离。

这里有一个非常好的解释,可以准确地将公里转换为度:如何在Geodjango / GEOS中将公里转换为度?

最后我建议使用dwithin


实践:

  • 1km ~= 0.008 deg
  • 现在查询应该是这样的:

    Business.gis.filter(location__dwithin=(request.user.location, 0.008))
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接