在 GeoDjango 中将多多边形层与多边形相交

Intersecting multipolygon layer with polygon in GeoDjango

我有一个 Region GeoDjango 模型(派生自 django.contrib.gis.db.models.Model),带有一个 geom 字段,它是一个 django.contrib.gis.db.models.MultiPolygonField.

我想计算此模型(表示存储在 PostGIS 中的一组多边形区域)与 GeoJSON 多边形的交集 "query":

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)

但我似乎没有正确的方法。

请注意,我不想简单地计算与查询相交的区域子集,而是计算它们的确切交集(换句话说,生成的多边形集应与查询具有完全相同的形状)。

本质上,我们需要 annotate 每个 Regiongeomintersection(如果有的话)与给定的 query。使用数据库查询执行此操作如下所示:

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 空间查找过滤 相交 queryRegions
  2. 计算Intersection between a Region's geom field and the query, using the F() expression to access the geom (an explanation on F() usage can be found in my Q&A example: )的结果
  3. annotate 计算出的每个对应 Region 的交集作为名为 intersection_geom.
  4. 的字段

查询执行后,results 将包含与 query geom 相交的每个 Regionintersection_geom 字段包含相应交点的确切几何形状.