如何将Excel中的OD矩阵导入XML并仅用XML修改SUMO文件?
将Excel多OD矩阵导入SUMO XML及XML直接修改SUMO文件指南
一、Excel多OD矩阵转SUMO XML格式
1. 先整理Excel数据结构
针对多个时间片的OD矩阵,推荐两种整理方式:
- 分工作表存储:每个工作表对应一个时间区间的OD矩阵,工作表顶部用固定单元格标注参数:
- A1单元格:
From_Time: 0.00(起始时间,单位小时) - A2单元格:
To_Time: 1.00(结束时间,单位小时) - A3单元格:
Factor: 1.00(流量缩放因子) - 第5行开始为OD数据列:
起点ID、终点ID、流量
- A1单元格:
- 同一工作表分块存储:用空行分隔不同时间的矩阵块,每个块开头标注上述时间、因子参数,后续紧跟OD数据行。
2. 转换为SUMO兼容格式并生成XML
方式1:用SUMO自带工具处理
- 第一步:将Excel内容批量导出为SUMO支持的
$o;D2格式文本(单个文件可包含多个时间片矩阵)
可以用Excel VBA宏自动生成,示例宏逻辑:遍历每个工作表,拼接成如下格式的文本内容,保存为od_matrices.txt:$o;D2 * From_Time To-Time 0.00 1.00 * Factor 1.00 * 时间片1注释 1 1 25 1 2 31 1 4 21 $o;D2 * From_Time To-Time 1.00 2.00 * Factor 1.2 * 时间片2注释 1 1 30 1 2 37 - 第二步:用
od2trips工具生成XML格式的出行文件
打开命令行执行:
参数说明:od2trips -n net.net.xml -d od_matrices.txt -o trips.xml --time-factor 3600-n指定路网文件,-d是OD文本文件,-o是输出的XML出行文件,--time-factor 3600将小时转成SUMO默认的秒单位。
方式2:Python脚本直接生成SUMO路由XML
如果需要更灵活的控制(比如直接生成<flow>元素),可以用脚本读取Excel并输出XML:
import openpyxl import xml.etree.ElementTree as ET # 加载Excel文件 wb = openpyxl.load_workbook('od_matrices.xlsx') routes_root = ET.Element('routes') # 遍历每个工作表(每个工作表对应一个时间片) for sheet_name in wb.sheetnames: ws = wb[sheet_name] # 提取时间参数(转成秒) begin_hour = float(ws['A1'].value.split(':')[1].strip()) end_hour = float(ws['A2'].value.split(':')[1].strip()) factor = float(ws['A3'].value.split(':')[1].strip()) begin_sec = int(begin_hour * 3600) end_sec = int(end_hour * 3600) # 遍历OD数据行(从第5行开始) for row in ws.iter_rows(min_row=5, values_only=True): from_edge, to_edge, flow = row if not all([from_edge, to_edge, flow]): continue # 创建flow元素 ET.SubElement(routes_root, 'flow', from=str(from_edge), to=str(to_edge), number=str(int(flow * factor)), begin=str(begin_sec), end=str(end_sec), departPos='random', departSpeed='random') # 保存XML文件 tree = ET.ElementTree(routes_root) with open('od_flows.xml', 'wb') as f: tree.write(f, encoding='utf-8', xml_declaration=True)
二、仅通过XML修改SUMO文件
SUMO的核心配置依赖XML文件,主要修改routes.xml或新增外部XML文件引用:
1. 直接编辑现有路由XML
- 修改/新增
<flow>元素:每个<flow>对应一组OD流量,示例:<routes> <!-- 修改原有流量 --> <flow from="1" to="1" number="30" begin="0" end="3600" departPos="random"/> <!-- 新增流量 --> <flow from="2" to="3" number="20" begin="3600" end="7200" departSpeed="max"/> </routes> - 时间依赖型OD用
<odMatrix>标签(SUMO 1.10+支持):<routes> <odMatrix id="peak_hour" begin="3600" end="7200"> <interval begin="3600" end="5400"> <edge id="1" count="25" to="1"/> <edge id="1" count="31" to="2"/> </interval> <interval begin="5400" end="7200"> <edge id="1" count="35" to="1"/> <edge id="1" count="40" to="2"/> </interval> </odMatrix> </routes>
2. 引用外部XML文件(不修改原文件)
如果不想改动原有routes.xml,可以新建custom_od.xml存储自定义OD流量,然后在sumocfg配置文件中添加引用:
<input> <net-file value="net.net.xml"/> <route-files value="routes.xml,custom_od.xml"/> </input>
SUMO会自动合并多个路由文件中的流量数据。
3. 批量修改技巧
用Python的xml.etree.ElementTree或lxml库编写脚本批量修改XML,比如替换所有<flow>的number属性值,或者批量新增时间片流量。
内容的提问来源于stack exchange,提问作者Zena Ben
相关产品推荐
相关产品推荐

