4、路网构建与编辑:使用netedit创建道路、交叉口、车道属性(车道数、限速、方向)、导入OSM数据、路网格式(.net.xml)解析

SUMO(Simulation of Urban MObility)作为一款开源、微观、多模态的交通仿真平台,其仿真精度与可信度高度依赖于路网模型的准确性。在SUMO的生态体系中,.net.xml文件是仿真的地理与逻辑基础,它不仅是车辆移动的物理边界,更是信号灯控制、路径规划、交通流分配等上层逻辑的载体。本章将深入剖析SUMO官方编辑器netedit的核心功能,从零开始构建一个可仿真的路网,并解析其底层XML结构。我们将重点解决三个核心问题:如何手工创建精确的路网元素、如何高效利用OSM(OpenStreetMap)数据生成大规模路网、以及如何理解并调试.net.xml文件中的关键属性。通过本章学习,学员将具备独立完成从“空白画布”到“可运行仿真”的路网构建全流程能力。

netedit路网构建与数据流转核心链路 数据源输入 OSM (.osm) 手工绘制 Shapefile / 其他 netedit 编辑核心 节点(Node) / 边(Edge) 车道(Lane) / 连接(Connection) 信号灯(TLS) / 限速(Speed) 方向(Direction) / 优先级(Priority) 路网输出 .net.xml SUMO 仿真引擎 SUMO-GUI 可视化 .net.xml 结构解析 <edges> / <lanes> / <connections> 属性校验与调试 OSM 导入流程 1. 下载 .osm 数据 2. netedit 导入 3. 清洗与修正 关键车道属性速查 numLanes: 车道数 speed: 限速(m/s) allow/disallow: 允许车型 spreadType: 车道展开类型

4.1 核心原理:从抽象拓扑到可计算路网

在深入操作之前,必须理解SUMO路网的核心抽象模型。SUMO将现实道路网络抽象为有向图(Directed Graph),其中节点(Node/ Junction)代表交叉口或道路端点,边(Edge)代表连接两个节点的道路段。然而,SUMO的边并非单一路径,而是由一条或多条车道(Lane)组成的集合。每条车道拥有独立的几何形状、限速和允许通行的车辆类型。这种“边-车道”的二级结构是SUMO微观仿真的基础,它允许在同一物理道路上模拟不同车道间的速度差与变道行为。

netedit的核心工作原理是将上述抽象模型转化为可视化操作。在netedit中,用户通过创建节点和边来构建拓扑,随后系统自动生成车道几何。但更重要的是,netedit会计算连接(Connection)——即描述车辆如何从一条边的某条车道驶入另一条边的某条车道(例如左转、直行、右转)。连接关系是信号灯配时和路径规划的前提。若连接缺失或错误,车辆将无法通过交叉口,导致仿真崩溃或死锁。

此外,netedit还处理交叉口内部逻辑。当多条边交汇于一个节点时,SUMO会生成一个内部交叉口区域(Internal Junction),并计算冲突点。netedit允许用户手动调整交叉口的通过优先级(Priority)、让行规则(Yielding)以及是否允许在某方向通行。理解这一原理对于处理复杂环岛或非对称交叉口至关重要。

4.2 操作流程:手工构建基础路网

手工构建路网是理解SUMO逻辑的最快途径。以下是通过netedit创建一条双向四车道道路与一个十字交叉口的标准化流程。

  1. 创建节点:在netedit的“Edit”模式下,选择“Create Edge”工具。首先在画布上单击创建两个节点(例如A和B)。此时系统默认生成一条双向两车道的边。若需调整节点位置,可使用“Move”工具精确拖动。
  2. 修改车道属性:选中刚创建的边,在左侧属性面板中修改numLanes为2(表示正向两条车道),并勾选spreadType为“center”以确保车道沿中心线对称展开。此时反向车道会自动生成。设置speed为13.89(约等于50km/h)。
  3. 创建交叉口:使用相同方法创建另一条与AB垂直的边CD。确保CD的端点与AB的某一点重合或相交。netedit会自动在该交点生成一个节点(Junction)。若未自动生成,需手动在交点处添加节点并拆分边。
  4. 检查连接:切换到“Connections”模式,点击交叉口节点。netedit会显示所有可能的转向连接。默认情况下,系统会根据几何形状自动生成直行和右转连接,但左转连接可能需要手动添加。点击“Create Connection”并依次选择起始车道和目标车道,确保所有12个转向方向(4个进口方向×3个出口方向)均已定义。
  5. 设置信号灯(可选):若该交叉口需信号控制,选中节点,在属性栏中点击“Add TLS”按钮,选择信号灯类型(如“static”固定配时)。netedit会生成默认的相位方案,后续可在“TLS”编辑器中调整。
  6. 保存与验证:点击“Save”输出为.net.xml文件。建议在保存前使用“Validate”工具检查网络连通性。若存在孤立边或未连接的节点,系统会给出警告。
经验提醒:在创建道路时,务必注意行驶方向。SUMO中边的方向是从“from”节点指向“to”节点。若需创建单向道路,只需将numLanes设置为所需车道数,并取消勾选“Is Bidirectional”选项。对于双向道路,建议保持默认的“bidirectional”属性,系统会自动生成反向边。

4.3 实战场景:OSM数据导入与清洗

对于城市级路网,手工绘制不切实际。利用OpenStreetMap数据是标准做法。但OSM数据包含大量不适合仿真的元素(如人行道、服务区道路),且拓扑关系复杂。以下是一个完整的导入与清洗案例。

背景与目标:我们需要构建北京市中关村软件园周边5平方公里的可仿真路网,用于分析早晚高峰拥堵。原始OSM数据包含大量内部园区道路和步行道。

操作步骤:

  1. 数据获取:从OpenStreetMap导出该区域的.osm文件。在netedit中,选择“File” -> “Import” -> “OpenStreetMap”。系统弹出导入对话框。
  2. 过滤参数设置:在导入对话框中,关键设置如下:
    • Import All:取消勾选,避免导入所有元素。
    • Highway Types:仅保留motorway、trunk、primary、secondary、tertiary以及residential。剔除footway、cycleway、service(除非是主要服务道路)。
    • Ignore Oneway:不勾选,保留OSM中的单向信息。
    • Speed Limit:勾选“Import Speed Limit”,系统将根据OSM标签(如maxspeed=50)自动设置车道限速。
  3. 导入后检查:导入完成后,路网可能包含大量几何扭曲或断头路。首先使用“Clean Up”工具删除孤立节点和长度小于1米的短边。然后检查交叉口:OSM中的道路交叉点可能未完全重合,导致netedit生成多个距离极近的节点。使用“Merge Junctions”功能,设置合并半径(如5米),将相近节点合并为一个。
  4. 车道数修正:OSM数据中的车道数(lanes=2)通常准确,但部分道路可能缺失该标签。此时netedit默认生成1条车道。需手动选中这些边,根据卫星图或经验修改numLanes。例如,主干道通常为3车道,次干道为2车道。
  5. 连接与信号灯优化:OSM导入后,交叉口的连接通常已自动生成,但左转专用车道可能缺失。需在“Connections”模式下检查主要交叉口,为左转车道添加专用相位。同时,OSM中的信号灯信息(highway=traffic_signals)会被导入为信号灯节点,但配时方案需手动调整。

结果对比与复盘:清洗前,路网包含约1200条边,其中300条为步行道或服务道。清洗后,边数降至850条,仿真速度提升约40%。在后续仿真中,我们发现某环形交叉口出现车辆停滞,经检查是OSM中该环岛的连接关系错误,导致车辆无法驶出。通过手动重新创建连接并调整让行规则解决。

风险提示:OSM数据具有时效性,且不同地区的精度差异较大。导入后务必进行实地校验或与最新卫星图比对。切勿直接使用未经清洗的OSM数据进行仿真,否则可能因道路类型错误(如将高速公路匝道识别为普通道路)导致仿真结果严重失真。

4.4 路网格式解析:解剖.net.xml

.net.xml是SUMO的核心输入文件,其本质是XML文档。理解其结构是进行高级定制(如动态限速、车道关闭)的前提。以下是一个简化示例及关键标签解析:

<?xml version="1.0" encoding="UTF-8"?>
<net version="1.6" junctionCornerDetail="5" limitTurnSpeed="5.00">
    <location netOffset="0.00,0.00" convBoundary="0.00,0.00,1000.00,800.00" origBoundary="116.30,39.95,116.31,39.96" projParameter="+proj=utm +zone=50 +ellps=WGS84 +datum=WGS84 +units=m +no_defs"/>
    
    <edge id="gneE0" from="gneJ0" to="gneJ1" priority="1" type="highway.primary">
        <lane id="gneE0_0" index="0" speed="13.89" length="300.00" shape="0.00,-3.50 300.00,-3.50"/>
        <lane id="gneE0_1" index="1" speed="13.89" length="300.00" shape="0.00,3.50 300.00,3.50"/>
    </edge>
    
    <edge id="gneE1" from="gneJ1" to="gneJ0" priority="1" type="highway.primary">
        <lane id="gneE1_0" index="0" speed="13.89" length="300.00" shape="300.00,-3.50 0.00,-3.50"/>
        <lane id="gneE1_1" index="1" speed="13.89" length="300.00" shape="300.00,3.50 0.00,3.50"/>
    </edge>
    
    <junction id="gneJ0" x="0.00" y="0.00" type="dead_end">
        <request index="0" response="0" foes="0" cont="0"/>
    </junction>
    
    <junction id="gneJ1" x="300.00" y="0.00" type="priority">
        <request index="0" response="1" foes="1" cont="0"/>
        <request index="1" response="0" foes="0" cont="0"/>
    </junction>
    
    <connection from="gneE0" to="gneE1" fromLane="0" toLane="0" via="gneJ1_0"/>
    <connection from="gneE0" to="gneE1" fromLane="1" toLane="1" via="gneJ1_1"/>
</net>

关键解析点如下:

  • <location>:定义了坐标系转换参数。其中projParameter表示投影方式(此处为UTM Zone 50),convBoundary是转换后的边界,origBoundary是原始经纬度边界。若需将路网与外部GIS数据叠加,此部分至关重要。
  • <edge>:代表一条有向边。from和to属性定义了方向。注意gneE0和gneE1是两条方向相反的边,共同构成一条双向道路。每条边包含一个或多个<lane>子元素。
  • <lane>:核心属性包括id(格式为“边ID_车道索引”)、speed(单位m/s)、length(单位m)、shape(车道中心线的二维坐标序列)。shape决定了车道的几何走向,对于弯道,该属性包含多个坐标点。
  • <junction>:定义节点。type属性有priority(优先权)、dead_end(死胡同)、traffic_light(信号灯)等。内部的<request>元素定义了该节点内各流向的冲突关系,是SUMO进行无信号交叉口让行判断的依据。
  • <connection>:定义车道级连接。fromLane和toLane指定了具体车道,via属性指向内部交叉口的一条虚拟车道(用于描述车辆在交叉口内的行驶轨迹)。
调试技巧:当仿真出现“Vehicle is stuck”错误时,首先检查.net.xml中对应位置的<connection>是否存在且方向正确。其次检查<junction>的type是否为priority,若为dead_end则车辆无法通过。使用SUMO自带的netedit打开该文件,在“Connections”模式下可直观看到缺失的连接。

4.5 常见误区与总结复盘

误区类型 具体表现 后果 正确做法
车道方向错误 单向道路未设置isBidirectional="false" 车辆逆行,仿真崩溃 在netedit中检查边属性,确保单向边仅有一条方向
限速单位混淆 将km/h数值直接填入speed属性 车辆行驶速度异常(过快或过慢) SUMO中speed单位是m/s,需除以3.6换算
连接缺失 交叉口仅自动生成直行连接,左转缺失 左转车辆消失或卡死 手动在Connections模式中补全所有转向
OSM数据未清洗 导入了人行道、内部道路 路网冗余,仿真效率低,且可能产生不合理路径 严格过滤highway类型,合并相近节点
忽略交叉口内部逻辑 未调整priority节点的让行规则 次要道路车辆不避让主路,造成碰撞 在junction属性中设置合适的priority值

总结复盘:构建高质量路网的核心在于“拓扑正确、属性精确、连接完整”。netedit提供了强大的可视化工具,但自动化生成的结果必须经过人工校验。建议在完成路网构建后,使用SUMO自带的sumo命令配合--tripinfo-output进行小流量测试,观察车辆轨迹是否合理。对于复杂交叉口,务必放大检查连接关系。路网构建是仿真项目的基石,投入在此阶段的时间将在后续仿真调试中成倍回报。