3. 路网生成(二)
上一章我们聊了怎么从零手搓一个路网。说实话,那种方式适合小场景,比如一个十字路口、一条单行道。但你要是做真实城市的仿真,手画路网?那得画到猴年马月去。
这一章,我们来点实在的——直接从 OpenStreetMap 拉数据,用 netconvert 转成 SUMO 能用的路网。我在项目里试过几十个城市的数据,从北京二环到德国小镇,这套流程基本没翻过车。
3.1 为什么选 OSM?
OpenStreetMap 是个开源地图平台。说白了,就是全球网友一起画的地图。数据免费,覆盖广,更新快。
我个人的习惯是:只要项目需要真实路网,第一反应就是去 OSM 拉数据。为什么?
- 免费:商业地图数据动不动几万块,OSM 零成本
- 全球覆盖:你随便说个城市,基本都有
- 细节丰富:车道数、限速、转向限制、红绿灯位置……都有
- 社区活跃:有问题去论坛问,半天就有人回
3.2 获取 OSM 数据
获取 OSM 数据有几种方式。我常用的是 Overpass API 和 直接下载。
3.2.1 方法一:Overpass Turbo(推荐)
Overpass Turbo 是个在线工具。你画个框,它就把框里的数据全拉出来。
- 打开 https://overpass-turbo.eu/
- 在地图上框选你要的区域
- 点击「导出」→「直接下载」→ 保存为
.osm文件
嗯,这里要注意:框选范围别太大。我见过有人框了整个北京市,结果文件几百兆,电脑直接卡死。建议一次框 2-5 平方公里,够用了。
3.2.2 方法二:Geofabrik 下载
Geofabrik 提供了按国家/地区划分的 OSM 数据包。适合大范围数据获取。
- 网址:https://download.geofabrik.de/
- 选择「亚洲」→「中国」→ 下载
.osm.pbf文件
不过 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 里编辑。
3.5 验证路网质量
转换完成后,别急着往下走。先验证一下路网质量。
我一般做三步检查:
- 用 SUMO-GUI 打开:肉眼扫一遍,看有没有断头路、飞出路
- 检查路网统计信息:
netconvert --statistics看节点数、边数、车道数是否合理 - 跑一个简单流量测试:放几辆车跑一圈,看能不能正常通行
记得有一次,我在成都的项目里,转换后路网看起来没问题,但一跑车就卡在某个路口不动。后来发现是那个路口的转向限制没处理好。所以,跑车测试这一步千万别省。
3.6 本章知识体系
下面这张图总结了从 OSM 数据到 SUMO 路网的完整流程:
这张图把整个流程串起来了。你从 OSM 拿数据,经过 netconvert 加工,生成路网,最后验证。遇到问题就回退调整参数或数据。
好了,这一章的内容就到这。用 netconvert 导入 OSM 数据,说白了就是「拉数据 → 转格式 → 调参数 → 验证」四步走。你只要记住那几个关键参数,大部分场景都能搞定。
可可精品资料库