SQL:多边形外点的结果

SQL: Result for Points Outside Polygons

提问人:I_suck_at_sql 提问时间:11/17/2023 更新时间:11/17/2023 访问量:22

问:

我有一个 SQL 语句,它根据地址搜索创建一个点,并根据点所在的位置返回一个值。如果它位于具有特定属性值的多边形的一部分内,则返回相应的结果(请参阅下面的 CASE 语句)。

SELECT
CASE
        WHEN p.column1 IS NOT NULL AND p.column2 = 'Yes' THEN 'Response_A'
        WHEN p.column1 IS NOT NULL AND p.column2 = 'No' THEN 'Response_B'
        WHEN p.column1 IS NOT NULL AND p.column2 IS NULL THEN 'Response_C'
        ELSE 'Outside Polygon'
    END AS Status,
    p.column1,
    p.column2,
    p.geometry
FROM
    my.table AS p
WHERE ST_Intersects(ST_SetSRID(ST_MakePoint(LONGITUDE, LATITUDE), 4326),
    ST_Transform(p.geometry, 4326))

但是,我的问题在于点不落在多边形内。如果我运行上述命令(我知道经度和纬度在多边形内),我会按预期返回结果,并带有预期的响应。但是,如果我插入任何多边形的值,则该表为空,则不返回任何内容。我虽然 ELSE 语句会解释这一点,但它似乎不起作用。 我将不胜感激任何建议,因为我完全被难住了。

我正在寻找的结果是,如果 long/lat 不在多边形中,那么它应该返回“多边形外”。

我尝试了以下方法来修复:

  • 将ST_Intersects替换为ST_Within;产生同样的问题
  • 添加另一个 CASE 语句;
WHEN NOT ST_Within(ST_SetSRID(ST_MakePoint(LONGITUDE, LATITUDE}), 4326), p.geometry) THEN 'Outside Polygon'

但这似乎没有效果,

  • 我还尝试将左联接添加到表本身,但我无法让它工作。

我正在寻找的结果是,如果 long/lat 不在多边形中,那么它应该返回“多边形外”。

sql postgresql gis pgadmin

评论

0赞 nbk 11/17/2023
请在您的问题中添加带有一些数据作为文本的创建表

答:

1赞 Bart McEndree 11/17/2023 #1

您的 WHERE 子句阻止了多边形之外的任何点。 ST_Intersects 如果两个几何图形相交,则返回 true。 ST_Within 如果几何图形 A 位于几何图形 B 内,则返回 TRUE。 您需要调整或删除 WHERE 子句以包含多边形外部的点。

评论

0赞 I_suck_at_sql 11/18/2023
感谢您伸出援手!如果我理解正确的话,这意味着如果我去掉 INTERSECTS 子句,它会起作用吗?
0赞 Bart McEndree 11/18/2023
在开发 SQL 语句时,我通常先尝试不使用 WHERE 子句。相反,我指定 SELECT Top 10 * FROM my.table...。然后,我查看结果并选择所需的列。SELECT Top 10 'Example Status' as Status, Column1, Column2, geometry FROM my.table.通过 WHERE 子句确定要排除的行是最后一步。完成后,我删除了前 10 名部分。
0赞 Bart McEndree 11/18/2023
@I_suck_at_sql如果此答案解决了您的问题,请考虑通过单击复选标记来接受它。这表明您已经找到了解决方案并为您提供了一些声誉。
0赞 Ian Turton 11/18/2023
如果你把交集放到案例陈述中,它会起作用
0赞 I_suck_at_sql 11/20/2023
@IanTurton这就是我今天的询问!谢谢。