【问题标题】:GeoDjango & SpatiaLite - filtering nearby objectsGeoDjango & SpatiaLite - 过滤附近的物体
【发布时间】:2017-04-18 07:52:01
【问题描述】:

我的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 不支持几何距离查询 具有大地坐标系的字段。距离物体;用一个 以度为单位的距离数值。

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

【问题讨论】:

  • 我在进行查询之前将其转换为投影系统。它就是这样工作的,虽然它不是那么精确,但我的情况不是问题。
  • 嘿@MikiSoft,我发布的答案有点晚,看看。
  • @JohnMoutafis 嘿,我很久以前就按照上面描述的方式解决了它,但是我仍然将您的答案标记为解决方案,以感谢您的努力。 :)

标签: python django django-orm geodjango spatialite


【解决方案1】:

理论:

这是与这两个相关的一个非常模糊的错误:

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

这里有一个关于如何足够准确地将 km 转换为度数的很好的解释: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))
    

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 1970-01-01
    • 2017-03-13
    • 2020-05-18
    • 2013-12-28
    • 1970-01-01
    • 2017-10-18
    • 2021-05-07
    相关资源
    最近更新 更多