关于OpenStreetMapX.jl是否支持yen_k_shortest_paths及调用方法的咨询
关于OpenStreetMapX.jl调用Graph.jl最短路径算法的解决方案
1. 直接利用OpenStreetMapX内置的图结构调用Graph.jl算法
OpenStreetMapX加载的map对象本身已经封装了Graph.jl所需的图结构和权重信息:
map.g:Graph.jl定义的Graph实例,对应地图的路网拓扑map.w:权重矩阵,存储每条边的道路长度
你可以直接将这两个参数传给Graph.jl的各类最短路径算法,包括yen_k_shortest_paths。示例代码如下(以多伦多地图为例):
using OpenStreetMapX, Graphs # 加载多伦多地图文件 map = get_map("toronto.osm") # 将目标经纬度转换为地图节点ID(需确保坐标在地图覆盖范围内) source_node = point_to_nodes(map, LatLon(43.6532, -79.3832))[1] # 多伦多市政厅坐标 target_node = point_to_nodes(map, LatLon(43.6426, -79.3871))[1] # 多伦多联合车站坐标 # 调用Graph.jl的k短路算法,获取前3条最短路径 k = 3 k_paths = yen_k_shortest_paths(map.g, map.w, source_node, target_node, k) # 输出每条路径的节点序列和总长度 for (i, path) in enumerate(k_paths.paths) total_length = sum(map.w[path[j], path[j+1]] for j in 1:length(path)-1) println("第$(i)条路径节点序列:$(path),总长度:$(total_length)米") end
2. OpenStreetMapX内置的最短路径支持
OpenStreetMapX提供了shortest_path函数,底层会根据路网情况自动选择dijkstra_shortest_paths或bellman_ford_shortest_paths,但目前没有内置封装yen_k_shortest_paths的函数,无法直接通过OpenStreetMapX.yen_k_shortest_paths(map, source, target)的形式调用。
额外提示
- 传入算法的
source和target必须是map中的整数类型节点ID,不能直接使用经纬度,需通过point_to_nodes函数转换 - 如果需要将节点序列转换为可可视化的地理路线,可以使用
get_route_geometry函数,示例:route_geom = get_route_geometry(map, k_paths.paths[1])
内容的提问来源于stack exchange,提问作者yaodao vang
相关产品推荐
相关产品推荐

