代码之家  ›  专栏  ›  技术社区  ›  Safari

GeoDjango查询:包含在多多边形中的所有点

  •  4
  • Safari  · 技术社区  · 8 年前

    我有两种型号:

    Model_A that contains a GeoDjango Point;
    
    Model_B that contains a GeoDjnago MultiPololygon;
    

    对于Model_A中的每个元素,我必须检查该点是否包含在Model_B元素的某个m_polygon中;

    我可以做这个简单的查询。

    但我也认为: 我在Model_a中有很多元素,在Model_B中有一些元素。 因此,迭代Model_B中的所有元素并检查Model_A中是否存在包含在当前Model_B元素中的某个元素可能更有效 .

    那么,有什么方法可以进行这个GeoDjango查询吗?

    类似这样:

    Model_A.objects.filter(*point_is_contained_into*=a_model_b_mpolygon);
    

    ------------------编辑-----------------

    我试着用这个:

    result = Model_A.objects.filter(position__intersects=a_model_b_mpolygon)
    

    这对我很管用。 在我的情况下,是否有使用此类查询的禁忌症?

    1 回复  |  直到 7 年前
        1
  •  3
  •   John Moutafis Milani Igor    7 年前

    在Django版本1.11中,您有一个优化选项来解决此查询。

    假设:

    1. Model_A 具有一个名为: model_a_point .
    2. Model_B 具有一个名为: model_b_poly .

    使用的方法:

    1. Subquery() Django 1.11中的新方法,它允许使用子查询部分定义查询。

    2. OuterRef() ,Django 1.11中使用的新方法:

      当子查询中的查询集需要引用外部字段时 查询

    3. within() ,其中:

      测试几何体字段在空间上是否位于查找几何体中。

    4. annotate() ,它将为查询集中的每个项目生成一个新字段(在我们的示例中,它将包含多边形所包含的点)

    查询:

    Model_B.objects.annotate(
        contained_points=Subquery(
            Model_A.objects.filter(
                model_a_point__within=OuterRef('model_b_poly')
            )  # Ref: 1, referenced below, keep reading
        )
    )
    

    结果及其他:

    上面的查询将有一个字段 contained_points 中的每个多边形 型号_B 其中包含来自 型号_A 包含在此多边形中。

    如果只想保留这些点的几何体字段( lon, lan ),在 Subquery 调用(参考号:1),使用 values() 方法