如何将MultiLineString/LineString拆分为含2个点的LineString子集
LineString/MultiLineString 拆分为两点线段实现方案
核心拆分逻辑
- 处理
LineString对象时:遍历其所有坐标点,依次取第N和第N+1个点,两两拼接为新的两点LineString即可。 - 处理
MultiLineString对象时:先遍历取出其中包含的每一个LineString元素,对每个LineString单独执行上述拆分逻辑,最后汇总所有拆分结果即可。
你提到的输入LINESTRING(0 0, 1 0, 1 1, 0 1)拆分后即可得到示例中的三个两点线段:
- LINESTRING(0 0, 1 0)
- LINESTRING(1 0, 1 1)
- LINESTRING(1 1, 0 1)
常用场景代码示例
Python Shapely 实现
from shapely.geometry import LineString, MultiLineString def split_to_two_point_linestrings(geometry): result = [] # 处理MultiLineString的情况 if geometry.geom_type == 'MultiLineString': for line in geometry.geoms: coords = list(line.coords) for i in range(len(coords)-1): result.append(LineString([coords[i], coords[i+1]])) # 处理LineString的情况 elif geometry.geom_type == 'LineString': coords = list(geometry.coords) for i in range(len(coords)-1): result.append(LineString([coords[i], coords[i+1]])) return result # 测试LineString test_line = LineString([(0,0), (1,0), (1,1), (0,1)]) for line in split_to_two_point_linestrings(test_line): print(line.wkt) # 测试MultiLineString test_multi = MultiLineString([[(0,0), (1,0), (1,1)], [(2,2), (3,2), (3,3)]]) for line in split_to_two_point_linestrings(test_multi): print(line.wkt)
PostGIS SQL 实现
-- 拆分单个LineString SELECT ST_AsText(ST_MakeLine(ST_PointN(geom, n), ST_PointN(geom, n+1))) AS split_line FROM (SELECT 'LINESTRING(0 0, 1 0, 1 1, 0 1)'::geometry AS geom) AS t CROSS JOIN generate_series(1, ST_NPoints(geom)-1) AS n; -- 拆分MultiLineString SELECT ST_AsText(ST_MakeLine(ST_PointN(line_geom, n), ST_PointN(line_geom, n+1))) AS split_line FROM ( SELECT (ST_Dump('MULTILINESTRING((0 0, 1 0, 1 1),(2 2, 3 2, 3 3))'::geometry)).geom AS line_geom ) AS t CROSS JOIN generate_series(1, ST_NPoints(line_geom)-1) AS n;
内容的提问来源于stack exchange,提问作者S B
相关产品推荐
相关产品推荐

