簡體   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