sql - 如何将线串分割成单独的线段?

标签 sql postgresql postgis

我是 PostGIS 新手。我有一组(数千个)线串和沿线关联的多个点。我想将每条线分成一组仅由 2 个点组成的线段。我找到了一些答案,但没有一个是我想要的答案。例如https://gis.stackexchange.com/questions/21648/explode-multilinestring-into-individual-segments-in-postgis-1-5

我的问题:

My question picture

最佳答案

只需转储大线串的点并使用 ST_MakeLine 创建小线串即可使用窗口函数 LEAD() 具有单个点和序列中的下一个点。最后使用 ST_Collect 创建一个带有小 LineString 的 MultiLinestring :

WITH j AS (
  SELECT gid, ST_MakeLine(j.geom,LEAD(j.geom) OVER w) AS line
  FROM t, ST_DumpPoints(geom) j (path,geom)
  WINDOW w AS (PARTITION BY gid ORDER BY j.path
               ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
)
SELECT ST_Collect(line) FROM j
GROUP BY gid;

演示: db<>fiddle

CREATE TABLE t (gid int, geom geometry(linestring,4326));
INSERT INTO t VALUES 
(1,'LINESTRING(1 1,2 2,3 3,4 4)'),
(2,'LINESTRING(3 3,7 7,4 4)'),
(3,'LINESTRING(5 5,6 6)');


WITH j AS (
  SELECT gid, ST_MakeLine(j.geom,LEAD(j.geom) OVER w) AS line
  FROM t, ST_DumpPoints(geom) j (path,geom)
  WINDOW w AS (PARTITION BY gid ORDER BY j.path
               ROWS BETWEEN CURRENT ROW AND 1 FOLLOWING)
)
SELECT ST_AsText(ST_Collect(line)) FROM j
GROUP BY gid;
                   st_astext                    
------------------------------------------------
 MULTILINESTRING((1 1,2 2),(2 2,3 3),(3 3,4 4))
 MULTILINESTRING((3 3,7 7),(7 7,4 4))
 MULTILINESTRING((5 5,6 6))
(3 rows)

关于sql - 如何将线串分割成单独的线段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70491702/

相关文章:

ruby-on-rails - 使用 PostGIS 和 Rails 查找边界框内的所有项目

部分重叠数据的Sql Join

sql - 按日期为多行中的每一列选择第一个非空值

postgresql - 如何在 PostgreSQL 中获取串联时间戳的 EPOCH

postgresql - Postgres 数组列与 JSONB 列

sql - Postgis 重新排序混淆线串 block /max_segment_length(线串)?

postgresql - 有没有办法使用 Postgis 几何类型将 Spark 连接到表?

sql - TSQL 可选 Where 子句

mysql - 通过算术和几何计算加速 SQL SELECT

postgresql - 尝试运行创建扩展 postgis 时出错