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

Posted

技术标签:

【中文标题】在 GeoDjango 中将多边形层与多边形相交【英文标题】:Intersecting multipolygon layer with polygon in GeoDjango 【发布时间】:2020-02-23 20:08:09 【问题描述】:

我有一个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)

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

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

【问题讨论】:

嘿@cjauvin,我正在通过我的答案,我想知道,你觉得这个答案有帮助吗? 【参考方案1】:

基本上我们需要annotateintersection(如果有)每个Regiongeom 与给定的query。使用 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)
)

查询说明:

    使用intersects 空间查找过滤与query相交Regions。 计算区域的geom 字段和query 之间Intersection 的结果,使用F() 表达式访问geom(关于F() 用法的说明可以在我的问答示例中找到:How to execute arithmetic operations between Model fields in django) annotate 将计算出的 Intersection 转换为每个对应的 Region 作为名为 intersection_geom 的字段。

查询执行后,results 将包含与query 几何相交的每个Region,其中intersection_geom 字段包含相应相交的确切几何形状。

【讨论】:

以上是关于在 GeoDjango 中将多边形层与多边形相交的主要内容,如果未能解决你的问题,请参考以下文章

多边形相交的简单算法

不相交多边形中的点

如何测试线是否与凸多边形相交?

如何重绘一个完全自相交的多边形?

如何将自相交多边形划分为简单多边形?

boost 多边形相交 API 的工作方式与应有的方式相反