根据 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;
我有两个这样的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;