如何仅按顶点分割LineString几何图形而非交叉点?
解决方案
你的需求是将LineString仅按原始顶点分割为相邻顶点组成的小线段,当前查询的问题可能出在排序逻辑冗余,或是你误解了结果(ST_DumpPoints只会返回几何的原始顶点,不会自动引入交叉点)。以下是修正后的查询,确保严格按原始顶点顺序生成线段:
WITH gpx_line AS ( SELECT uuid, ST_MakeLine(lag((pt).geom) OVER (PARTITION BY uuid ORDER BY (pt).path), (pt).geom) AS wkb_geometry FROM ( SELECT uuid, ST_DumpPoints(wkb_geometry) AS pt FROM public.points_gpx_to_line -- 过滤仅处理LineString类型,避免MultiLineString干扰 WHERE ST_GeometryType(wkb_geometry) = 'ST_LineString' ) AS dumps ) SELECT uuid, ST_AsText(wkb_geometry) AS wkb_geometry_text FROM gpx_line WHERE wkb_geometry IS NOT NULL;
关键修改说明
- 移除了
ORDER BY中的冗余uuid:由于已按uuid分区,只需按顶点的路径顺序(pt).path排序,即可保证顶点的原始顺序正确 - 添加LineString类型过滤:避免MultiLineString的顶点被混在一起处理(若数据包含MultiLineString,需先用
ST_Dump拆分后再处理) - 调整
ST_AsText位置:将文本转换移到最终查询中,避免中间结果转为文本影响后续几何操作(若需保留二进制几何,可去掉ST_AsText,直接返回wkb_geometry)
若结果中仍出现交叉点分割,大概率是原始LineString本身在交叉处就存在顶点,而非查询导致。可通过ST_NPoints(wkb_geometry)查看原始LineString的顶点数量,对比分割后的线段数量(应为顶点数-1)来验证。
内容的提问来源于stack exchange,提问作者Bak
相关产品推荐
相关产品推荐

