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

3

我有一个Region GeoDjango模型(派生自django.contrib.gis.db.models.Model),其中包含一个geom字段,该字段是一个django.contrib.gis.db.models.MultiPolygonField

我想计算此模型(表示存储在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)

但是看起来我没有正确的方法。

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


1
嗨,@cjauvin,我正在检查我的答案,想知道你是否觉得这个答案有帮助? - John Moutafis
1个回答

4
基本上,我们需要用给定的查询对每个“Region”的“geom”进行“注释”,并标记(如果有)它们的“交集”。使用数据库查询执行此操作如下所示:
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(有关F()用法的说明,请参见我的Q&A示例:如何在Django中执行模型字段之间的算术运算),计算区域的geom字段与queryIntersection结果。
  3. annotate将计算出的交集作为名为intersection_geom的字段注释到每个对应的Region中。
执行查询后,results将包含与query几何图形相交的每个Region,其中intersection_geom字段包含相应交集的精确几何图形。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接