GeoDjango & SpatiaLite - 过滤附近的物体

GeoDjango & SpatiaLite - filtering nearby objects

我的 models.py 有包含此字段的用户和业务模型:

location = PointField(geography=True)

我正在通过地理编码服务从用户指定的地址获取 Google 地图坐标(在 EPSG 4326 中)。
然后我将它保存在上面的字段中(也是 EPSG 4326)。

现在,我想要的是根据用户位置获取指定半径(例如 1 公里)内的所有业务对象:

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

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

关于如何足够准确地将千米转换为度数,这里有一个很好的解释:How do I convert kilometres to degrees in Geodjango/GEOS?

最后我建议使用 dwithin.


实践:

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

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