[英]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.