PostGIS:将线串转换为线串 ZM
PostGIS: Transform Linestring to LineString ZM
问题:
我有一系列几何图形 (LineString
) 保存在 Postgres 数据库中,附加信息保存在几何图形旁边(速度和时间列)。我想将这三列组合成一个 LineString ZM
类型,这样几何形状就从 2d 向量变为 4d 向量。
id
geometry
speed
time
1
LineString_A
Int[]
Float[]
2
LineString_B
Int[]
Float[]
问题:
如何最轻松地将 geometry
(x, y)、speed
和 time
组合成 LineString ZM
?
您正在寻找 ST_Force4D
。
您需要做的就是 ALTER TABLE
使用您在 speed
和 time
列中已有的值,例如
ALTER TABLE your_table ALTER COLUMN geom TYPE geometry (linestringzm, 4326)
USING ST_Force4D(geom,speed,time);
演示 (PostGIS 3.1)
CREATE TABLE t (geom geometry(linestring,4326), speed int, time numeric);
INSERT INTO t VALUES ('SRID=4326;LINESTRING(30 10,10 30,40 40)'::geometry,42,1230);
ALTER TABLE t ALTER COLUMN geom type geometry (linestringzm, 4326)
USING ST_Force4D(geom,speed,time);
SELECT ST_AsText(geom) FROM t;
st_astext
-----------------------------------------------------------
LINESTRING ZM (30 10 42 1230,10 30 42 1230,40 40 42 1230)
不同的场景(见评论):speed
和 time
是与 LineString 中的点重叠 1:1 的数组。
CREATE TABLE t
(id int, geom geometry(linestring,4326), speed int[], time numeric[]);
INSERT INTO t VALUES
(1,'SRID=4326;LINESTRING(30 10, 10 30, 40 40)'::geometry,ARRAY[1,2,3],ARRAY[1230,1231,1232]),
(2,'SRID=4326;LINESTRING(50 60, 70 80, 90 95)'::geometry,ARRAY[4,5,6],ARRAY[1458,1459,1500]);
由于您不能在 ALTER TABLE
语句中 unnest
数组,您可以将数据类型从 LineString 更改为 LineStringZM 并将额外维度临时设置为 0
:
ALTER TABLE t ALTER COLUMN geom TYPE geometry (linestringzm, 4326)
USING ST_Force4D(geom,0,0);
以下 CTE
转储 LineString 中的所有点,创建具有 Z
和 M
维度的新点,最后为 UPDATE
查询创建 LineStringZM。
WITH j AS (
SELECT id, ST_MakeLine(j.pointzm) AS linestringzm
FROM (SELECT id, geom AS linestring,
(ST_DumpPoints(geom)).path AS path,
ST_MakePoint(ST_X((ST_DumpPoints(geom)).geom),
ST_Y((ST_DumpPoints(geom)).geom),
unnest(speed),unnest(time)) AS pointzm
FROM t ORDER BY id,path) j
GROUP BY id
)
UPDATE t SET geom = j.linestringzm
FROM j WHERE t.id = j.id;
SELECT id, ST_AsText(geom) FROM t;
id | st_astext
----+--------------------------------------------------------
1 | LINESTRING ZM (30 10 1 1230,10 30 2 1231,40 40 3 1232)
2 | LINESTRING ZM (50 60 4 1458,70 80 5 1459,90 95 6 1500)
(2 rows)
进一步阅读:
问题:
我有一系列几何图形 (LineString
) 保存在 Postgres 数据库中,附加信息保存在几何图形旁边(速度和时间列)。我想将这三列组合成一个 LineString ZM
类型,这样几何形状就从 2d 向量变为 4d 向量。
id | geometry | speed | time |
---|---|---|---|
1 | LineString_A | Int[] | Float[] |
2 | LineString_B | Int[] | Float[] |
问题:
如何最轻松地将 geometry
(x, y)、speed
和 time
组合成 LineString ZM
?
您正在寻找 ST_Force4D
。
您需要做的就是 ALTER TABLE
使用您在 speed
和 time
列中已有的值,例如
ALTER TABLE your_table ALTER COLUMN geom TYPE geometry (linestringzm, 4326)
USING ST_Force4D(geom,speed,time);
演示 (PostGIS 3.1)
CREATE TABLE t (geom geometry(linestring,4326), speed int, time numeric);
INSERT INTO t VALUES ('SRID=4326;LINESTRING(30 10,10 30,40 40)'::geometry,42,1230);
ALTER TABLE t ALTER COLUMN geom type geometry (linestringzm, 4326)
USING ST_Force4D(geom,speed,time);
SELECT ST_AsText(geom) FROM t;
st_astext
-----------------------------------------------------------
LINESTRING ZM (30 10 42 1230,10 30 42 1230,40 40 42 1230)
不同的场景(见评论):speed
和 time
是与 LineString 中的点重叠 1:1 的数组。
CREATE TABLE t
(id int, geom geometry(linestring,4326), speed int[], time numeric[]);
INSERT INTO t VALUES
(1,'SRID=4326;LINESTRING(30 10, 10 30, 40 40)'::geometry,ARRAY[1,2,3],ARRAY[1230,1231,1232]),
(2,'SRID=4326;LINESTRING(50 60, 70 80, 90 95)'::geometry,ARRAY[4,5,6],ARRAY[1458,1459,1500]);
由于您不能在 ALTER TABLE
语句中 unnest
数组,您可以将数据类型从 LineString 更改为 LineStringZM 并将额外维度临时设置为 0
:
ALTER TABLE t ALTER COLUMN geom TYPE geometry (linestringzm, 4326)
USING ST_Force4D(geom,0,0);
以下 CTE
转储 LineString 中的所有点,创建具有 Z
和 M
维度的新点,最后为 UPDATE
查询创建 LineStringZM。
WITH j AS (
SELECT id, ST_MakeLine(j.pointzm) AS linestringzm
FROM (SELECT id, geom AS linestring,
(ST_DumpPoints(geom)).path AS path,
ST_MakePoint(ST_X((ST_DumpPoints(geom)).geom),
ST_Y((ST_DumpPoints(geom)).geom),
unnest(speed),unnest(time)) AS pointzm
FROM t ORDER BY id,path) j
GROUP BY id
)
UPDATE t SET geom = j.linestringzm
FROM j WHERE t.id = j.id;
SELECT id, ST_AsText(geom) FROM t;
id | st_astext
----+--------------------------------------------------------
1 | LINESTRING ZM (30 10 1 1230,10 30 2 1231,40 40 3 1232)
2 | LINESTRING ZM (50 60 4 1458,70 80 5 1459,90 95 6 1500)
(2 rows)
进一步阅读: