【问题标题】:How to split linestrings into their individual segments?如何将线串拆分为单独的段?
【发布时间】:2022-01-26 04:41:28
【问题描述】:

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

我的问题:

【问题讨论】:

    标签: sql postgresql postgis


    【解决方案1】:

    只需转储大 LineString 的点,然后使用 ST_MakeLine 创建一个小点,然后使用窗口函数 LEAD() 创建序列中的下一个点。然后最后使用ST_Collect 创建一个带有小 LineStrings 的 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)
    

    【讨论】:

    • 难以置信!代码太漂亮了!完美解决了我的问题!非常感谢!
    • 我还有一个问题,你能帮忙回答一下吗?非常感谢。 stackoverflow.com/q/70538385/17770516
    猜你喜欢
    • 2014-09-04
    • 1970-01-01
    • 1970-01-01
    • 2015-08-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    相关资源
    最近更新 更多