路径 (Routes)

工具的名称与其功能一致。

routecheck.py#

用于验证给定路径文件中的路径对于给定网络是否有效。 调用方式:

python tools\route\routecheck.py <net> <vehicletypes> [-f|--fix] <routes>+
python tools\route\routecheck.py <net> <vehicletypes+routes>

如果路径是断裂的(或不连通的),该工具会发出警告,例如:"Warning: Route for vehicle 0 disconnected between startEdge and endEdge"

如果提供了 --fix (-f),工具会尝试修复路径(假设仅缺少一个连接)。输出文件的名称通过追加 ".fixed" 生成。这些文件包含修复后的路径(如果修复成功),每条追加的连接都会作为注释写在车辆之后。

已知注意事项#

  • 该工具不处理车辆类型;它仅检查路径是否连通
  • --fix 模式下工作时,必须提供车辆类型文件
  • 不测试处理具有内部边的网络
  • 无法可靠地处理嵌套元素(例如停靠点)
  • 不处理命名路径

Note

routecheck.py 的替代方案是使用 duarouter 并加上选项 --skip-new-routes --repair --ignore-errors --ptline-routing,该方案没有上述限制。

findAllRoutes.py#

该工具确定给定源边和目标边之间的所有可能路径。示例:

python tools/findAllRoutes.py -n <net-file> -o <output-file> -s <source-edges> -t <target-edges>

Caution

路径可能包含任意数量的环路和绕行。在高度网状的网络(例如网格)中,可能的路径数量增长非常大,且其中大多数路径是不合理的。

analyzePersonPlans.py#

根据使用的模式序列统计不同类型的人行计划。私家车行程与公共交通行程通过以下假设进行区分:私家车的名称将以行人的名称开头(如 duarouter 生成的人行计划中发生的那样)。

python tools\route\analyzePersonPlans.py -r routes.xml

示例输出:

34: walk public walk
55: car walk
90: walk

routes_Join.py#

连接属于两个网络的路径。首先读取具有以下语法的映射文件:

<EDGE_ID>-><EDGE_ID>

它描述了网络在哪些边重叠,以及在结果网络中保留了哪条边。来自两个给定路径文件的、在这些边的第一条边开始的车辆最初不会被考虑,但它们的路径会保存在内存中。所有其他车辆都会被保留,但如果它们经过其中一个映射边,路径将通过从先前丢弃的列表中随机选择一条从对应边开始的路径来继续。

python tools\route\routes_Join.py <prefix#1> <routes#1> <prefix#2> <routes#2> <mapfile>
  • <prefix#1>: 用于第一个路径文件中车辆的前缀
  • <routes#1>: 第一个路径文件
  • <prefix#2>: 用于第二个路径文件中车辆的前缀
  • <routes#2>: 第二个路径文件
  • <mapfile>: 边映射文件

注意!路径未按时间排序!

sort_routes.py#

此脚本按出发时间对给定路径文件中的车辆进行排序。如果提供了选项 --big,则使用速度较慢但内存效率高的算法。

python tools/route/sort_routes.py input.rou.xml -o output.rou.xml

cutRoutes.py#

此脚本将大型场景中的路径裁剪到子场景中。 这假设存在一个大场景(orig.net.xmlorig.rou.xml)。目标是仅模拟网络的一小部分(reduced.net.xml),同时保留所有经过缩减网络的路径。输出可以是路径文件或行程文件。 根据给定的选项,新的出发时间可以从退出时间(参见 sumo 选项 --vehroute-output.exit-times)计算,从原始网络外推,或简单地从原始出发时间复制。如果提供了选项 --big,则在按出发时间排序输出时使用速度较慢但内存效率高的算法。用法示例:

python tools/route/cutRoutes.py reduced.net.xml orig.rou.xml
  --routes-output output.rou.xml --orig-net orig.net.xml

通过设置选项 --additional-input--stops-output 也支持过滤停靠点。

cutTrips.py#

此脚本将大型场景中的行程裁剪到子场景中。 仅保留那些在子场景网络中开始和结束的行程(这与 cutRoutes.py 不同,后者还会保留经过子场景网络的路径)。

python tools/route/cutRoutes.py --trips-output output.rou.xml cut.net.xml orig.rou.xml

splitRouteFiles.py#

此脚本按开始时间拆分路径文件列表(例如来自 duarouter)。 如果提供了检测器文件,路径还将按有检测器的边进行拆分。示例:

python tools/route/splitRouteFiles.py <route-files>

默认情况下,路径将以 900 秒为步长进行拆分。这可以通过选项 -s 更改。 检测器文件可以通过选项 -f 加载。示例:

python tools/route/splitRouteFiles.py <route-files> -f <detector-file>

routeStats.py#

计算给定路径文件中所有路径的长度直方图。或者,计算两个具有相同车辆的路径文件之间的长度差异。路径必须是 <vehicle> 元素的子元素。也可以生成用于绘图的输出(参见 --help)。

python tools/route/routeStats.py <net-file> <route-file>

当设置选项 --attribute depart 时,会生成出发时间(或出发时间差)的直方图。

当设置选项 edges-file 时,将读取文件中的所有 <edge> 元素并存储其 ID 集合。对于每条路径,统计集合内的边数。

routecompare.py#

此脚本通过计算任意两条路径之间的相似度(基于公共边的数量)并确定路径集之间的最大加权匹配来比较两个路径集。 它至少需要两个参数,即要比较的路径集。可选地可以提供区域文件,此时仅匹配具有相同起点和终点区域的路径。

python tools/route/routecompare.py routes.rou.xml routes2.rou.xml

route2poly.py#

将路径转换为多边形,以便在 sumo-gui 中进行可视化。使用选项 --hue, --saturation, --brightness 可以控制颜色。这些选项中的每一个都支持 [0, 1] 范围内的值以及特殊值 random

python tools/route/route2poly.py <net-file> <route-file>

route2sel.py#

将路径转换为边选择文件,该文件包含在任何路径、行程或人行计划中使用的所有边。该文件可用于在 sumo-gui 中进行可视化,或通过 netconvert 裁剪网络。

python tools/route/route2sel.py <route-file> -o usedEdges.txt
netconvert --net-file <net-file> --keep-edges.input-file usedEdges.txt --output reduced.net.xml

route_departOffset#

<vehicle>, <trip>, 和 <flow> 元素的出发时间偏移指定的量。 当设置选项 --depart-edges Edge1,Edge2,... 时,仅影响在给定边之一出发的车辆。

python tools/route/route_departOffset.py --input-file <route-file> --output-file shifted.rou.xml --depart-offset 900

选项 --depart-interval a,b,c,d 将区间 [a,b[ 内的所有出发时间偏移到区间 [c,d[。

python tools/route/route_departOffset.py --input-file <route-file> --output-file shifted.rou.xml --depart-interval 3600,7200,0,500

route_1htoDay#

使用 "route_departOffset.py" 构建 24 个路径文件,描述一整天的情况,假设给定的路径文件描述一小时。

python tools/route/route_1htoDay.py <route-file>

scaleTimeline.py#

通过应用时间线定义来增加或减少给定路径文件中的交通量。输出文件的时间范围与输入相同。

sumo/tools/route/scaleTimeLine.py -r 1d_flat.rou.xml -o 1d_timeline.rou.xml --timeline-list 3600,8,5,4,3,4,12,45,74,66,52,50,50,52,53,56,67,84,86,74,50,39,30,21,16

timeline-list 中的第一个值定义了一个时间间隔的持续时间,随后的值定义了每个时间间隔要使用的输入交通量的百分比。

将 1 小时高峰交通场景转换为全天场景的用法示例:

sumo/tools/route/route_1htoDay.py 1h_peak.rou.xml -o 1d_peak.rou.xml
sumo/tools/route/scaleTimeLine.py -r 1d_peak.rou.xml -o 1d_timeline.rou.xml

route2alts.py#

统计所有出发/到达边的可能路径。 构建路径替代方案,分配如此确定的路径使用概率。 请注意,不计算路径的成本!

python tools/route/route2alts.py <route-file>

countEdgeUsage.py#

生成一个 可视化 文件,用于调查路径文件中的交通模式。

python tools/countEdgeUsage.py <route-file> --output-file <output-file>

选项 --intermediate 可用于在生成的输出中包含每条边通过的车辆总数。

生成的文件 result.xml 可以在 sumo-gui 中加载,以根据出发数、到达数或通过车辆总数对边进行着色

当调查经过特定边或交叉口的路径时,可以使用选项 --subpart <STRING> 过滤输入路径:

python tools/countEdgeUsage.py <route-file> --output-file <output-file> --subpart edge3,edge4,edge5

这将仅生成包含边序列 edge3 edge4 edge5 的路径的结果。 默认情况下,subpart 必须是连续的边序列。通过添加选项 --subpart.via,允许非连续序列。

addParkingAreaStops2Routes.py#

声明车辆在一个或多个停车区(由逗号分隔)停止。

python tools/addParkingAreaStops2Routes.py -r <route-file> -p <parking-areas> -d <duration in seconds> [-o <output-file>]

如果给定停车区的 ID 是车辆 ID 的一部分,则停止将被添加到车辆的路径中。示例:

<routes>
    <vehicle id="0_parkingAreaA" depart="0">
      <route edges="e1 e2 e3"/>
    </vehicle>
    <vehicle id="1" depart="0">
      <route edges="e1 e2 e3"/>
    </vehicle>
</routes>
python tools/route/addParkingAreaStops2Routes.py -r <route-file> -p ParkingAreaA -d 3600 [-o <output-file>]
<routes>
    <vehicle id="0_parkingAreaA" depart="0">
      <route edges="e1 e2 e3"/>
      <stop parkingArea="parkingAreaA" duration="3600">
    </vehicle>
    <vehicle id="1" depart="0">
      <route edges="e1 e2 e3"/>
    </vehicle>
</routes>

这仅将 parkingAreaA 处的停止添加到 ID 为 0_parkingAreaA 的车辆。注意,该停车区的车道必须属于车辆路径 "e1, e2, e3" 中的一条边。

addParkingAreaStops2Trips.py#

在输入文件中的所有行程中添加停车停止

python tools/route/addParkingAreaStops2Trips.py -r <route-file> -p <parking-areas> -d <duration in seconds> [-o <output-file>]

停止将被添加到行程路径中。

<routes>
    <trip id="vehicle_0" depart="0.00" from="WC" to="CN"/>
</routes>
python tools/route/addParkingAreaStops2Routes.py -r <route-file> -p <parkings-file> -d 1800 [-o <output-file>]
<routes>
    <trip depart="0.00" from="WC" id="vehicle_0" to="CN">
        <stop duration="1800" parkingArea="parkingArea_WC_3_0"/>
    </trip>
</routes>

这仅将 parkingAreaA 处的停止添加到 ID 为 0_parkingAreaA 的车辆。注意,该停车区的车道必须属于车辆路径 "e1, e2, e3" 中的一条边。

addStops2Routes.py#

声明车辆在其路径结束时(或在其他定义/随机位置)停止。

python tools/route/addStops2Routes.py -n <net-file> -r <route-file> -t <vType-file> -o <output-file> -d <stop duration in seconds> -u <stop until time>

停止的 "duration" 或 "until" 必须提供其一。使用选项 -p,车辆会在路边停止而不阻塞其他车辆。示例:

<routes>
    <vehicle id="0" depart="0">
      <route edges="e1 e2 e3"/>
    </vehicle>
</routes>
python tools/route/addStops2Routes.py -n <net-file> -r <route-file> -t <vType-file> -o <output-file> -p --duration 1800 --until 12:0:0
<routes>
    <vehicle depart="0" id="0" type="type1">
        <route edges="SC CN"/>
        <stop lane="CN_2" parking="true" duration="1800" until="12:0:0"/>
    </vehicle>
</routes>

随机停止#

以下选项可用于随机化添加的停止:

  • --probability: 以 [0,1] 之间的概率随机为每辆车添加停止
  • --reledge random: 在路径上随机选择一条边添加停止
  • --via-index random: 在路径上随机选择一条边添加停止(包括途经边)
  • --relpos random: 在边上随机偏移处添加停止
  • --lane random: 在停止边的随机(允许的)车道上添加停止

静态交通#

除了通过添加停止来修改给定的路径文件外,该工具还可以合成车辆以填充给定的停车区列表。这需要设置选项 --parking-areas FILE。生成的车辆将具有配置的持续时间/直到时间的停止,并在停止后离开模拟。

  • --abs-occupancy: 为每个停车区生成给定数量的车辆
  • --rel-occupancy: 生成车辆以将每个停车区填充到给定的相对容量
  • --abs-free: 生成车辆以使每个停车区具有给定数量的空闲空间

更多选项#

  • --parking-areas FILE: 加载包含停车区定义的附加文件。如果车辆的最终边有一个 parkingArea,这将被用作目的地
  • --via-index INDEX: 通过沿路径的索引选择停止边(基于 0,允许负数)。对于带有 via 的行程/流,边列表为 [from] + via + [to]。设置时,这会覆盖 --reledge
  • --person-duration, --person-until: 如果设置,输入中的任何人员将在其计划的最后一个元素接收一个 <stop>
  • --start-at-stop: 如果设置,车辆路径将被缩短,以便它们从最终边开始。这可用于定义填充停车区而不四处行驶的静态交通。

vehicle2flow.py#

此工具将每个车辆定义转换为具有配置的结束时间和周期的流定义(depart 用作开始时间)。

python tools/route/vehicles2flow.py <route-file> -o <output-route-file> -e <end-time> -r <repeat-period>

tracegenerator.py#

这会根据输入路径文件和网络创建一个(地理)坐标列表。

python tools/route/tracegenerator.py -n <net-file> -r <route-file> -o <output-trace-file>

tracemapper.py#

此脚本将(地理)坐标列表映射到给定网络中的连续边列表(路径)

python tools/route/tracemapper.py -n <net-file> -t <trace-file> -o <route-output-file>

输入包含每辆车的坐标,每辆车一行。 示例:

vehicle1:363.66,497.79 2008.64,498.82
vehicle2:363.66,497.79 1498.46,989.78 2008.64,498.82

作为替代输入,支持 fcd-output 文件(或包含属性 id, xy 的类似文件)。

输出是一个标准的 sumo 路径文件

<routes>
    <route id="vehicle1" edges="beg rend"/>
    <route id="vehicle2" edges="beg left2end rend"/>
</routes>

选项:

  • --geo: 使用网络中给定的参数启用输入坐标的转换。
  • --vehicle-class: 如果使用该选项提供了 车辆类别,映射算法将仅考虑允许该车辆类别的边。
  • --delta: 增加轨迹点与边参考线之间的可接受距离(默认为 1)。如果网络包含多车道边,应将此选项设置为最大边宽(单位:米)。
  • --fill-gaps: 通过填充最大距离(单位:米,默认为 0)内的间隙来修复断开的路径。

Note

映射算法也可在 python 库函数 sumolib.route.mapTrace 中使用。

Caution

对于噪声较大的轨迹数据和报告频率较低的轨迹,强烈建议设置选项 --delta--fill-gaps

Caution

地理坐标必须以 lon/lat 形式提供(第一个坐标是经度,第二个是纬度)!

implausibleRoutes.py#

此工具分析给定的路径文件并计算每条路径的不合理性分数。

python tools/route/implausibleRoutes.py <net-file> <route-file>

不合理性分数是个别不合理性度量的加权和(具有可配置的权重):

  • (路径长度 / 空中距离)的商
  • 相对绕行时间:(路径持续时间 / 最短路径持续时间)
  • 绝对绕行时间:(路径持续时间 - 最短路径持续时间)
  • 短路径惩罚:max(0, minimumDistanceParameter - routeDistance)
  • 短空中距离惩罚:max(0, minimumAirDistanceParameter - routeAirDistance)

该工具报告不合理性分数高于给定阈值的路径。 它也可用于为 flowrouter 生成限制。

Caution

当使用带有命名路径的路径文件(即 flowrouter --routes-output)时,必须设置选项 --standalone

addStopDelay.py#

此工具通过增加持续时间,为部分或所有具有 'duration' 值的停止添加随机延迟。

python tools/route/addStopDelay.py -r <route-file> -o <output-route-file>

延迟是从 截断正态分布 中采样的,参数通过选项 --mean FLOAT, --dev FLOAT, --min FLOAT, --max FLOAT 设置。在 min=max 的特殊情况下,添加固定延迟。 通过设置选项 --probability FLOAT,停止仅以给定的概率接收延迟。

checkStopOrder.py#

此工具读取车辆或行程的公共交通时刻表,并检查不同车辆在同一站点停留的时间是否重叠。对于公交线路,这种发生可能是预期的,但对于铁路时刻表,通常表示数据错误(除非发生部分运行)。

python tools/route/checkStopOrder.py -r <route-file>

当设置选项 --stop-table STOP_ID 时,所有服务于给定 <busStop>-id 的车辆的时刻表将写入标准输出。 该选项接受停靠点列表,也接受 * 通配符以生成多个 busStops(即属于同一车站)的组合表。

生成的停靠表可能如下例所示,列对应于停靠点的属性,除了以下两列: - veh: 此停靠点所属车辆的 ID - flags: - p: 停车 (parking) - F: 车辆的第一个停靠点 - L: 车辆的最后一个停靠点 - w: 途径点 (waypoint) - o: 车辆被超越(其他车辆稍后到达同一站点并较早离开) - O: 车辆超越(其他车辆较早到达并较晚离开)

# busStop: stop_A,stop_B
arrival  until      veh      tripId started   ended     flags   busStop
12:20:30  12:24:12  H2303_6  4199   12:23:22    12:26:23            stop_B
12:21:42  12:21:42  H2303_8  11010  12:25:15    12:25:15    F       stop_A
12:50:36  12:53:48  H2303_7  11023  12:50:26    12:52:57            stop_B
13:20:36  13:23:42  H2303_9  11073                                stop_B
13:35:00  13:38:42  H2303_8  11025                                stop_B
13:36:24  13:36:24  H2303_3  11012                                stop_A
14:04:36  14:07:24  Z2602_2  1435                                   stop_B
14:21:12  14:24:12  H2303_1  11027                              stop_B
14:35:18  14:37:18  H3458_2  28915                              stop_B
14:51:36  14:54:12  Z1351_9  2075                                   stop_B

splitRandom.py#

此工具将一个路径文件拆分为两个不同的路径文件

python tools/route/splitRandom.py -r <route-file> -a <first output file> -b <second output file> -n <number of trips in second file>

addTAZ.py#

此工具向路径文件中的车辆添加 'fromTaz' 和 'toTaz' 信息。

python tools/route/addTAZ.py -r <route-file> -a <taz-file> -o <output-file>

route2OD.py#

此工具根据 taz 文件和路径文件生成 tazRelation 文件(OD 矩阵)

python tools/route/route2OD.py -r <route-file> -a <taz-file> -o <output-file>

不仅路径文件,行程文件也可以用作输入。该工具将首先尝试查找每个行程或流的起始边和结束边,并根据输入的 taz 文件将它们匹配到相应的起点和终点 TAZ。将计算并保存 TAZ 关系的计数。如果给定的行程或路径文件中仅可用 TAZ 信息,该工具将直接计算基于 TAZ 的 OD 关系计数,而无需使用给定 taz 文件中每个 TAZ 所在连接边的信息。如果设置了选项 --edge-relations,则仅当起始/结束边信息可用时,才会计算并保存基于边的关系计数。

当设置选项 --interval TIME(缩写 -i)时,OD 矩阵将被拆分为给定持续时间的时间片。

geoTrip2POI.py#

加载一个使用 fromLonLat / toLonLat 定义行程的文件,并将其转换为 poi 文件。 出发 poi 将为红色,到达 poi 将为蓝色,其视觉大小反映了该位置的出发/到达数量。

python tools/route/geoTrip2POI.py <trip-files> -o <output-poi-file>