You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将自定义位置数据集对接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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 23:27:44