фильтрация при запросе расстояния с помощью геоалхимии - PullRequest
0 голосов
/ 13 июня 2019

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

Эти «зоны» имеют тип geography(Polygon,4326).Этот запрос работает как ожидалось

session.query(Zones.name,func.ST_Distance(Zones.coordinates, 'POINT(%f %f)' % (location["lon"], location["lat"]))
                          .label('distance'))

, но при этом вычисляется расстояние между данной точкой и всеми зонами в таблице.Когда я пытаюсь ограничить запрос фильтрацией по типу зоны, например unsafe PostGIS жалуется, что FILTER specified, but st_distance is not an aggregate function

session.query(Zones.name,func.ST_Distance(Zones.coordinates, 'POINT(%f %f)' % (location["lon"], location["lat"]))
                          .filter(Zones.type == "unsafe") \
                          .label('distance'))

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


ОБНОВЛЕНИЕ

Я нашелОбходной путь.Если я включу условный тест для ST_Distance, например, менее 10 км, я могу использовать дополнительные фильтры.Я предполагаю, что упустил тот факт, что операции filter должны работать при логических сравнениях, тогда как ST-Distance сам по себе возвращает фактическое значение в метрах, поэтому его нельзя объединить с другим фильтром

zones = session.query(Zones) \
        .filter(Zones.type == "unsafe")\
        .filter(Zones.patient_id == patient_id)\
        .filter(Zones.coordinates.ST_Distance('POINT(%f %f)' % (location["lon"], location["lat"])) < 10000)
...