我正在使用地球化学来查询邮政信息。我需要做的一件事是计算从给定点到一组预定义区域的距离。
这些“区域”的类型为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'))
我理解该错误,并且知道我需要重新构造查询,但是对于我来说,我无法找出正确的方法。我经历了geoalchemy docs和PostGIS docs,但是一无所获。
更新
我找到了解决方法。如果我包含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)