繁体   English   中英

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

[英]GeoDjango query: all point that are contained into a multi polygon

我有两个型号:

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)

这对我有用。 在我的案例中是否有使用此类查询的禁忌症?

从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在每个多边形Model_B其中包含每一点Model_A这个多边形遏制。

如果您只想在Subquery调用(Ref:1)的末尾保留这些点( lon, lan )的几何字段,请使用values()方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM