根据 id 从线串创建 Polygon / MultiLineString

Create Polygon / MultiLineString from linestrings based on their id

我有两个这样的table:

lines:
line_id|    geometry
-------------------
1      |    ....
2      |    ....
3      |    ....
4      |    ....
5      |    ....
6      |    ....

(几何列填满行table)

polygons:
    poly_id |    line_id 
    --------------------
    1       |       1     
    1       |       2     
    1       |       3        
    1       |       4        
    2       |       3       
    2       |       5      
    2       |       6        
    2       |       7       

正如您在多边形 table 中看到的那样,我有构成多边形的 line_id-s 条线。 我所做的是,我创建了一个新的 table,每个 poly_id:

只有一条记录
SELECT DISTINCT(poly_id) 
INTO polygons_new
FROM polygons;

SELECT AddGeometryColumn('polygons_new','geom',23700,'POLYGON',2);

在此之后,我想填写 geom 列,但到目前为止我无法完成。 我试过的是这样的:

UPDATE polygons_new
SET geom = (SELECT ST_Collect(SELECT geometry FROM lines as a, polygons as b WHERE a.line_id = b.line_id))

问题在于它 returns 在子查询中多于一行。 有办法完成这个任务吗?

您尝试过使用 ST_Collect, ST_MergeLine and then create the polygon using ST_MakePolygon 吗?下面的例子会让你明白我在说什么:

WITH j (id,geom) AS (
  VALUES (1,'SRID=4326;LINESTRING(30 10, 10 30)'),
         (1,'SRID=4326;LINESTRING(10 30, 40 40)'),
         (1,'SRID=4326;LINESTRING(40 40, 30 10)'),
         (2,'SRID=4326;LINESTRING(50 60, 60 20)'),
         (2,'SRID=4326;LINESTRING(60 20, 45 45)'),
         (2,'SRID=4326;LINESTRING(45 45, 50 60)')
) 
 SELECT 
  ST_MakePolygon(
    ST_LineMerge(
      ST_Collect(geom))) 
FROM j
GROUP BY id

编辑: 如果只有 MULTILINESTRING 就足够了,只需使用 ST_Collect(见评论):

WITH j (id,geom) AS (
  VALUES (1,'SRID=4326;LINESTRING(30 10, 10 30)'),
         (1,'SRID=4326;LINESTRING(10 30, 40 40)'),
         (1,'SRID=4326;LINESTRING(40 40, 30 10)'),
         (2,'SRID=4326;LINESTRING(50 60, 60 20)'),
         (2,'SRID=4326;LINESTRING(60 20, 45 45)'),
         (2,'SRID=4326;LINESTRING(45 45, 50 60)')
) 
SELECT ST_Collect(geom)
FROM j
GROUP BY id;