如何查询节点间步行时间?Graph.jl/OSMX.jl等路由包功能咨询
关于Julia路由包获取步行时间/距离的解答
1. 步行相关权重的支持情况
- OSMX.jl:默认加载的
map.w确实对应驾车相关的道路距离,不过它支持加载步行专用权重。调用get_map时指定weight_type=:walk,就能获取步行属性的权重数据。 - Graph.jl:作为通用图结构库,本身不内置路由权重,但可以结合OSMX.jl等工具获取的步行数据,自定义步行权重进行计算。
2. 获取节点i到j的步行距离/时间
方法一:通过OSMX.jl直接加载步行权重
using OSMX # 加载包含步行权重的地图 map = get_map("目标区域范围"; weight_type=:walk) # map.w 此时存储的是步行距离(单位:米) # 若要计算时间,可结合步行速度换算(比如默认步行速度取5km/h,约1.39m/s) walk_speed = 1.39 # 单位:米/秒 edge_walk_time = map.w ./ walk_speed # 得到每条边的步行时间(秒)
方法二:自定义步行权重并计算路径
如果需要更精准的步行时间(比如区分人行道、小路等道路类型),可以基于OSMX的原始数据自定义权重:
using OSMX, Graphs, Geodesy # 加载原始OSM数据 osm_data = get_osm("目标区域范围") # 构建有向图 g = SimpleDiGraph(length(osm_data.nodes)) # 初始化权重字典 walk_time_weights = Dict{Tuple{Int,Int}, Float64}() # 遍历所有道路边,计算步行时间 for way in osm_data.ways haskey(way.tags, "highway") || continue # 根据道路类型设置步行速度(单位:米/秒) speed = if way.tags["highway"] == "footway" 1.39 # 对应5km/h elseif way.tags["highway"] == "path" 1.11 # 对应4km/h else 0.83 # 对应3km/h,适用于普通道路步行 end # 计算边的实际长度(利用Geodesy计算球面距离) node_ids = way.nodes total_length = 0.0 for k in 1:length(node_ids)-1 node1 = osm_data.nodes[node_ids[k]] node2 = osm_data.nodes[node_ids[k+1]] # 经纬度转坐标点,计算距离 coord1 = LatLon(node1.lat, node1.lon) coord2 = LatLon(node2.lat, node2.lon) total_length += distance(coord1, coord2) end # 计算该边的步行时间 walk_time = total_length / speed # 向图中添加边并记录权重 u, v = node_ids[1], node_ids[end] add_edge!(g, u, v) walk_time_weights[(u, v)] = walk_time end # 使用Dijkstra算法计算节点i到j的最短步行时间 using Graphs.ShortestPaths dijkstra_result = dijkstra_shortest_paths(g, i; weights=walk_time_weights) walk_time_i_to_j = dijkstra_result.dists[j]
3. 其他可选路由包
- OpenStreetMapX.jl:比OSMX.jl更专注于OSM路由场景,内置步行、驾车、公交等多种权重类型,可直接调用接口计算节点间的步行距离和时间。
内容的提问来源于stack exchange,提问作者yaodao vang
相关产品推荐
相关产品推荐

