Geo django точка в соединении полигонов без петли - PullRequest
0 голосов
/ 09 февраля 2020
class Location(models.Model):
    coordinates = models.PointField()


class Boundary(models.Model):
    geom = models.MultiPolygonField()

Я хочу запросить каждое местоположение и включить в него содержащую границу. Границы не пересекаются, поэтому каждое местоположение содержится только в одной границе.

Мой SQL запрос будет выглядеть примерно так:

SELECT *
FROM
  Location l
  INNER JOIN Boundary b on ST_CONTAINS(b.geom, l.coordinates)

Я бы хотел избежать перебора моих границ по отдельности, например:

for boundary in Boundary.objects.all():
    Location.objects.filter(coordinates__within=boundary.geom)

Похоже очевидный вариант использования, но я не видел никаких решений.

1 Ответ

0 голосов
/ 09 февраля 2020

Решено с помощью подзапроса согласно примеру в Django документах.

from django.db.models import OuterRef, Subquery
sq = Boundary.objects.filter(geom__contains=OuterRef("coordinates"))
points = Location.objects.annotate(boundary=Subquery(sq).values("pk"))
...