簡體   English   中英

在 GeoDjango 中將多邊形層與多邊形相交

[英]Intersecting multipolygon layer with polygon in GeoDjango

I have a Region GeoDjango model (deriving from django.contrib.gis.db.models.Model ), with a geom field, which is a django.contrib.gis.db.models.MultiPolygonField .

我想計算這個 model(代表存儲在 PostGIS 中的一組多邊形區域)與 GeoJSON 多邊形“查詢”的交集:

from django.contrib.gis.geos import GEOSGeometry

query = GEOSGeometry(
    '{"type":"Polygon","coordinates":[[[-80.983786,43.929011],[-80.511513,43.778458],[-80.291852,44.079184],[-80.775108,44.232127],[-80.983786,43.929011]]]}'
)

我嘗試了很多事情:

results = Region.objects.all().intersection(query) 

或者

from django.contrib.gis.db.models.functions import Intersection

results = Intersection(Region.objects.all(), query)

但似乎我沒有正確的方法。

請注意,我不想簡單地計算與查詢相交的區域子集,而是計算它們的確切交集(換句話說,生成的多邊形集應該與查詢具有完全相同的形狀)。

本質上,我們需要用給定的query annotate每個Regiongeomintersection (如果有的話)。 使用 DB 查詢執行此操作如下所示:

from django.db.models import F
from django.contrib.gis.db.models.functions import Intersection
from django.contrib.gis.geos import GEOSGeometry

query = GEOSGeometry(
    '{"type":"Polygon","coordinates":[[[-80.983786,43.929011],[-80.511513,43.778458],[-80.291852,44.079184],[-80.775108,44.232127],[-80.983786,43.929011]]]}'
) 

results = Region.objects.filter(geom__intersects=query).annotate(
    intersection_geom=Intersection(F('geom'), query)
)

查詢說明:

  1. 使用intersects空間查找過濾與query相交Regions
  2. 使用F()表達式訪問geom計算區域的geom字段和queryIntersection的結果(關於F()用法的說明可以在我的問答示例中找到: 如何在 django 中的 Model 字段之間執行算術運算)
  3. 將計算出的 Intersection annotate到每個對應的Region中,作為名為intersection_geom的字段。

查詢執行后, results將包含與query幾何相交的每個Regionintersection_geom字段包含相應相交的確切幾何。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM