文章目录
- 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 更适合用于后期检查和可视化,而不是作为整个路网构建流程的核心工具。
六、尝试用 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 数据,该方案的优点是:
最终得到的路网可以作为后续交通流回放、事件注入、车辆路径规划和仿真评价的基础。
十七、总结
本次大范围高速公路路网构建最大的经验是:不建议完全依赖在线 OSM API,也不建议直接将大范围城市路网一次性导入 SUMO。
更稳定的方式是采用离线化、本地化、可脚本化的处理流程:
离线 OSM 数据下载
→ osmconvert 本地裁剪
→ complete ways 保证拓扑完整
→ osmfilter / 脚本筛选目标高速
→ netconvert 转换 SUMO 路网
→ NetEdit 检查
→ patch 脚本修正
对于工程项目而言,路网构建不只是“能不能导入 SUMO”,更重要的是“能不能稳定复现、能不能复用、能不能支撑后续仿真业务”。
这也是本次从多次失败尝试中得到的最重要经验。


