如何筛选包含一个或多个点的多边形数据行
实现多边形包含多个点中至少一个的查询
你需要调整查询结构,因为ST_Contains仅接受两个几何对象作为参数,不能直接在参数中使用IN。以下是几种可行的实现方式:
方法一:OR连接多个ST_Contains判断
适合点数量较少的场景,直接用OR连接每个点的包含判断:
SELECT * FROM areas WHERE ST_Contains(areas.geometry, POINT('lon', 'lat')) OR ST_Contains(areas.geometry, POINT('lon2', 'lat2')) OR ST_Contains(areas.geometry, POINT('lon3', 'lat3'));
方法二:EXISTS子查询+VALUES点集合
当点数量较多时,这种写法更简洁易维护,将所有点放入VALUES子句中,通过EXISTS判断是否存在任意一个点被多边形包含:
SELECT a.* FROM areas a WHERE EXISTS ( SELECT 1 FROM (VALUES (POINT('lon', 'lat')), (POINT('lon2', 'lat2')), (POINT('lon3', 'lat3')) ) AS points(p) WHERE ST_Contains(a.geometry, points.p) );
方法三:ST_AnyIntersects结合ST_Collect
将所有点合并为一个MultiPoint几何对象,通过ST_AnyIntersects判断多边形是否与该多点集合存在交集(点在多边形内时交集存在,效果等同于至少包含一个点):
SELECT * FROM areas WHERE ST_AnyIntersects( areas.geometry, ST_Collect( POINT('lon', 'lat'), POINT('lon2', 'lat2'), POINT('lon3', 'lat3') ) );
注意:
ST_Contains和ST_AnyIntersects在点位于多边形边界时都会返回true,如果需要严格判断点在多边形内部(不含边界),可替换为ST_Within(points.p, areas.geometry)(点在多边形内部)或ST_DWithin结合距离阈值。
内容的提问来源于stack exchange,提问作者phper
相关产品推荐
相关产品推荐

