OpenstreetmapX.jl路由计算能否限定使用预定义子网路径?
OpenstreetmapX.jl限定路由计算子网范围的实现方案
OpenstreetmapX.jl 完全支持将路由计算范围限定在预定义子网内,你提到的仅允许secondary roadways类型道路通行的需求可以直接通过库自带功能实现,不需要修改库源码。
实现方式
你可以任选以下两种方案,效果一致:
- 方案1:导入阶段过滤构建独立子网
- 导入OSM数据时直接传入道路类型筛选参数,只拉取你需要的secondary类道路数据,排除其他等级道路
- 基于筛选后的数据集单独构建路由拓扑图,此时生成的图结构本身就只包含允许通行的路段,属于你需要的预定义子网
- 后续所有路由计算直接在这个子网上运行即可,结果天然不会包含非允许类型的道路
- 方案2:全量路网下修改边权重实现通行限制
- 如果已经加载了全量路网,不需要重新导入数据,直接修改路由计算的权重矩阵即可:将所有非secondary类型道路对应的边权重设置为
Inf(无穷大) - 路由算法寻路时会自动跳过权重无穷大的不可通行边,最终输出的路径同样只会走允许的secondary道路
- 如果已经加载了全量路网,不需要重新导入数据,直接修改路由计算的权重矩阵即可:将所有非secondary类型道路对应的边权重设置为
注意:不要在全量路网上跑完路由再事后过滤路径里的非允许道路,这种方式会因为寻路阶段就纳入了禁行路段,大概率得到不符合约束的错误结果。
参考代码示例
using OpenstreetmapX # 导入OSM数据,仅保留secondary类道路 osm_dataset = get_osm_data("local_map.osm", roadways=("secondary",)) # 基于筛选后的道路构建子网拓扑 subnet_graph, node_map, edge_map = build_graph(osm_dataset) # 匹配起终点坐标到子网内的对应节点 start_node = nearest_node(start_longitude, start_latitude, node_map) end_node = nearest_node(end_longitude, end_latitude, node_map) # 在子网内计算最短路径 result_route = shortest_path(subnet_graph, start_node, end_node)
如果你的场景里需要允许secondary道路的连接匝道、辅路等附属路段通行,只要在导入数据的roadways参数里追加对应道路类型标签即可,避免出现路网断连导致算不出路径的问题。
内容的提问来源于stack exchange,提问作者Miguel
相关产品推荐
相关产品推荐

