Я использую геоалхимию для запроса 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)