如何将Excel中的真实天气与事故数据集成到SUMO仿真系统?
1. 天气文件加载的问题
你的启动命令存在错误:sumo -c network.net.xml 是不正确的,-c 参数指定的是SUMO的配置文件(.sumocfg),而非路网文件(.net.xml)。正确的启动方式有两种:
方式一:通过配置文件整合参数
先创建一个.sumocfg配置文件,示例内容如下:<configuration> <input> <net-file value="network.net.xml"/> <route-files value="trip.trips.xml"/> <weather-file value="meteo.xml"/> </input> <time> <end value="3600"/> </time> <output> <output-file value="simulation.sumo.out"/> </output> </configuration>随后运行命令:
sumo -c your_config.sumocfg方式二:命令行直接指定所有必要参数
修正后的命令:sumo -n network.net.xml -r trip.trips.xml -e 3600 --weather-file meteo.xml --output-file simulation.sumo.out这里用
-n指定路网、-r指定路线文件,替代了错误的-c network.net.xml。
另外,meteo.xml必须符合SUMO的天气数据格式规范,示例结构如下:
<weather> <interval begin="0" end="1800" visibility="5000" precipitation="0.5" type="rain"/> <interval begin="1800" end="3600" visibility="2000" precipitation="1.2" type="heavy_rain"/> </weather>
需确保每个<interval>的时间为仿真秒数,visibility(单位米)、precipitation(单位mm/h)等参数符合SUMO要求,否则文件会加载失败。
2. 事故数据的集成方法
SUMO支持两种主流的事故集成方式:
静态XML文件方式
将事故数据转换为SUMO的<incident>格式XML文件,通过--additional-files参数加载。事故数据需包含:事故发生时间(仿真秒)、所在路段(edge ID)、事故类型、持续时间、影响范围等。示例XML结构:
<additional> <incident id="accident_1" type="block" begin="1000" end="1500" edge="edge_0" lane="0" severity="high"/> <incident id="accident_2" type="slowdown" begin="2000" end="2300" edge="edge_5" lane="1" severity="medium"/> </additional>
启动时添加参数:--additional-files accident.xml(也可写入.sumocfg的<additional-files>节点)
动态注入(TraCI脚本)
如果事故逻辑复杂(比如需根据仿真状态触发),可以用Python编写TraCI脚本,实时读取你的事故数据(从XLS/CSV读取后转成数据结构),在对应时间点调用TraCI接口创建事故。示例代码片段:
import traci import pandas as pd # 读取事故数据 accident_data = pd.read_excel("accidents.xls") # 将真实时间转换为仿真秒数 accident_data["begin"] = accident_data["real_time"].apply(lambda x: x.total_seconds()) traci.start(["sumo", "-c", "your_config.sumocfg"]) step = 0 while step < 3600: traci.simulationStep() # 检查当前时间是否有事故需要触发 current_accidents = accident_data[accident_data["begin"] == step] for idx, row in current_accidents.iterrows(): # 创建阻塞型事故 traci.incident.create(row["id"], row["edge"], row["lane"], row["end"] - step, type=row["type"]) step += 1 traci.close()
3. XLS/CSV数据转SUMO格式的通用流程
不管是天气还是事故数据,通用转换步骤如下:
- 步骤1:用Python的
pandas读取XLS/CSV文件import pandas as pd # 读取天气数据 weather_df = pd.read_excel("weather_data.xls") # 读取事故数据 accident_df = pd.read_csv("accident_data.csv") - 步骤2:数据预处理
- 将真实时间转换为仿真秒数(以仿真开始时间为0点,计算相对秒数)
- 匹配路网的edge/lane ID(确保数据中的位置信息能对应到SUMO路网中的ID,可能需要提前用路网工具做映射)
- 过滤无效数据,确保参数符合SUMO的取值范围(比如visibility单位为米,precipitation单位为mm/h)
- 步骤3:生成SUMO规范的XML文件
用Python的xml.etree.ElementTree库生成符合要求的XML。以天气文件为例:import xml.etree.ElementTree as ET root = ET.Element("weather") for idx, row in weather_df.iterrows(): interval = ET.SubElement(root, "interval") interval.set("begin", str(int(row["begin_seconds"]))) interval.set("end", str(int(row["end_seconds"]))) interval.set("visibility", str(row["visibility"])) interval.set("precipitation", str(row["precipitation"])) interval.set("type", row["weather_type"]) tree = ET.ElementTree(root) tree.write("meteo.xml", encoding="utf-8", xml_declaration=True)
内容的提问来源于stack exchange,提问作者rachid

