首页 > 解决方案 > 尝试在 PgAdmin4 中使用 ST_CONTAINS 对列进行 FOR LOOP

问题描述

我正在使用 PgAdmin4 创建一个包含大量几何数据的视图。该数据的一部分是存在于多边形中的折线。我正在尝试编写一个代码,该代码可以遍历给定列中的所有折线数据,并检查它是否在给定的多边形中,并返回真/假。到目前为止,这就是我所拥有的。

DO
$$
BEGIN
    FOR i IN (SELECT "geom" FROM "street map"."segment_id")
    LOOP
        SELECT ST_CONTAINS(
            (SELECT "geom" FROM "street map"."cc_districts" WHERE "district number" = 1),
            (i)
        )
        RETURN NEXT i
    END LOOP;
END
$$  

运行此代码时收到的错误如下:

ERROR:  loop variable of loop over rows must be a record or row variable or list of scalar variables
LINE 4:  FOR i IN (SELECT "geom" FROM "street map"."segment_id")
             ^
SQL state: 42601
Character: 18

据我了解,“i”必须指“行变量”,我试图用这段代码定义该变量:

(SELECT "geom" FROM "street map"."segment_id")

任何实现这一目标的想法都会非常有帮助。

标签: postgresqlpostgis

解决方案


一个简单的连接在这里会更有效

SELECT line.*, polygon.id IS NOT NULL AS is_in_polygon
FROM line
 LEFT JOIN polygon 
  ON ST_Contains(polygon.geometry, line.geometry)
     AND polygon.id = 1

可以翻译为:

获取line记录的每个字段,true如果polygon.id存在(is not null),false否则(更多下文)。将此布尔字段命名为is_in_polygon
在每一行上都这样做。
将每条线加入(链接)到多边形层。如果没有匹配,请保留line信息并NULL为每个polygon字段放置(这是 a left join)。如果有匹配项,请同时保留linepolygon信息。
如果polygon.geometry包含line.geometry并且如果polygon.id = 1


推荐阅读