第三章 路网生成(二):使用 netconvert 导入 OSM 地图数据

上一章我们聊了怎么从零手搓一个路网。说实话,那种方式适合小场景,比如一个十字路口、一条单行道。但你要是做真实城市的仿真,手画路网?那得画到猴年马月去。

这一章,我们来点实在的——直接从 OpenStreetMap 拉数据,用 netconvert 转成 SUMO 能用的路网。我在项目里试过几十个城市的数据,从北京二环到德国小镇,这套流程基本没翻过车。

3.1 为什么选 OSM?

OpenStreetMap 是个开源地图平台。说白了,就是全球网友一起画的地图。数据免费,覆盖广,更新快。

我个人的习惯是:只要项目需要真实路网,第一反应就是去 OSM 拉数据。为什么?

  • 免费:商业地图数据动不动几万块,OSM 零成本
  • 全球覆盖:你随便说个城市,基本都有
  • 细节丰富:车道数、限速、转向限制、红绿灯位置……都有
  • 社区活跃:有问题去论坛问,半天就有人回
小提示:OSM 的数据质量参差不齐。大城市数据很准,偏远地区可能缺胳膊少腿。我建议先用小范围测试一下。

3.2 获取 OSM 数据

获取 OSM 数据有几种方式。我常用的是 Overpass API 和 直接下载。

3.2.1 方法一:Overpass Turbo(推荐)

Overpass Turbo 是个在线工具。你画个框,它就把框里的数据全拉出来。

  1. 打开 https://overpass-turbo.eu/
  2. 在地图上框选你要的区域
  3. 点击「导出」→「直接下载」→ 保存为 .osm 文件

嗯,这里要注意:框选范围别太大。我见过有人框了整个北京市,结果文件几百兆,电脑直接卡死。建议一次框 2-5 平方公里,够用了。

3.2.2 方法二:Geofabrik 下载

Geofabrik 提供了按国家/地区划分的 OSM 数据包。适合大范围数据获取。

不过 Geofabrik 的数据是整个国家的,你需要用 osmconvert 或 osmium 裁剪出你要的区域。我个人觉得麻烦,除非做全国级仿真,否则还是 Overpass Turbo 顺手。

3.3 使用 netconvert 转换 OSM 数据

拿到 .osm 文件后,下一步就是用 netconvert 转成 SUMO 路网。命令很简单:

netconvert --osm-files my_area.osm -o my_area.net.xml

就这么一行。跑完之后你会得到一个 .net.xml 文件,这就是 SUMO 能识别的路网了。

但说实话,直接这么跑出来的路网,往往问题一堆。我曾经在杭州的项目里,直接转换后路网乱成一锅粥——车道方向反了、路口连不上、限速值离谱……

所以,我们需要加一些参数来调优。

3.3.1 常用参数

参数 作用 示例
--geometry.remove 简化道路几何形状,减少节点数 --geometry.remove
--roundabouts.guess 自动识别环岛 --roundabouts.guess
--ramps.guess 自动识别匝道 --ramps.guess
--junctions.join 合并距离过近的交叉口 --junctions.join
--tls.guess-signals 自动识别信号灯 --tls.guess-signals
--output.original-names 保留 OSM 原始道路名称 --output.original-names

我一般会这样组合使用:

netconvert --osm-files my_area.osm \
           -o my_area.net.xml \
           --geometry.remove \
           --roundabouts.guess \
           --ramps.guess \
           --junctions.join \
           --tls.guess-signals \
           --output.original-names
重点:--geometry.remove 这个参数我强烈建议加上。不加的话,路网文件会大很多,而且 SUMO 跑起来也慢。说白了就是去掉多余的弯道节点,只保留关键点。

3.4 处理常见问题

转换过程中,你可能会遇到一些报错或警告。别慌,大部分都能解决。

3.4.1 警告:缺失车道数

OSM 里有些道路没标车道数。netconvert 会默认设为 1。但实际可能是双向两车道或四车道。

解决办法:手动指定默认车道数。

netconvert --osm-files my_area.osm \
           -o my_area.net.xml \
           --default.lanewidth 3.5 \
           --default.lanenumber 2

这样所有未标注车道数的道路,都会默认变成双向两车道。宽度 3.5 米。

3.4.2 警告:限速值异常

OSM 里有些道路限速标得离谱。比如城市道路标 120 km/h。我遇到过一条小巷子标 200 km/h,一看就是数据录入错误。

解决办法:设置限速范围。

netconvert --osm-files my_area.osm \
           -o my_area.net.xml \
           --speed-limit.min 10 \
           --speed-limit.max 120

超出范围的限速值会被自动修正到边界值。

3.4.3 错误:路口连接失败

有时候两条路明明在 OSM 里是交叉的,但转换后却连不上。这通常是因为 OSM 数据里两条路的节点没对齐。

解决办法:使用 --junctions.join 参数,或者手动在 OSM 里编辑。

注意:如果路口连接失败严重,建议回 OSM 里检查数据。用 JOSM 编辑器手动对齐节点,比在 netconvert 里硬调要靠谱得多。

3.5 验证路网质量

转换完成后,别急着往下走。先验证一下路网质量。

我一般做三步检查:

  1. 用 SUMO-GUI 打开:肉眼扫一遍,看有没有断头路、飞出路
  2. 检查路网统计信息:netconvert --statistics 看节点数、边数、车道数是否合理
  3. 跑一个简单流量测试:放几辆车跑一圈,看能不能正常通行

记得有一次,我在成都的项目里,转换后路网看起来没问题,但一跑车就卡在某个路口不动。后来发现是那个路口的转向限制没处理好。所以,跑车测试这一步千万别省。

3.6 本章知识体系

下面这张图总结了从 OSM 数据到 SUMO 路网的完整流程:

获取 OSM 数据 netconvert 转换 加参数调优 .net.xml 验证路网质量 GUI查看 + 统计 + 跑车测试 常见问题与处理 • 缺失车道数 → 加 --default.lanenumber • 限速值异常 → 加 --speed-limit.min/max • 路口连接失败 → 加 --junctions.join • 数据质量问题 → 回 OSM 编辑

这张图把整个流程串起来了。你从 OSM 拿数据,经过 netconvert 加工,生成路网,最后验证。遇到问题就回退调整参数或数据。

我的经验:第一次转换时,别追求完美。先跑通流程,再慢慢调优。我曾经花了一整天调一个路口的连接,后来发现直接删掉重建更快。

好了,这一章的内容就到这。用 netconvert 导入 OSM 数据,说白了就是「拉数据 → 转格式 → 调参数 → 验证」四步走。你只要记住那几个关键参数,大部分场景都能搞定。

可可精品资料库