欢迎光临
我们一直在努力

SUMO 大范围高速公路路网构建实践:从 OSM 数据获取到 net.xml 转换的踩坑记录

文章目录

  • SUMO 大范围高速公路路网构建实践:从 OSM 数据获取到 net.xml 转换的踩坑记录
    • 一、背景
    • 二、最初尝试:直接从 OSM 地图框选导入
    • 三、尝试 Overpass Turbo:仍然受限于 API
    • 四、尝试 QGIS QuickOSM 插件:本质仍是在线请求
    • 五、尝试在 QGIS 中导入省级 OSM 数据
    • 六、尝试用 netconvert 直接命令行裁剪 .osm.pbf
    • 七、使用 osmconvert 本地裁剪:第一次失败原因
    • 八、最终解决方法:离线 OSM + 本地裁剪 + 属性筛选 + netconvert 转换
    • 九、步骤 1:下载包含目标区域的原始 OSM 数据
    • 十、步骤 2:使用 osmconvert 进行本地范围裁剪
    • 十一、步骤 3:筛选目标高速主线和必要互通
    • 十二、步骤 4:使用 netconvert 转换为 SUMO 路网
    • 十三、步骤 5:使用 NetEdit 检查和修正路网
    • 十四、步骤 6:脚本化 patch,提高工程复用性
    • 十五、几个关键经验总结
      • 1. 大范围路网不建议直接依赖在线 API
      • 2. 不建议直接用 netconvert 处理大体量 .osm.pbf
      • 3. OSM 裁剪一定要保证道路完整性
      • 4. 不能只按 ref 完全等于目标编号筛选
      • 5. motorway_link 不能全部删除
      • 6. netconvert 之后仍然需要人工检查
      • 7. 工程项目中要尽量脚本化
    • 十六、最终效果
    • 十七、总结

SUMO 大范围高速公路路网构建实践:从 OSM 数据获取到 net.xml 转换的踩坑记录

一、背景

最近在做一个基于 SUMO 的高速公路交通仿真项目,需要在 SUMO 中构建一段较大范围的高速公路路网。

虽然实际仿真重点只涉及其中某个局部路段,但从工程化和复用性的角度考虑,不能只截取局部道路。因为后续可能还需要扩展到其他路段、其他事件场景,或者复用同一套路网构建流程。

因此,路网构建目标可以概括为:

在 SUMO 中尽可能完整地呈现目标高速主线,同时只保留必要的互通和匝道,筛除与仿真无关的城市道路、支路和其他道路。

这个目标看起来并不复杂,但实际处理 OSM 数据时遇到了不少问题。本文主要记录从 OSM 数据获取、筛选、裁剪到最终转换为 SUMO .net.xml 路网文件的完整过程。


二、最初尝试:直接从 OSM 地图框选导入

一开始的思路比较直接:在 OSM 地图上框选目标高速所在区域,然后导出地图数据,再使用 SUMO 的 netconvert 转换为 .net.xml。

但实际操作中很快遇到问题。

目标高速覆盖范围较大,如果直接框选整个区域,会包含大量与目标无关的城市道路、支路、建筑物、节点和兴趣点。这样带来两个问题:

第一,数据量非常大,在线 API 请求容易超时或失败。

第二,即使成功下载,导入 SUMO 后也会生成大量无关路网,后续清理成本很高。

因此,直接通过 OSM 地图框选大范围区域并不是一个稳定的工程化方案。


三、尝试 Overpass Turbo:仍然受限于 API

随后尝试使用 Overpass Turbo。

Overpass Turbo 可以通过查询语句筛选 OSM 数据,例如按道路类型和道路编号提取:

highway=motorway
ref=目标高速编号

理论上,这种方式比直接框选地图更精确,可以减少无关道路。

但是实际使用时仍然存在一个核心问题:Overpass Turbo 本质上仍然依赖 Overpass API。

由于目标高速范围较大,查询涉及的节点和道路较多,经常出现请求超时、返回不完整或者 API 调用失败的问题。对于小范围临时查询来说可以尝试,但如果作为项目中的稳定路网构建流程,可靠性不够。


四、尝试 QGIS QuickOSM 插件:本质仍是在线请求

接下来尝试使用 QGIS 的 QuickOSM 插件。

QuickOSM 可以在 QGIS 图形界面中根据关键词和范围提取 OSM 数据,操作上比手写 Overpass 查询方便一些。最开始的预期是:通过 QGIS 可视化界面筛选目标高速,再导出为 OSM 文件。

但实际使用后发现,QuickOSM 的底层仍然是调用 Overpass API。

也就是说,它只是把 Overpass 查询包装成了图形界面,无法从根本上解决大范围数据请求失败的问题。

对于小范围路网提取,QuickOSM 很方便;但对于大范围高速公路,仍然容易遇到响应慢、请求失败、数据不完整等问题。


五、尝试在 QGIS 中导入省级 OSM 数据

在线 API 方式不稳定后,又尝试下载省级 OSM 数据,然后在 QGIS 中本地加载和筛选。

这个思路的优点是避免在线 API 请求,改成本地处理。但是在实际操作中也遇到了一些问题:

  • QGIS 提示需要安装 OSM 相关插件;
  • 更换 QGIS 版本后仍然存在兼容性问题;
  • 图层加载和显示不稳定;
  • 大体量 OSM 数据在 QGIS 中可视化和筛选效率较低;
  • 仍然需要依赖底图或插件支持,操作链路较重。
  • 因此,QGIS 更适合用于后期检查和可视化,而不是作为整个路网构建流程的核心工具。


    六、尝试用 netconvert 直接命令行裁剪 .osm.pbf

    中间还尝试过直接使用 SUMO 的 netconvert 对下载好的 .osm.pbf 文件进行裁剪和转换,希望一步完成“区域裁剪 + 路网转换”。

    这个思路看起来比较直接,因为 .osm.pbf 本身就是 OSM 的二进制地图数据格式,理论上可以作为 SUMO 路网转换的数据源。但在实际处理大范围高速公路路网时,这种方式并不理想。

    首先,原始 .osm.pbf 文件覆盖范围较大,内部包含大量与目标高速无关的城市道路、普通道路、节点、建筑物和其他地图要素。直接使用 netconvert 处理时,转换压力较大,速度慢,且生成结果不可控。

    其次,netconvert 更适合完成“路网转换”,而不是完成精细化的 OSM 数据筛选。对于本文这种需求,需要保留目标高速主线及必要互通,同时删除大量无关道路。如果直接依赖 netconvert 参数进行裁剪,很难同时保证主线连续、互通完整和无关道路充分剔除。

    另外,直接从 .osm.pbf 一步转换为 .net.xml,中间缺少可检查的 OSM 子集文件。一旦出现主线断裂、匝道缺失、无关道路过多或转换失败等问题,很难判断问题发生在空间裁剪、道路筛选还是 SUMO 转换阶段。

    因此,最终没有采用 netconvert 直接裁剪 .osm.pbf 的方式,而是将流程拆分为:先使用 osmconvert 对 .osm.pbf 进行本地范围裁剪,再使用 osmfilter 或脚本筛选目标高速主线和必要互通,最后再交给 netconvert 转换为 SUMO 的 .net.xml 路网文件。


    七、使用 osmconvert 本地裁剪:第一次失败原因

    后来改用 osmconvert 对离线 .osm.pbf 数据进行本地裁剪。

    这个方向是正确的,因为它将“地图范围裁剪”和“SUMO 路网转换”拆成了两个步骤:先得到一个较小、较干净的 OSM 子集,再交给 netconvert 转换。

    但是第一次处理时仍然出现了问题:裁剪后再使用 netconvert 转换时,报出了类似 no nodes 的错误。

    原因在于:裁剪 OSM 数据时没有加入保证道路完整性的参数,例如 –complete-ways。

    如果只是简单按经纬度范围截取,可能只截取到了道路的一部分,而没有保留完整的道路节点。这样在后续转换时,SUMO 无法根据不完整的节点和边生成有效路网,就会出现道路断裂、缺少节点、无法转换等问题。

    也就是说,路网裁剪不能只考虑“空间范围”,还必须考虑“道路拓扑完整性”。


    八、最终解决方法:离线 OSM + 本地裁剪 + 属性筛选 + netconvert 转换

    最终采用的方案是:

    离线 OSM 数据获取 → 本地范围裁剪 → 目标高速主线与必要互通筛选 → complete ways 保证道路完整 → netconvert 转换 → NetEdit 和脚本 patch 修正。

    具体流程如下。


    九、步骤 1:下载包含目标区域的原始 OSM 数据

    首先,不再依赖 Overpass Turbo 或 QuickOSM 这类在线 API,而是直接下载包含目标区域的原始 OSM 数据。

    可以选择下载省级、城市级或更大范围的 OSM 数据,只要确保数据范围能够覆盖完整目标高速即可。

    这一步的核心目标是:

    把在线请求问题转化为本地文件处理问题。

    这样后续所有筛选、裁剪、转换都可以在本地完成,不再受 API 超时和网络波动影响。


    十、步骤 2:使用 osmconvert 进行本地范围裁剪

    拿到原始 OSM 数据后,使用 osmconvert 按经纬度范围裁剪出目标高速附近区域。

    示意命令如下:

    osmconvert province.osm.pbf \\
    -b=min_lon,min_lat,max_lon,max_lat \\
    –complete-ways \\
    -o=target_area.osm

    其中:

    -b=左经度,下纬度,右经度,上纬度

    表示裁剪范围。

    例如:

    -b=min_lon,min_lat,max_lon,max_lat

    这里最关键的是:

    –complete-ways

    该参数用于保证被裁剪道路的完整性,尽量保留道路所需的节点信息,避免后续转换时出现 no nodes 或道路断裂问题。


    十一、步骤 3:筛选目标高速主线和必要互通

    裁剪出目标区域后,仍然会包含大量无关道路。因此需要进一步筛选。

    筛选原则是:

  • 保留目标高速主线;
  • 保留必要的高速互通和匝道;
  • 删除城市道路、支路、普通道路和无关高速;
  • 对与目标高速共线的道路进行特殊保留。
  • 可以重点保留以下 OSM 道路类型:

    highway=motorway
    highway=motorway_link

    其中:

    • motorway 通常对应高速主线;
    • motorway_link 通常对应高速匝道或互通连接线。

    同时根据 ref 字段筛选与目标高速相关的道路,例如:

    ref=目标高速编号
    ref=其他高速编号;目标高速编号

    这里需要注意,实际 OSM 数据中,目标高速的部分路段可能与其他高速共线,因此不能只保留 ref=目标高速编号,还要考虑类似 其他高速编号;目标高速编号 这种组合编号。否则可能会误删部分主线路段。

    可以使用 osmfilter 或自写脚本完成筛选。

    示意逻辑如下:

    保留条件:
    1. highway 为 motorway 或 motorway_link;
    2. ref 字段包含目标高速编号;
    3. 对于必要互通匝道,可适当保留与目标高速相连的 motorway_link。


    十二、步骤 4:使用 netconvert 转换为 SUMO 路网

    完成 OSM 数据裁剪和筛选后,就可以使用 SUMO 的 netconvert 转换为 .net.xml。

    示意命令如下:

    netconvert \\
    –osm-files target_highway_filtered.osm \\
    -o target_highway.net.xml

    实际项目中可以根据需要增加其他参数,例如:

    netconvert \\
    –osm-files target_highway_filtered.osm \\
    –output-file target_highway.net.xml \\
    –geometry.remove \\
    –roundabouts.guess \\
    –ramps.guess \\
    –junctions.join \\
    –tls.guess false

    这些参数的作用大致包括:

    • 简化部分几何形状;
    • 自动识别环岛或匝道;
    • 合并部分节点;
    • 避免不必要的信号灯生成。

    具体参数需要根据路网转换结果调整,不能一套命令完全适配所有路网。


    十三、步骤 5:使用 NetEdit 检查和修正路网

    netconvert 转换后,并不代表路网就完全可用了。

    还需要使用 SUMO 自带的 NetEdit 进行人工检查,重点包括:

  • 目标高速主线是否连续;
  • 是否存在明显断头路;
  • 互通和匝道是否被误删;
  • 主线车道数是否正确;
  • 关键路段附近连接关系是否合理;
  • 是否需要补充特殊车道;
  • 匝道与主线连接是否符合实际驾驶逻辑。
  • 在实际项目中,后续还可以根据仿真需求进行专门修正,例如:

    • 补充应急车道或专用车道;
    • 修正匝道与主线的车道连接;
    • 设置主线不同车道的通行规则;
    • 设置不同车辆类型的限速和允许车道;
    • 对重点路段附近车道进行 patch 修正。

    十四、步骤 6:脚本化 patch,提高工程复用性

    由于项目目标不是一次性做一个 demo,而是希望后续能够复用到其他场景或其他路段,因此不能完全依赖手动修改。

    对于一些固定规则,最好通过脚本或 patch 文件进行维护,例如:

  • 主线车道限速规则;
  • 不同车型分道行驶规则;
  • 特殊车道补充;
  • 特定路段连接修正;
  • 匝道连接关系修正;
  • 无关边和无关节点清理。
  • 这样后续如果重新生成路网,只需要重新执行 patch 脚本,就可以快速恢复项目所需的路网结构。

    最终形成的处理流程如下:

    原始 .osm.pbf

    osmconvert 本地范围裁剪

    –complete-ways 保证道路完整

    osmfilter / 脚本筛选目标高速主线与必要互通

    netconvert 转换为 SUMO net.xml

    NetEdit 检查主线、互通、连接关系

    脚本 patch 修正车道规则、特殊车道和关键连接

    得到可用于交通仿真的目标高速路网


    十五、几个关键经验总结

    1. 大范围路网不建议直接依赖在线 API

    Overpass Turbo 和 QuickOSM 都很方便,但它们更适合小范围、临时性的 OSM 数据提取。

    对于大范围高速公路,更推荐使用离线 OSM 数据进行本地处理。


    2. 不建议直接用 netconvert 处理大体量 .osm.pbf

    netconvert 更适合完成路网转换,不适合作为精细化 OSM 数据清洗工具。

    如果直接将大范围 .osm.pbf 文件交给 netconvert 处理,很容易出现数据量过大、无关道路过多、主线或匝道筛选不精准、问题难以定位等情况。

    更推荐的方式是:

    先用 osmconvert / osmfilter 处理 OSM 数据
    再用 netconvert 转换 SUMO 路网

    也就是把“数据裁剪筛选”和“SUMO 路网转换”拆开处理。


    3. OSM 裁剪一定要保证道路完整性

    只按经纬度范围裁剪是不够的。

    如果没有保留完整道路节点,后续转换时很容易出现:

    no nodes
    edge cannot be built
    road disconnected

    因此,使用 osmconvert 时要注意加入类似:

    –complete-ways

    这样的参数。


    4. 不能只按 ref 完全等于目标编号筛选

    实际 OSM 数据中,道路编号可能不是单一字段。

    例如部分路段可能写成:

    目标高速编号
    其他高速编号;目标高速编号

    如果只保留 ref=目标高速编号,可能会误删共线路段,导致目标高速主线不连续。

    因此筛选时应使用“包含目标高速编号”的逻辑,而不是“完全等于目标高速编号”。


    5. motorway_link 不能全部删除

    为了让路网简洁,很容易只保留 motorway,删除 motorway_link。

    但这样会导致互通和匝道消失,车辆路径可能无法正常进出主线。

    比较合理的方式是:

    • 主线保留 motorway;
    • 必要互通保留 motorway_link;
    • 无关城市道路和普通支路删除。

    6. netconvert 之后仍然需要人工检查

    netconvert 只是把 OSM 数据转换成 SUMO 路网,并不能保证生成结果完全符合仿真需求。

    尤其是高速公路仿真,还需要重点检查:

    • 车道数;
    • 匝道连接;
    • 限速;
    • 特殊车道;
    • 主线连续性;
    • 重点路段附近连接关系。

    7. 工程项目中要尽量脚本化

    如果只是一次性仿真,可以手动修路网。

    但如果项目要复用,就应该将规则修正、特殊车道添加、车道限速设置、连接关系修正等步骤尽量脚本化。

    这样后续更换 OSM 数据或重新生成路网时,不需要重新手动修改。


    十六、最终效果

    通过上述流程,最终构建出了一个覆盖目标高速主线及必要互通的 SUMO 路网。

    相比直接导入大范围 OSM 数据,该方案的优点是:

  • 避免了在线 API 调用失败;
  • 路网规模更可控;
  • 保留了目标高速主线和关键互通;
  • 删除了大量无关道路;
  • 支持后续交通流输入、事件场景构建和仿真评价;
  • 具备一定工程复用能力。
  • 最终得到的路网可以作为后续交通流回放、事件注入、车辆路径规划和仿真评价的基础。


    十七、总结

    本次大范围高速公路路网构建最大的经验是:不建议完全依赖在线 OSM API,也不建议直接将大范围城市路网一次性导入 SUMO。

    更稳定的方式是采用离线化、本地化、可脚本化的处理流程:

    离线 OSM 数据下载
    → osmconvert 本地裁剪
    → complete ways 保证拓扑完整
    → osmfilter / 脚本筛选目标高速
    → netconvert 转换 SUMO 路网
    → NetEdit 检查
    → patch 脚本修正

    对于工程项目而言,路网构建不只是“能不能导入 SUMO”,更重要的是“能不能稳定复现、能不能复用、能不能支撑后续仿真业务”。

    这也是本次从多次失败尝试中得到的最重要经验。

    赞(0)
    未经允许不得转载:171主机测评 » SUMO 大范围高速公路路网构建实践:从 OSM 数据获取到 net.xml 转换的踩坑记录
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址