You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何筛选包含一个或多个点的多边形数据行

实现多边形包含多个点中至少一个的查询

你需要调整查询结构,因为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 15:52:16