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

4

我有两个模型:

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_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个回答

3
从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中的新方法,用于当Subquery中的查询集需要引用外部查询的字段时使用。 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
    )
)

结果和更多内容:

上面的查询将为Model_B中的每个多边形添加一个contained_points字段,该字段包含由此多边形包含的Model_A中的每个点。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接