Postgis – ST_Within 的对面

Postgis – Opposite of ST_Within

我正在尝试获取不在几个多边形内的所有点:

SELECT pt.geom 
FROM points pt, polygons po
WHERE ST_Within(pt.geom, po.geom) = false;

但是没用——我得到了所有的分数。

你之所以看到 "all the points" 是因为你有不止一个点和不止一个多边形。如果你只有其中之一,它会起作用。

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

如果您有主键或唯一键(例如 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)
);

请注意,它还会 return 具有 NULL 几何图形的任何点。

另一种方法是使用EXCEPT:

SELECT pt.*
FROM points pt
EXCEPT SELECT pt.*
FROM points  pt, polygons po
WHERE ST_Within(pt.geom, po.geom);

还有一种方法是使用ST_Union将所有的多边形融合成一个大的几何体,但是这种方法会慢很多。

SELECT pt.geom 
FROM points pt, polygons po
WHERE ST_Within(pt.geom, po.geom)