[英]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版开始,您有一个优化的选项来解决此查询。
假设:
Model_A
有一个名为: model_a_point
的几何字段。 Model_B
有一个名为: model_b_poly
的几何字段。 使用的方法:
Subquery()
,Django 1.11中的新方法,允许使用子查询部分定义查询。
OuterRef()
,Django 1.11中使用的新方法:
当子查询中的查询集需要引用外部查询中的字段时。
within()
,其中:
测试几何字段是否在查找几何体中空间上。
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.