我有一个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)
但是我似乎没有正确的方法。
请注意,我不想简单地计算与查询相交的区域的子集,而是它们的精确交集(换句话说,所得的多边形集应具有与查询完全相同的形状)。
答案 0 :(得分:0)
从本质上讲,我们需要annotate
的{{1}}的{{1}}中的intersection
(如果有)与给定的Region
。使用数据库查询来执行以下操作:
geom
查询说明:
intersects
空间查找来过滤与相交 query
的{{1}}。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)annotate
将计算出的Intersection作为名为geom
的字段插入到每个对应的query
中。执行查询后,geom
将包含与F()
几何相交的每个Region
,而intersection_geom
字段将包含相应交点的确切几何。 / p>