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 开始,您有一个优化的选项来解决这个查询。
假设:
Model_A
有一个名为:model_a_point
. 的几何字段
Model_B
有一个名为:model_b_poly
. 的几何字段
使用的方法:
Subquery()
,Django 1.11 中的新方法,它允许使用子查询部分定义查询。
OuterRef()
,Django 1.11 中使用的新方法:
when a queryset in a Subquery needs to refer to a field from the outer
query.
within()
,其中:
Tests if the geometry field is spatially within the lookup geometry.
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()
方法。
我有两个模型:
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 中使用的新方法:when a queryset in a Subquery needs to refer to a field from the outer query.
within()
,其中:Tests if the geometry field is spatially within the lookup geometry.
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()
方法。