OSMnx/NetworkX是否支持计算途经指定节点的起止点路径?
问题解答
NetworkX 原生没有内置nx.shortest_path(G, origin, destination, stops)这类直接支持指定途经点参数的路径计算接口,不过可以通过以下两种成熟方案实现需求,同时解决你之前遇到的计算成本高、鲁棒性差的问题:
方案1:优化型分段拼接(推荐用于途经站有固定先后顺序的场景)
你之前用的分段计算方案逻辑本身是效率最高的,只需要补充异常处理和细节优化就能解决鲁棒性问题:
- 提前按公交运营顺序整理所有途经节点为有序列表
waypoints = [起点节点, 停靠站1节点, 停靠站2节点... 终点节点] - 拼接路径时去掉前一段的最后一个节点,避免站点节点重复
- 增加路径计算失败的fallback逻辑,提前为每个经纬度点缓存3~5个最近的候选匹配节点,某段路径计算无结果时自动切换次近节点重试
代码示例:
# 按顺序整理所有必须经过的节点 waypoints = [start_node, stop1_node, stop2_node, stop3_node, end_node] total_route = [] for i in range(len(waypoints)-1): u = waypoints[i] v = waypoints[i+1] try: # 以道路实际长度为权重计算路径,更贴合公交运营实际 segment = nx.shortest_path(G, u, v, weight='length') # 非首段路径去掉重复的衔接节点 if i > 0: segment = segment[1:] total_route.extend(segment) except nx.NetworkXNoPath: # 异常重试逻辑,此处示例为切换无权重最短路径重试,可替换为次近节点重试逻辑 segment = nx.shortest_path(G, u, v) if i > 0: segment = segment[1:] total_route.extend(segment)
方案2:TSP近似算法(推荐用于途经站无固定顺序、需要自动规划最优停靠顺序的场景)
NetworkX 自带的旅行商问题近似求解接口可以直接返回经过所有指定节点的路径,无需手动分段:
- 采用近似算法,计算效率远高于全路径枚举,适合公交场景的中等规模路径计算
- 支持通过
weight参数自定义路径成本(比如用道路长度、通行时间作为权重)
代码示例:
from networkx.algorithms.approximation import traveling_salesman_problem # 所有必须经过的节点,包含起点、所有中途停靠站、终点 required_nodes = [start_node, stop1_node, stop2_node, stop3_node, end_node] # cycle=False表示不需要返回起点,直接返回从起点到终点经过所有要求节点的路径 total_route = traveling_salesman_problem(G, nodes=required_nodes, cycle=False, weight='length')
扩展说明
如果需要约束途经边而非节点,可以先在图中为需要经过的边插入虚拟节点,再把虚拟节点加入必须经过的节点列表,用上述两种方案计算即可。如果需要路径更贴合实际公交运营路线,可以在计算路径时给公交专用道、公交优先通行的道路设置更低的权重,让路径优先选择这类道路。
内容的提问来源于stack exchange,提问作者Bram
相关产品推荐
相关产品推荐

