You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中基于多连接顶点分割MultiLineString的方法

实现MultiLineString在分支点分割的方法

核心思路

要实现需求,关键是先找出分支点(即连接≥3条线段的顶点),再用这些点切割所有线段。步骤如下:

  1. 统计所有线段端点的出现次数(次数即为该点连接的线段数,也就是度数)
  2. 筛选出度数≥3的点作为分支点
  3. 用分支点切割每条原始线段,收集所有子线段

具体代码实现

导入依赖库

import geopandas as gpd
import numpy as np
from shapely.geometry import MultiLineString, LineString, MultiPoint
from shapely.ops import split, unary_union

定义分割函数

def split_multiline_at_branches(multiline):
    # 收集所有线段的端点
    coords = []
    for line in multiline.geoms:
        coords.append(line.coords[0])
        coords.append(line.coords[-1])
    
    # 统计每个端点的出现次数(处理浮点精度问题,保留6位小数)
    coord_counts = {}
    for coord in coords:
        coord_tuple = tuple(np.round(coord, 6))
        coord_counts[coord_tuple] = coord_counts.get(coord_tuple, 0) + 1
    
    # 筛选分支点(度数≥3)
    branch_points = MultiPoint([coord for coord in coord_counts if coord_counts[coord] >= 3])
    
    # 切割每条线段并收集结果
    split_segments = []
    for line in multiline.geoms:
        # 用分支点切割当前线段
        split_result = split(line, branch_points)
        split_segments.extend(split_result.geoms)
    
    return MultiLineString(split_segments)

单例测试

# 构造带分支的测试MultiLineString
line1 = LineString([(0,0), (1,1), (2,0)])
line2 = LineString([(1,1), (3,1)])
line3 = LineString([(1,1), (1,2)])
unioned_multiline = unary_union([line1, line2, line3])

# 执行分割
split_result = split_multiline_at_branches(unioned_multiline)
# 输出分割后的线段数量,预期为4条
print(f"分割后线段总数:{len(split_result.geoms)}")

批量处理(GeoDataFrame场景)

如果你的数据存储在GeoDataFrame中,直接用apply批量处理即可:

# 构造示例GeoDataFrame
gdf = gpd.GeoDataFrame({
    'id': [1, 2],
    'geometry': [unioned_multiline, another_unioned_multiline]
})

# 批量应用分割函数
gdf['split_geometry'] = gdf['geometry'].apply(split_multiline_at_branches)

注意事项

  • 浮点精度处理:代码中用np.round(coord, 6)处理坐标,避免因微小浮点差异导致端点统计错误。
  • 特殊场景兼容:如果你的MultiLineString存在线段交叉(非端点连接),Union操作会自动在交点处拆分线段,此时分支点统计逻辑依然适用。

内容的提问来源于stack exchange,提问作者Lord_Verulam

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 21:55:27