如何基于道路各分段的起止节点识别整条道路的起点与终点
道路分段数据起止节点提取及同步实现方案
核心思路
- 按
Road_id维度分组,对每条道路的所有分段单独处理 - 统计每个节点的入度(作为
End_node出现的次数)和出度(作为Start_node出现的次数) - 开放道路场景:起点为入度比出度少1的节点,终点为入度比出度多1的节点
- 环线道路场景:所有节点入度与出度相等,任选一个节点作为起止节点即可
- 将计算得到的整条道路的起止节点,同步到该道路下的所有分段行中
实现代码
import pandas as pd from collections import defaultdict # 测试数据初始化 data = [['Road_id','Segment_id','Start_node','End_node'], [1,8285,4740,4741], [1,8509,4741,5144], [1,8437, 5016,5017], [1,8447, 5031, 5016], [1, 8520, 5144,5168], [1,9104,5168,4785],[1,8550,5017,4740]] df = pd.DataFrame(data[1:], columns = data[0]) # 单条道路处理函数 def process_single_road(road_df): degree = defaultdict(lambda: [0, 0]) # 存储每个节点的[入度, 出度] for _, row in road_df.iterrows(): s_node = row['Start_node'] e_node = row['End_node'] degree[s_node][1] += 1 degree[e_node][0] += 1 road_start = None road_end = None # 遍历节点度统计结果,匹配道路起止点 for node, (in_degree, out_degree) in degree.items(): if in_degree - out_degree == -1: road_start = node if in_degree - out_degree == 1: road_end = node # 处理环线场景:所有节点入度出度相等 if road_start is None: road_start = road_df.iloc[0]['Start_node'] road_end = road_start # 同步道路起止点到所有分段 road_df['Road_Start_node'] = road_start road_df['Road_End_node'] = road_end return road_df # 按道路ID分组批量处理 result_df = df.groupby('Road_id', group_keys=False).apply(process_single_road).reset_index(drop=True) print(result_df)
额外说明
如果需要对同一条道路下的分段按路径顺序排序,只需要从提取到的道路起点出发,依次匹配前一段的End_node作为下一段的Start_node遍历所有分段即可。
内容的提问来源于stack exchange,提问作者Chan Wee How
相关产品推荐
相关产品推荐

