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

时间:2019-10-28 14:40:39

标签: python django postgresql postgis geodjango

我有一个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 个答案:

答案 0 :(得分:0)

从本质上讲,我们需要annotate的{​​{1}}的{​​{1}}中的intersection(如果有)与给定的Region。使用数据库查询来执行以下操作:

geom

查询说明:

  1. 使用intersects空间查找来过滤与相交 query的{​​{1}}。
  2. 使用Intersection表达式访问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) ) (在{上的解释),计算区域的Regions字段和query之间的F()的结果在我的问答示例中可以找到{1}}的用法:How to execute arithmetic operations between Model fields in django
  3. annotate将计算出的Intersection作为名为geom的字段插入到每个对应的query中。

执行查询后,geom将包含与F()几何相交的每个Region,而intersection_geom字段将包含相应交点的确切几何。 / p>

相关问题