【问题标题】:how to split multilinestring into overlapping 2-point subsets (2-point linestrings)?如何将多线串拆分为重叠的 2 点子集(2 点线串)?
【发布时间】:2021-10-15 04:49:49
【问题描述】:

我想将多线串或像 LINESTRING(0 0, 1 0, 1 1, 0 1) 这样的线串拆分为由两个点组成的线串。

所以上面的线串会变成:

  • LINESTRING(0 0, 1 0)
  • LINESTRING(1 0, 1 1)
  • LINESTRING(1 1, 0 1)

我也希望能够对多线字符串做同样的事情。

【问题讨论】:

标签: sql postgresql postgis


【解决方案1】:

使用LATERALST_DumpPoints 转储线串的点,并在SELECT 子句中使用ST_MakeLine 与当前行的点和使用窗口函数LAG() 的前一行的点:

SELECT * FROM (
  SELECT ST_MakeLine(LAG(j.geom) OVER w,j.geom) AS line
  FROM t,LATERAL ST_DumpPoints(geom) j(path,geom)
  WINDOW w AS (PARTITION BY gid ORDER BY j.path 
               ROWS BETWEEN 1 PRECEDING AND CURRENT ROW)) i
WHERE line IS NOT NULL;

注意:在这种情况下,框架 ROWS BETWEEN 1 PRECEDING AND CURRENT ROW 几乎是可选的,但将窗口函数保持尽可能明确被认为是一种好习惯,这样您就可以始终准确地知道发生了什么无需依赖您的记忆或在文档中查找。这也应该有效:

SELECT * FROM (
  SELECT ST_MakeLine(LAG(j.geom) OVER w,j.geom) AS line
  FROM t,LATERAL ST_DumpPoints(geom) j(path,geom)
  WINDOW w AS (PARTITION BY gid ORDER BY j.path)) i
WHERE line IS NOT NULL;

演示:db<>fiddle

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-09-21
    • 2016-08-21
    • 2013-02-05
    • 2012-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-26
    相关资源
    最近更新 更多