od2trips 从 O/D(起讫点)矩阵计算行程表。od2trips 假设矩阵编码为在特定时间段内从一个区域或交通分配区(TAZ)行驶到另一个区域的车辆数量。由于生成的行程必须在路网的边缘(edges)开始和结束,od2trips 需要 TAZ 到边缘的映射。在使用 netconvert 转换 VISUM 网络时,存储在 VISUM 输入文件中的区域会被解析并存储在生成的 SUMO 网络文件中。如果您不使用 VISUM 作为输入,则必须自行构建 TAZ 文件。格式在下面的 #描述_TAZ 中给出。您必须使用 --net-file <FILE>(简写为 --net <FILE> 或 -n <FILE>)选项将包含 TAZ 定义的文件传递给 od2trips。可以通过在 netedit 中绘制多边形并使用工具 Tools/District#edgesInDistricts.py 处理它们来创建 TAZ。
所有支持的 OD 格式都在下面的 #描述矩阵单元格 中描述。您可以使用 --od-matrix-files <FILE>[,<FILE>]*(简写为 -d <FILE>[,<FILE>]*)选项向 od2trips 提供矩阵列表,后跟用 ',' 分隔的文件列表。
od2trips 读取所有矩阵并生成行程定义。生成的行程定义从零开始编号。您还可以使用 (--prefix <STRING>) 为生成的行程定义名称添加前缀。像往常一样,它们被写入使用 --output-file <FILE>(简写为 -o <FILE>)指定的输出文件。您可以使用 --vtype <STRING> 指定要添加到行程定义中的车辆类型。请注意,除非在 O/D 矩阵中给出或使用此选项定义,否则车辆将没有类型。命令行选项会覆盖 O/D 矩阵中给出的类型名称。类型本身不会被生成。车辆将在 --begin <TIME>(简写为 -b <TIME>)和 --end <TIME>(简写为 -e <TIME>)之间的时间段内生成,默认值分别为 0 和 86400。其含义是模拟步长(以秒为单位),像往常一样。
由于每个 O/D 矩阵单元格描述了在特定时间段内插入网络的车辆数量,od2trips 必须计算车辆的显式出发时间。通常,这是通过在 O/D 矩阵单元格描述的时间间隔内使用随机时间来完成的。仍然可以使用均匀时间间隔插入单元格的车辆。使用选项 --spread.uniform 来启用此功能。
您可以使用 --scale <FLOAT> 选项缩放 O/D 矩阵中存储的数量,该选项采用浮点数作为参数。所有读取的流量将乘以该值,默认值为 1。当导入覆盖全天的 O/D 矩阵时,您可能希望应用一个曲线,该曲线类似于现实中发现的行程开始的分布。请阅读关于此的子章节 #拆分大矩阵。
描述 TAZ#
交通分配区(或交通分析区),简称 TAZ,由其 ID(任意名称)以及源边缘和目的边缘的列表描述。
简单定义#
如果您不想区分源边缘和汇聚边缘,并给所有边缘相同的概率,可以使用以下缩写形式:
<tazs>
<taz id="<TAZ_ID>" edges="<EDGE_ID> <EDGE_ID> ..."/>
... 其他交通分配区(区域) ...
</tazs>
区分概率#
要区分源边缘和汇聚边缘的集合(或其各自的概率),请使用以下定义:
<tazs>
<taz id="<TAZ_ID>">
<tazSource id="<EDGE_ID>" weight="<PROBABILITY_TO_USE>"/>
... 其他源边缘 ...
<tazSink id="<EDGE_ID>" weight="<PROBABILITY_TO_USE>"/>
... 其他目的边缘 ...
</taz>
... 其他交通分配区(区域) ...
</tazs>
TAZ 应至少有一个源边缘和一个目的边缘,每个都由其 ID 和使用概率(此处称为权重)描述。这些边缘分别用于将车辆插入网络和从网络中移除车辆。源列表和目的列表的概率总和在加载后会被归一化。
创建 TAZ 文件#
- TAZ 定义可以直接在 netedit 中创建。
- TAZ 定义可以通过在 netedit 中绘制多边形创建,然后使用工具 edgesInDistricts.py 将多边形转换为 TAZ。
TAZ 的进一步用途#
- TAZ 可与 duarouter 的路线输入 一起使用。
- TAZ 可与行程和流量一起用于 SUMO。
- TAZ 边缘在模拟中显示为具有 ID tazID-source 和 tazID-sink 的特殊边缘。这可以在通过 TraCI 指定车辆路线时使用。
可选属性#
| 属性名称 | 值类型 | 描述 |
|---|---|---|
| shape | 位置列表 | 用于可视化 TAZ 的边界形状 |
| color | 颜色 | 用于绘制形状和为边缘着色(按 TAZ 着色)的颜色 |
描述矩阵单元格#
为了理解 O/D 矩阵的存储方式,我们应该回顾一下其中存储值的含义。每个矩阵描述一个特定的时间段。矩阵内的索引是起讫点区域的名称(通常它们是等效的,两个列表相同)。矩阵内存储的值是在所述时间段内从相应起始区域行驶到相应目的区域的车辆数量。
tazRelation 格式#
tazRelation 格式定义了每对 OD 的需求,按时间切片和给定的车辆类型划分,如下所示:
<data xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/datamode_file.xsd">
<interval id="car" begin="0" end="1:0:0">
<tazRelation count="2000" from="1" to="2"/>
<tazRelation count="500" from="1" to="3"/>
...
</interval>
<interval ...>
...
</data>
tazRelation 格式的文件可以使用 netedit 创建和修改。也可以使用 route2OD.py 从路线和 taz 文件创建(这是 od2trips 操作的逆操作)。
有关类型和单位的详细信息,请参见模式文件 https://sumo.dlr.de/xsd/datamode_file.xsd
注意
"interval" 的 "id" 值用作车辆类型,但该类型可能被 od2trips 的选项 --vtype 覆盖。
PTV 格式#
PTV 使用的格式在 VISUM 文档中有更详细的描述。所有格式都以一行开始,其中指定了 O/D 矩阵的类型,后跟一个 '$'。第一个后续字符告诉表格的存储格式。然后,后续字符描述矩阵中额外提供了哪些值。有关更多信息,我们建议您查阅 PTV 提供的文档。在此仅描述支持的变体。
车辆类型信息由 od2trips 通过将其传递给生成的车辆来使用。类型定义本身不会被生成,但车辆将设置属性 type="<TYPE>"。时间信息假定为 <小时>.<分钟> 的形式。请注意,结束时间是排他的;例如,如果给定
0.00 1.00
生成的车辆出发时间将是从第 0 秒到第 3599 秒。
V 格式 (VISUM/VISSIM)#
V 格式通过首先给出区域(TAZ)的数量,然后命名它们来存储 O/D 矩阵。此后,对于每个命名的区域,给出离开该区域的车辆数量列表,按区域名称列表中给出的目的区域名称排序。示例如下:
$VMR
* vehicle type
4
* From-Time To-Time
7.00 8.00
* Factor
1.00
*
* some
* additional
* comments
* District number
3
* names:
1 2 3
*
* District 1 Sum = 6
1 2 3
* District 2 Sum = 15
4 5 6
* District 2 Sum = 24
7 8 9
类型名称中的 'M' 表示使用了车辆类型,"R" 表示值应随机四舍五入。od2trips 不处理第二个信息,这意味着您可以解析 V-、VR-、VMR 和 VM- 矩阵。请注意,名称列表和包含数量的列表的编写方式使得同一行中存储的字段不超过 10 个。它们包含的每个条目似乎都左对齐到 11 个字符的边界(名称可能为 10 个字符,一个空格字符)。这两个约束对于 od2trips 中使用的导入器来说都不是强制性的。
O 格式 (VISUM/VISSIM)#
O 格式改为简单地将每个起始点和每个目的点与数量列在一行中(请注意,我们目前忽略在第一行中类型标识符 "$OR" 后出现的 ';' 之后的字符串):
$OR;D2
* From-Time To-Time
7.00 8.00
* Factor
1.00
* some
* additional
* comments
1 1 1.00
1 2 2.00
1 3 3.00
2 1 4.00
2 2 5.00
2 3 6.00
3 1 7.00
3 2 8.00
3 3 9.00
- 第一行是必须逐字包含的格式说明符。
- 以 '*' 开头的行是注释,可以省略。
- 第二个非注释行确定时间范围,格式为 HOUR.MINUTE HOUR.MINUTE。
- 第三行是每个单元格车辆数量的全局缩放因子。
- 所有其他行以 FROM TO NUMVEHICLES 的形式描述矩阵单元格。
Amitran 格式#
Amitran 格式定义了每对 OD 的需求,按时间切片和车辆类型划分,如下所示:
<demand xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/amitran/od.xsd">
<actorConfig id="0">
<timeSlice duration="86400000" startTime="0">
<odPair amount="100" destination="2" origin="1"/>
</timeSlice>
</actorConfig>
</demand>
注意
时间值以毫秒为单位。
有关类型和单位的详细信息,请参见模式文件 https://sumo.dlr.de/xsd/amitran/od.xsd
注意
"actorConfig" 的 "id" 值用作车辆类型。Amitran 模式将此限制为整数值,而 SUMO 允许字母数字类型 ID。要克服此限制,在运行 od2trips 时设置选项 --xml-validation never,或者删除模式定义并以 <demand> 开始您的 Amitran 文件。
拆分大矩阵#
od2trips 允许将定义长时间段的矩阵拆分为包含整体确定百分比的较小部分。有两种方法可以定义矩阵应拆分的数量。在两种情况下,概率都会自动归一化。
自由范围定义#
第一种可能性是直接使用选项 --timeline。在这种情况下,它后面应跟一个由 ',' 分隔的时间和概率列表。每个时间和概率字段由两个值组成,一个整数时间(以秒为单位的模拟时间)和一个描述概率的浮点数。这两个值用 ':' 分隔。必须至少提供两个值,使得这种情况下时间线的定义可以用以下 BNF 公式描述:
<TIME>:<AMOUNT>[,<TIME>:<AMOUNT>]+
在这种情况下,矩阵将被拆分为 (字段数-1) 个部分,每个部分将具有由字段内的整数描述的数量。(这意味着最后一个时间条目之后指定的数量将被丢弃。)
每日时间线#
第二种情况在交通科学中相当常见。它允许将矩阵拆分为 24 个子部分 - 这意味着字段数固定为 24 - 允许将 O/D 矩阵分布在一天中,按小时描述。要使用此功能,请向 od2trips 额外提供选项 --timeline.day-in-hours。它假定 --timeline 选项的值是一个由 ',' 分隔的 24 个浮点数列表,每个描述在相应小时内插入车辆的概率。
一些常见的德国每日时间线可以从以下来源获取:Schmidt, Gerhard; Thomas, Bernd: Hochrechnungsfaktoren für manuelle und automatische Kurzzeitzählungen im Innerortsbereich. Hrsg.: Bundesministerium für Verkehr, Abteilung Straßenbau: Forschung Straßenbau und Straßenverkehrstechnik. Heft 732, Bonn-Bad Godesberg, 1996
通用时间线的适用性
| 名称 | 描述 | 参考 |
|---|---|---|
| TGw2_PKW.txt | 乘用车,周二至周四,西德城市,类型#2 = ~城市边界内的街道 | S.95 |
| TGw3_PKW.txt | 乘用车,周二至周四,西德城市,类型#3 = ~城市边界的街道 | S.95 |
| TGs1_PKW.txt | 乘用车,周六/周日,西德城市,组#1 = ~市中心街道,大量上下班行程,没有连接到休闲区的高速公路 | S.100 - 103 |
| TGw_LKW.txt | 运输车辆,周一至周四,西德城市 | S.98 |
| TGs_LKW.txt | 运输车辆,周日,类型:~长途公路,重型货车数量庞大 | S.102, 105 |
因此,根据星期几和交通类型,可以假设使用以下时间线:
| 车辆类型 | 周一 | 周二至周四 | 周五 | 周六 | 周日 |
|---|---|---|---|---|---|
| HDV | TGw_LKW.txt | TGw_LKW.txt | X | X | TGs_LKW.txt |
| 乘用车,远距离 | X | TGw3_PKW.txt | X | TGs1_PKW.txt | TGs1_PKW.txt |
| 乘用车,近距离 | X | TGw2_PKW.txt | X | TGs1_PKW.txt | TGs1_PKW.txt |
可以注意到,没有给出周一乘用车行程的时间线。
时间线本身如下所示,可以直接复制到命令行中
通用时间线
| 名称 | 时间线 |
|---|---|
| TGw3_PKW | 0.9,0.5,0.2,0.2,0.5,1.3,7.0,9.3,6.7,4.2,4.0,3.8,4.1,4.6,5.0,6.7,9.6,9.2,7.1,4.8,3.5,2.7,2.2,1.9 |
| TGw2_PKW | 0.8,0.5,0.4,0.3,0.4,1.2,4.5,7.4,6.6,5.2,5.0,5.0,5.2,5.3,5.6,6.7,8.4,8.6,7.4,5.0,3.9,3.0,2.1,1.6 |
| TGs1_PKW | 3.3,2.8,2.0,1.5,1.2,1.3,1.2,1.5,2.5,3.7,4.8,5.5,6.0,6.7,7.0,7.1,6.9,7.4,7.0,6.0,4.7,4.1,3.5,2.3 |
| TGw_LKW | 0.3,0.4,0.4,0.6,0.8,2.0,4.8,7.5,9.0,8.7,9.0,9.0,7.5,8.4,7.8,6.9,5.4,4.0,2.7,1.8,1.2,0.9,0.6,0.3 |
| TGs_LKW | 1.3,1.1,0.6,0.8,0.9,1.5,2.6,3.1,3.5,3.8,4.5,4.9,5.0,5.3,5.6,5.7,5.9,6.0,5.7,5.3,4.8,4.6,10.0,7.6 |
备注:
- 所有时间线描述了占全天交通的百分比。
- 值已归一化为 100%(因此它们不需要加到任何特定值)。
- 不可能推导出所有工作日的时间线。
时间线描述了交通(100%)如何分布在全天。为了获得适当的周末需求,可以按比例缩小工作日的交通量。上述相同的参考文献在第 31 页给出了以下缩放因子。
每日时间线缩放因子
| 区域 | Sat1992 | Sun1992 | Sat1993 | Sun1993 |
|---|---|---|---|---|
| NRW 高速公路 | 76,1% | 72,7% | 72,8% | 69,4% |
| NRW 其他街道 | 82,6% | 74% | 78,3% | 71,6% |
| 巴伐利亚 | 75% | 67,2% | 73,9% | 64,7% |
可以注意到,此信息已有数年历史。此外,没有关于车辆类型的信息。
给定的 O/D 矩阵应拆分的 24 小时时间线可以使用以下选项提供给 od2trips:--timeline.day-in-hours --timeline <TIME_LINE>,其中 <TIME_LINE> 是如上所述的 24 个百分比列表。O/D 矩阵中定义的交通量可以通过 --scale <SCALE> 进行缩放。调用 od2trips 的示例:
od2trips -n <NET> -d <MATRIX> -o <OUTPUT> --scale <SKALIERUNG> \
--timeline.day-in-hours --timeline <TIME_LINE>
生成的交通模式#
默认情况下,od2trips 生成车辆交通。可以通过使用选项 --vtype 和 --prefix(后者是必需的,以便不同类型的车辆使用不同的车辆 ID)来创建不同类型的交通(乘用车、卡车等)。
通过设置选项 --pedestrians 或 --persontrips 中的一个,可以生成其他模式。
组合多次调用的行程#
有时需要多次调用 od2trips 以为给定场景生成所有交通:
- 为对需求水平不同的不同车辆类型建模。
- 为随时间变化且在 OD 对之间不均匀的需求建模(因此无法通过应用时间线来建模)。
在这种情况下,必须对 od2trips 的每次调用使用选项 --prefix <STRING> 并赋予不同的值,以避免行程 ID 重复。
处理损坏的数据#
od2trips 在此处的行为如下:
不完整的区域
- 缺少起始区域或目的区域:错误。
- 缺少起始区域和目的区域:警告。
不完整的连接
- 缺少到起始区域或目的区域的连接:错误。
- 缺少到起始区域和目的区域的连接:错误。


