I have a Region
GeoDjango model (deriving from django.contrib.gis.db.models.Model
), with a geom
field, which is a django.contrib.gis.db.models.MultiPolygonField
.
I'd like to compute the intersection of this model (representing a set of polygonal regions stored in PostGIS) with a GeoJSON polygonal "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]]]}'
)
I tried many things:
results = Region.objects.all().intersection(query)
or
from django.contrib.gis.db.models.functions import Intersection
results = Intersection(Region.objects.all(), query)
but it seems I don't have the right approach.
Note that I do not want to simply compute the subset of regions which intersect with the query, but rather their exact intersection (in other words the resulting set of polygons should have the exact same shape as the query).
Essentially we need to annotate
the intersection
(if any) of each Region
's geom
with the given query
. Doing so with a DB query look like this:
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)
)
Query Explanation:
Regions
that intersect the query
, using the intersects
spatial lookup.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: How to execute arithmetic operations between Model fields in django )annotate
the calculated Intersection into each corresponding Region
as a field named intersection_geom
. After the query execution, the results
will contain each Region
that intersects the query
geom, with the intersection_geom
field containing the exact geometry of the corresponding intersection.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.