如何将自定义位置数据集对接OSMX.jl开展路网分析?
基于OSMX.jl对接自有数据集的实操方案
1. 获取自定义经纬度区域的OSM数据
你无需依赖预下载的torontoF.osm,可直接获取目标区域的OSM数据:
- 手动导出:打开OpenStreetMap官网,框选所需区域,点击「导出」保存为
.osm文件。 - 批量获取:用Overpass QL编写查询,拉取指定经纬度范围的路网数据(如针对矩形区域
[min_lat, min_lon, max_lat, max_lon])。
拿到自定义区域的.osm文件后,替换原代码的文件路径即可:
using OSMX m = get_map_data("your_custom_area.osm", use_cache=false, trim_to_connected_graph=true)
2. 替换随机司机为指定经纬度位置
分两种场景处理你的需求:
场景1:将司机映射到现有路网节点
用OSMX.jl的nearest_node函数,把指定经纬度匹配到路网中最近的节点:
# 示例:你的司机经纬度列表 driver_coords = [(43.6532, -79.3832), (43.6426, -79.3871), ...] # 替换为真实数据 # 转换为路网节点ID driver_nodes = [nearest_node(m, lat, lon) for (lat, lon) in driver_coords]
之后即可用driver_nodes初始化司机位置,与教程中随机分配的逻辑兼容。
场景2:保留自有经纬度节点(不在路网中)
若必须保留原始经纬度作为独立节点,需进入下一步的节点添加流程。
3. 添加自有节点到路网并构建连接
这是对接自有数据集的核心步骤,需确保新节点ID不冲突、并与现有路网连通:
3.1 分配唯一节点ID
先获取现有路网的最大节点ID,从该值+1开始为自有节点分配ID:
# 获取现有节点的最大ID max_existing_id = maximum(keys(m.nodes)) # 示例:你的自有节点数据(司机、乘客) custom_nodes = Dict( "driver_001" => (43.6510, -79.3900), "passenger_001" => (43.6480, -79.3850), # 更多节点... ) # 分配新ID并添加到路网节点字典 new_node_map = Dict() current_id = max_existing_id + 1 for (label, (lat, lon)) in custom_nodes new_node_map[label] = current_id # 用OSMX的Node结构添加节点 m.nodes[current_id] = OSMX.Node(current_id, lat, lon) current_id += 1 end
3.2 建立新节点与现有路网的连接
为每个新节点找到最近的现有路网节点,添加双向连接边(确保路网连通):
# 遍历所有新节点,创建连接边 for (label, new_node_id) in new_node_map lat, lon = custom_nodes[label] # 找到最近的现有路网节点 nearest_node_id = nearest_node(m, lat, lon) # 计算两点间距离(单位:米) dist = OSMX.distance(m.nodes[new_node_id], m.nodes[nearest_node_id], m.bounds) # 参考邻近路段的速度限制(无则设默认值,如50km/h) speed_limit = 50.0 # 尝试从邻近路段获取真实限速(可选) if !isempty(m.edges[nearest_node_id]) sample_way_id = first(m.edges[nearest_node_id])[2] if haskey(m.ways[sample_way_id].tags, "maxspeed") speed_limit = parse(Float64, m.ways[sample_way_id].tags["maxspeed"]) end end # 添加双向边:新节点 ↔ 现有节点(way_id用0标识自定义边) push!(m.edges[new_node_id], (nearest_node_id, 0, dist, speed_limit)) push!(m.edges[nearest_node_id], (new_node_id, 0, dist, speed_limit)) end
3.3 更新路网图结构
添加节点和边后,重新构建图结构以支持最短路径计算:
m.g = OSMX.build_graph(m.nodes, m.edges, m.highway_classes)
4. 后续模型运算支持
完成上述步骤后,即可开展各类分析:
- 最短路径分析:用
OSMX.shortest_path(m.g, start_node_id, end_node_id),支持基于距离或时间的权重计算。 - 行程时长预测:遍历路径上的所有边,用
距离/速度限制累加计算各路段时长,求和得到总时长。 - 运价模型:结合行程时长、距离,以及你的数据中的时间特征(如高峰时段),构建定价公式或训练机器学习模型。
内容的提问来源于stack exchange,提问作者Rainbow
相关产品推荐
相关产品推荐

