使用地球化学查询距离时进行过滤

时间:2019-06-13 15:13:15

标签: sqlalchemy postgis geoalchemy2

我正在使用地球化学来查询邮政信息。我需要做的一件事是计算从给定点到一组预定义区域的距离。

这些“区域”的类型为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 docsPostGIS 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)

0 个答案:

没有答案