You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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、流量
  • 同一工作表分块存储:用空行分隔不同时间的矩阵块,每个块开头标注上述时间、因子参数,后续紧跟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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 19:40:27