【问题标题】:Django postgresql postgis incorrect spatial lookupDjango postgresql postgis不正确的空间查找
【发布时间】:2021-02-24 09:41:41
【问题描述】:

我有以下型号:

class Item(Model):
    lat_lng = PointField(geography=True, null=True)

Item.objects.create(lat_lng=Point(-95.864468, 36.075450))
bbox1 = (-168.3984375, 25.16517336866393, -52.03125, 75.32002523220804)
bbox2 = (-145.1953125, 25.16517336866393, -52.03125, 63.07486569058663)

bbox1 包含bbox2,但Item.objects.filter(lat_lng__coveredby=Polygon.from_bbox(bbox1)) 不返回该项目,而Item.objects.filter(lat_lng__coveredby=Polygon.from_bbox(bbox2)) 返回它。

我错过了什么吗?

更新:

如果我删除 geographic=True,那么一切正常。这个标志代表什么?

【问题讨论】:

    标签: django postgresql django-models postgis


    【解决方案1】:

    使用geography 时,使用大圆弧代替直线。对于连接边界框角的线也是如此。

    box1 包含 box2 的前提是假的。它们可能相交,但其中一个并不完全包含在另一个中。

    Box1 比 box 2 宽,所以它的南边界,表示为一个大圆弧,将比 box 2 边界向北,因此该点位于 box 1 的南边,但在 box 2 之内。

    【讨论】:

    • 那么,我需要使用 geography=False 来检查距离和覆盖范围吗?
    • 不一定...这个决定是你的,取决于你的数据和目标。您只需要注意大圆弧与直线,两者都有其用途。您可以谷歌geometry vs geography获取更多信息
    • 如果a有边界框和经纬度点,如何检查该点是否在圆内?
    • 我看过文档,但没有相关示例。
    猜你喜欢
    • 2020-08-03
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多