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

如何基于道路各分段的起止节点识别整条道路的起点与终点

道路分段数据起止节点提取及同步实现方案

核心思路

  • 按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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 11:45:01