Django геометрия фильтра с учетом координаты - PullRequest
0 голосов
/ 03 марта 2020

Я хочу получить строку из таблицы postgis с заданной координатой / точкой. С raw sql я делаю это с:

SELECT * FROM parcelas 
WHERE fk_area=152 
AND ST_contains(geometry,ST_SetSRID(ST_Point(342884.86705619487, 6539464.45201204),32721));

Запрос до возвращает одну строку.

Когда я пытаюсь сделать это на django, он не возвращает мне ни одной строки :

from django.contrib.gis.geos import GEOSGeometry
class TestView(APIView):
    def get(self, request, format=None):
        pnt = GEOSGeometry('POINT(342884.86705619487 6539464.45201204)', srid=32721)
        parcelas = Parcelas.objects.filter(fk_area=152,geometry__contains=pnt)

        #Also tried this
        #parcelas = Parcelas.objects.filter(fk_area=pk,geometry__contains='SRID=32721;POINT(342884.86705619487 6539464.45201204)')

        serializer = ParcelasSerializer(parcelas, many=True)
        return Response(serializer.data)

Даже с необработанным запросом django он не выполняется, хотя в этом случае он возвращает мне внутреннюю ошибку сервера (аргумент 3: класс 'TypeError': неправильный тип):

class TestView(APIView):
        def get(self, request, format=None):
            parcelas = Parcelas.objects.raw('SELECT * FROM parcelas WHERE fk_area=152 AND ST_contains(geometry,ST_SetSRID(ST_Point(342884.86705619487, 6539464.45201204),32721))')
            for p in parcelas:
                #Internal server error
                print(p.id)

        return Response('Test')

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

from django.contrib.gis.db import models

class Parcelas(models.Model):
    id = models.BigAutoField(primary_key=True)
    fk_area = models.ForeignKey(Areas, models.DO_NOTHING, db_column='fk_area')
    geometry = models.GeometryField()

    class Meta:
        managed = False
        db_table = 'parcelas'

Я не знаю, что я делаю неправильно, если у кого-то есть идеи.

РЕДАКТИРОВАТЬ:

Если Я печатаю необработанный запрос, который django сделал:

SELECT "parcelas"."id", "parcelas"."fk_area", "parcelas"."geometry"::bytea FROM "parcelas" WHERE ("parcelas"."fk_area" = 152 AND ST_Contains("parcelas"."geometry", ST_Transform(ST_GeomFromEWKB('\001\001\000\000 \321\177\000\000C\224\335w\223\355\024A\350\303\355\0342\362XA'::bytea), 4326)))

Похоже, django не преобразовывает его в правильный srid (32721), но я не знаю, почему

EDIT 2:

Если в моей модели я указываю SRID, он работает правильно:

class Parcelas(models.Model):
    geometry = models.GeometryField(srid=32721)

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

1 Ответ

1 голос
/ 03 марта 2020

Тестовая база данных создается отдельно и не содержит те же данные, что и основная база данных приложения. Попробуйте использовать pdb и перечислить все записи в таблице parcelas. Если TestView не означает просто фиктивный вид на данный момент.

Использование pdb:

   import pdb, pdb.set_trace()
   Parcelas.objects.all()
...