Пересекающийся многогранный слой с многоугольником в GeoDjango - PullRequest
1 голос
/ 28 октября 2019

У меня есть 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 голосов
/ 12 ноября 2019

По существу нам нужно annotate intersection (если есть) каждого Region 'geom с данным query. При этом запрос к БД выглядит следующим образом:

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. Фильтр Regions, который пересекается query, используя пространственный поиск intersects.
  2. Вычислить результат Intersection между полем geom Региона и queryс помощью выражения F() для доступа к geom (объяснение использования F() можно найти в моем примере с вопросами и ответами: Как выполнять арифметические операции между полями модели в django )
  3. annotate вычисленное пересечение в каждый соответствующий Region как поле с именем intersection_geom.

После выполнения запроса results будет содержать каждый Region, который пересекает geom query, с полем intersection_geom, содержащим точную геометрию соответствующего пересечения.

...