Postgis - 与ST_Within相反

bpl*_*lmp 3 postgresql postgis geospatial

我试图获得不在几个多边形内的所有点:

SELECT pt.geom 
FROM points pt, polygons po
WHERE ST_Within(pt.geom, po.geom) = false;
Run Code Online (Sandbox Code Playgroud)

但是不起作用 - 我得到所有的积分.

Mik*_*e T 6

您看到"所有点"的原因是您有多个点和多个多边形.如果你只有其中一个,它会工作.

实际上有几种方法可以解决这个问题,但这可能是最简单,最快捷的方法.

如果您有主键或唯一键(例如gid):

SELECT pt.*
FROM points pt
WHERE pt.gid NOT IN (
    SELECT pt.gid FROM points pt, polygons po
    WHERE ST_Within(pt.geom, po.geom)
);
Run Code Online (Sandbox Code Playgroud)

请注意,它还将返回任何具有NULL几何的点.

另一种方法是使用EXCEPT:

SELECT pt.*
FROM points pt
EXCEPT SELECT pt.*
FROM points  pt, polygons po
WHERE ST_Within(pt.geom, po.geom);
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用ST_Union将所有多边形融合成一个大的几何体,但这种方法要慢得多.