【问题标题】:Postgis – Opposite of ST_WithinPostgis – ST_Within 的对面
【发布时间】:2016-06-28 21:57:25
【问题描述】:

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

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

但不起作用——我得到了所有的分数。

【问题讨论】:

    标签: postgresql geospatial postgis


    【解决方案1】:

    你看到“所有点”的原因是你有不止一个点和不止一个多边形。如果你只有其中一个,它会起作用。

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

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

    请注意,它还将返回任何几何形状为 NULL 的点。

    另一种方法是使用EXCEPT:

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

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

    【讨论】:

    • 这对我有用。我来到这里是因为我得到的结果比预期的要少,简单否定 ST_Within:SELECT pt.gid FROM points pt, polygons po WHERE NOT ST_Within(pt.geom, po.geom)。知道为什么不能这样使用吗?
    【解决方案2】:
    SELECT pt.geom 
    FROM points pt, polygons po
    WHERE ST_Within(pt.geom, po.geom)
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些即时帮助。正确解释would greatly improve 其教育价值,通过展示为什么这是解决问题的好方法,并使其对未来有类似但不相同问题的读者更有用。请edit您的答案添加解释,并说明适用的限制和假设。
    猜你喜欢
    • 1970-01-01
    • 2020-06-13
    • 2021-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-21
    相关资源
    最近更新 更多