SUMO-网络有两种表示形式:
- 一组描述网络拓扑和几何结构的 plain-xml 文件
- 加载到仿真中的 .net.xml 文件。该文件包含大量生成的信息,例如交叉口内部的结构和通行权逻辑。
netconvert 可以在这两种格式之间自由转换且不会丢失信息。只有 plain-xml 格式是供用户编辑的。相比之下,.net.xml 格式的元素之间存在大量微妙的相互依赖关系,绝不应手动编辑。plain-xml 格式如下所述。
可以将 net.xml 文件与 plain-xml 补丁文件一起加载到 netconvert 中,以修改现有网络的某些方面。
要定义一个网络,至少需要两个文件:一个用于节点,另一个用于节点之间的街道。请注意,此处的“节点 (node)”和“交叉口 (junction)”含义相同,“边 (edge)”和“街道 (street)”也是如此(另请参阅术语表)。除了定义节点和边之外,还可以按类型合并边属性,并设置边或车道之间的显式连接。我们将在以下章节中描述这四种文件类型应如何编写。有关道路网络的更多信息也可以在 SUMO 道路网络描述中找到。
按照以下说明生成文件后(至少需要边和节点文件,使用类型和/或连接文件是可选的),应运行 netconvert 来构建网络。如果仅使用边和节点,分别存储在 "MyEdges.edg.xml" 和 "MyNodes.nod.xml" 中,则调用应如下所示:
netconvert --node-files=MyNodes.nod.xml --edge-files=MyEdges.edg.xml \
--output-file=MySUMONet.net.xml
如果还使用连接和类型,调用如下:
netconvert --node-files=MyNodes.nod.xml --edge-files=MyEdges.edg.xml \
--connection-files=MyConnections.con.xml --type-files=MyTypes.typ.xml \
--output-file=MySUMONet.net.xml
此处使用的选项及其缩写记录在 netconvert 手册页 中。
也许您的边定义不完整或有错误。如果您仍想导入网络,可以尝试向 netconvert 传递 --ignore-errors。在这种情况下,未正确定义的边将被省略,但 netconvert 仍会尝试构建网络。您也可以使用选项 --flip-y-axis 围绕水平轴翻转网络。
以下描述的文件结构也可作为 XML 模式定义 (XML Schema Definitions) 使用:
- 节点文件: https://sumo.dlr.de/xsd/nodes_file.xsd
- 边文件: https://sumo.dlr.de/xsd/edges_file.xsd
- 类型文件: https://sumo.dlr.de/xsd/types_file.xsd
- 连接文件: https://sumo.dlr.de/xsd/connections_file.xsd
- tllogic 文件: https://sumo.dlr.de/xsd/tllogic_file.xsd
节点描述 (Node Descriptions)#
在节点文件中(通常扩展名为 ".nod.xml",参见已知扩展名),每个节点都在单行中描述,如下所示:
<node id="<STRING>" x="<FLOAT>" y="<FLOAT>" [type="<TYPE>"]/> - 方括号('[' 和 ']')
表示该参数是可选的。每个属性都有特定的含义和值范围:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| id | id (字符串) | 节点的名称 |
| x | 浮点数 | 节点在平面上的 x 位置(米) |
| y | 浮点数 | 节点在平面上的 y 位置(米) |
| z | 浮点数 | 节点在平面上的 z 位置(米) |
| type | 枚举 ( "priority", "traffic_light", "right_before_left", "left_before_right", "unregulated", "priority_stop", "traffic_light_unregulated", "allway_stop", "rail_signal", "zipper", "traffic_light_right_on_red", "rail_crossing") | 节点的可选类型 |
| tlType | 枚举 ( "static", "actuated", "delay_based") | 交通灯算法的可选类型 |
| tlLayout | 枚举 ( "opposites", "incoming", "alternateOneWay") | 交通灯计划的可选布局(见下文) |
| tl | id (字符串) | 交通灯程序的可选 id。具有相同 tl 值的节点将被合并到单个程序中 |
| radius | 正浮点数 | 该节点的可选转弯半径(所有拐角),单位为米 (默认 1.5) |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 节点的自定义形状。如果提供的位置少于两个,netconvert 将重置该节点以使用计算出的形状。 |
| keepClear | 布尔值 | 交叉口阻塞启发式算法 是否应在此节点激活 (默认 true) |
| rightOfWay | 字符串 | 设置计算#通行权的算法。允许的值为 default, edgePriority, mixedPriority, 和 allwayStop |
| fringe | 字符串 | 澄清此交叉口是否位于网络边缘。允许的值为 default, outer 和 inner |
| roundabout | 字符串 | 澄清此交叉口是否可能是环岛的一部分。允许的值为 default, 1 和 0 |
| controlledInner | 边 id 列表 | 即使作为进出联合控制节点的边,也应由联合 TLS 控制的边 |
注意
您也可以使用 lon/lat 值代替 x/y,但随后需要添加选项 --proj.utm 以将坐标投影到笛卡尔平面上。
编写节点文件时,请不要忘记将节点定义嵌入到开始和结束“标签”中。一个完整的文件应如下例所示,该示例是 "<SUMO_HOME>/data/examples/netbuild/types/cross_usingtypes/" 和 "<SUMO_HOME>/data/examples/netbuild/types/cross_notypes/" 示例的节点文件 "cross3l.nod.xml"。
<nodes> <!-- 开始标签 -->
<node id="0" x="0.0" y="0.0" type="traffic_light"/> <!-- 节点 "0" 的定义 -->
<node id="1" x="-500.0" y="0.0" type="priority"/> <!-- 节点 "1" 的定义 -->
<node id="2" x="+500.0" y="0.0" type="priority"/> <!-- 节点 "2" 的定义 -->
<node id="3" x="0.0" y="-500.0" type="priority"/> <!-- 节点 "3" 的定义 -->
<node id="4" x="0.0" y="+500.0" type="priority"/> <!-- 节点 "4" 的定义 -->
<node id="m1" x="-250.0" y="0.0" type="priority"/> <!-- 节点 "m1" 的定义 -->
<node id="m2" x="+250.0" y="0.0" type="priority"/> <!-- 节点 "m2" 的定义 -->
<node id="m3" x="0.0" y="-250.0" type="priority"/> <!-- 节点 "m3" 的定义 -->
<node id="m4" x="0.0" y="+250.0" type="priority"/> <!-- 节点 "m4" 的定义 -->
</nodes> <!-- 结束标签 -->
您可能会注意到,只有名为 "0" 的第一个节点(即网络中间的节点)是交通灯控制的交叉口。所有其他节点都是无控制的。您可能还会注意到,街道的每一端都需要一个相应的节点。这并非绝对必要(您很快就会看到),但它有助于理解概念:每条边(街道/道路)都是两个节点(交叉口)之间的连接。
交通灯#
对于交通灯节点,netconvert 会生成默认的交通灯程序。仿真可以加载其他程序来代替。
tlType#
如果省略节点的 tlType,则设置为 static。可以使用选项 --tls.default-type <STRING> 更改此默认值。
static: 交通灯的每个相位将持续固定的时间actuated: 绿灯相位可能会根据自动添加的感应线圈的交通测量结果延长(“Zeitlückensteuerung”)
注意
您可以通过在命令行上提供逗号分隔的文件名列表来同时加载多个节点文件。在配置文件中,也可以使用空格分隔的列表。
tlLayout#
如果省略节点的 tlLayout,则设置为 opposites。可以使用选项 --tls.layout <STRING> 更改此默认值
opposites: 来自相反方向的道路同时获得绿灯。左转(与对向车流冲突)要么获得带冲突的绿灯 ('m'),要么获得自己的相位。incoming: 每条进入的道路获得自己的绿灯相位alternateOneWay: 此程序用于联合控制器,该控制器调节来自工作区(或狭窄道路)两个或多个方向的交替单向通行。每条进入的道路获得自己的绿灯相位,并且根据工作区的大小设置全红相位,以便在下一个方向启动前让交通清空。
节点类型#
如果省略节点的类型,netconvert 会自动猜测,但可能不是您想要的类型。以下是可能的类型,任何其他字符串都被视为错误并会导致程序停止:
priority: 低优先级边上的车辆必须等待,直到高优先级边上的车辆通过交叉口。traffic_light: 交叉口由交通灯控制(如果冲突的链接同时绿灯,则使用优先级规则避免碰撞)。right_before_left: 车辆必须让行来自右侧的交通。(在构建左手通行网络时会自动翻转)。left_before_right: 车辆必须让行来自左侧的交通。(仅在马达加斯加需要,那里车辆靠右行驶但让行左侧)。unregulated: 交叉口完全无管制 - 所有车辆无需刹车即可通过;交叉口的碰撞检测被禁用,但交叉口以外的碰撞将被检测到,并且很可能会发生。traffic_light_unregulated: 交叉口由交通灯控制,没有任何进一步的规则。如果使用不安全的信号计划,这可能会导致碰撞。请注意,交叉口内的碰撞永远不会被检测到。priority_stop: 这类似于 priority 交叉口,但次要链接上的车辆在通过前必须始终停车。allway_stop: 此交叉口的工作方式类似于全向停车。rail_signal: 此交叉口由铁路信号控制。这种类型的交叉口/控制仅对铁路有用。zipper: 此交叉口连接车道数量减少且交通需要合并的边,采用拉链式(延迟合并)。rail_crossing: 此交叉口模拟铁路道口。它将允许火车无障碍通过,并在火车接近时通过交通信号灯限制车辆。traffic_light_right_on_red: 交叉口由交通灯控制,类型为 traffic_light。此外,右转车辆可以在任何相位安全时(在停一次后)行驶。此行为称为红灯右转。dead_end: 此节点没有连接。此类型是自动分配的。使用此作为输入将触发猜测类型。
通行权 (Right-of-way)#
每个交叉口的通行权计算基于节点的 type。对于 priority 和 priority_stop 类型,通行权还取决于进入和离开边的 importance,如下所述。通常,具有最高重要性边的交通方向将获得通行权。
注意
通行权计算还会影响连接猜测和生成的交通灯程序。
rightOfWay="default"#
此模式是默认模式,如果边的 priority 属性不能完全依赖于确定通行权,则此模式很有用。它根据属性 priority、speed 和 laneNumber 对边进行排序。确定具有最高位置的两个进入边,它们将获得通行权。所有其他边将被归类为次要边。
rightOfWay="mixedPriority"#
其行为类似于 "default"。设置此值仅在配置由 NEMA 类型交通灯控制的交叉口的关闭行为时有用。在这种情况下,它对应于主路具有优先权(黄色闪烁)和支路必须停车(红色闪烁)。
rightOfWay="edgePriority"#
此模式对于通过调整边的 priority 属性来自定义通行权很有用。不同进入边优先级之间的关系将完全由边优先级决定。对于相等的优先级值,转弯方向也会被评估。
rightOfWay="allwayStop"#
此模式仅用于配置在关闭交通灯时交通灯交叉口的行为。使用此模式时,交叉口在“关闭”状态下将表现为类型 allway_stop。这是由 NEMA 类型交通灯控制的节点的默认设置。
特殊情况#
- 要模拟转弯优先道路,构成该道路的所有进入和离开边必须具有比非优先道路边更高的优先级值。
- 对于环岛,环岛内的边始终优先于从外部进入的边。
- 当来自同一边的两条车道接近同一目标车道时,通行权取决于节点类型:
- 如果类型是 zipper,则两条车道将对称反应,车辆执行拉链式合并。
- 否则,左车道将具有优先权,而右车道将让行。
理解网络中的通行权规则#
通行权规则在 sumo-gui 中通过每个车道末端的彩色条以及连接箭头的颜色表示,前提是使用交叉口->显示车道到车道连接自定义视图。
任何两个连接之间的通行权关系可以使用netedit 中的通行权模式显示。
如果车辆在仿真中刹车,责任车辆(如果有)也可以直接识别。
注意
切勿尝试手动修改 .net.xml 文件中的交叉口逻辑,因为网络中的其他数据结构存在微妙的相互依赖关系。尽管如此,查看 .net.xml 以理解通行权可能很有用。
修改通行权#
可以通过指定附加禁止和指定连接属性 pass="true" 来自定义通行权。
自版本 1.1.0 起,可以使用 <node> 属性 rightOfWay 在两种模式之间切换从边优先级计算通行权的算法。
边缘 (Fringe)#
对于路线生成,了解特定交叉口或边是否位于网络边界(真实世界中的其他道路被切断的地方)可能很重要。这可以使用 'fringe' 属性指定:
- default: 此交叉口不是边缘的一部分
- outer: 此交叉口连接到真实世界中的附加边。它是网络外边界的一部分
- inner: 此交叉口连接到真实世界中的附加边。它位于网络内部,但其他道路(即等级较低的道路)已从仿真中移除
可以通过设置 netconvert 选项 --fringe.guess,基于帕累托前沿自动确定外边缘的 fringe 属性。当使用选项 --attach-length 时,netgenerate 也会自动设置它。在 netedit 中编辑该属性也受支持。
'fringe' 属性由 randomTrips.py 在设置选项 --fringe-junctions 时使用。
节点合并 (Joining Nodes)#
有时您的网络可能包含彼此非常接近的节点,形成一个大集群。这在从 OpenStreetMap 导入网络时经常发生。 netconvert 支持选项 --junctions.join 来查找此类集群并将它们合并成一个形状良好的大交叉口。也可以使用 netedit 手动合并交叉口。甚至可以撤消自动计算的合并。新交叉口将获得 id cluster_id0_id1。如果集群中的节点多于 --max-join-ids(默认 4)给出的数量,则 id 将被缩写为类似 cluster_id0_id1_id2_id3_#5more(对于 9 个节点的集群)。
合并节点集群的原因#
在交叉口内部,适用特殊的交通规则。当通过节点集群建模交叉口时,集群内的边是常规道路,无法应用这些规则。 - 为防止阻塞横向交通,车辆只有在不会被下游拥堵阻止离开时才应进入交叉口空间 - 来自相反方向左转的车辆可以在彼此前方转弯(轨迹不相交)。在未合并的集群中,来自相反方向左转的长车辆很容易相互阻挡。
其他问题: - 左转交通的轨迹在未合并的集群中无效。轨迹将由两个大部分是直的腿组成,中间有一个急转弯,而不是平滑曲线切角。 - 正确建模左转动态需要在集群内额外的交通灯信号,以反映左转第二段(也是直行运动的第一段)上优先级的变化。 - 自动生成的交通灯计划在单个交叉口上效果更好。
合并节点集群的算法#
您可以通过提供选项 --junctions.join-dist <FLOAT> 来控制合并算法,该选项设置用于查找集群的搜索距离 (默认 10m)。可合并节点集群的搜索工作方式如下:
- 为所有节点计算交叉口形状
- 比较交叉口形状之间边的长度与 join-dist
- 给定距离内的节点被传递性地添加到候选集群
- 仅具有单个连接到集群的节点(外部节点)被移除
- 过于复杂的集群会被简化或过滤掉(每种情况都会发出带有解释的警告)
- 如果集群具有平行进入边(在同一行驶方向上),则将其过滤掉。被视为平行的阈值可以使用选项 --junctions.join.parallel-threshold(默认 30 度)控制。
- 每个集群都转换为一个合并的节点
指定和排除显式合并#
可以通过在节点文件中使用以下语法实现对合并的更精细控制:
<nodes>
<join nodes="id0 id23 id24"/>
<joinExclude nodes="id13 id17"/>
</nodes>
这将导致节点 id0、id23 和 id24 合并为单个交叉口。它还将防止节点 id13 和 id17 被合并。joinExclude 标签仅与选项 --junctions.join 一起使用时有用,但 join 标签也可以单独使用。要排除在合并之外的节点也可以通过选项 --junctions.join-exclude id,[id]+ 指定。
注意
<join> 元素支持 <node> 元素也支持的所有属性。这允许覆盖创建节点的属性。
合并节点后的连接#
注意
合并节点后,车道到车道的连接会重新计算。您可以通过采用两步过程来覆盖它们:
# 1. 合并交叉口。
netconvert --sumo-net-file berlin-separated-junctions.net.xml \
--output-file berlin-joined-junctions.net.xml \
--junctions.join
# 2. 重置连接。
netconvert --sumo-net-file berlin-joined-junctions.net.xml \
--output-file berlin-with-fixed-connections.net.xml \
--connection-files berlin-new-connections.con.xml
有关如何在 *.con.xml 格式中定义连接,请参阅#连接描述。
加载具有已定义连接的网络时,合并节点的结果可能相当令人惊讶。请注意左侧的(相当病态的)网络,并将其与右侧的网络进行比较。您可能会注意到车道到车道连接的一些巨大差异,尤其是对于来自南边的边。
原因是在合并过程中,边被依次合并,并且尝试保留连接。对于来自南边的道路左车道上的直行连接,它沿着交叉口传播 - 沿着位于交叉口内的所有四条边 - 产生一个进一步的右转连接。
为避免此类意外,应首先合并节点。然后,设置连接。
注意
如果在 OSM 导入期间使用选项 --junctions.join,则连接是基于合并的交叉口猜测的,不应出现病态情况。
边描述 (Edge Descriptions)#
| 边描述 | |
|---|---|
| 文件名扩展名 | .edg.xml |
| 内容类型 | 边 (道路/街道) |
| 开放格式? | 是 |
| SUMO 特有? | 是 |
| XML 模式 | edges_file.xsd |
在边文件中,每条边的描述如下:
<edge id="<STRING>" from="<NODE_ID>" to="<NODE_ID>" [type="<STRING>"] [numLanes="<INT>"] [speed="<FLOAT>"] [priority="<UINT>"] [length="<FLOAT>"] [shape="<2D-POSITION>[ <2D-POSITION>]*"] [spreadType="center"] [allow="<VEHICLE_CLASS>[ <VEHICLE_CLASS>]*"] [disallow="<VEHICLE_CLASS>[ <VEHICLE_CLASS>]*"]/>.
起点和终点节点使用其 ID 定义(from="<NODE_ID>" to="<NODE_ID>")。每条边都是单向的,从 "from" 节点开始,到 "to" 节点结束。如果其中一个节点的名称无法解析(因为它们未在节点文件中定义),则会生成错误。为避免在此类情况下停止进一步的网络转换,您可以使用选项 --ignore-errors 启动 netconvert。
对于每条边,应提供一些进一步的属性,即边具有的车道数量 (numLanes),边上允许的最大速度 speed。此外,可以可选地定义 priority。
所有边值 - 除了长度 - 可以通过相应属性为每条边提供,或者通过给边一个 "type" 来省略。在这种情况下,您还应该编写一个 SUMO 边类型文件。当然,该名称的类型应存在于使用的类型文件中,否则会报告错误。即使您提供了类型,仍然可以通过提供任何参数 allow、disallow、numLanes、priority 和 speed 来覆盖类型的值。您也可以完全不设置边参数。在这种情况下,将使用默认值,边将具有单车道、默认(未设置)优先级,此边上的最大允许速度将为 13.9m/s,约为 50km/h。此边的长度将计算为起点和终点之间的距离。
由于边可能具有更复杂的几何形状,您可以在 shape 属性中提供边的形状。如果边的长度没有以其他方式给出,则形状元素的距离将被求和。信息 spreadType="center" 强制 netconvert 将车道分布在连接开始节点和结束节点的两侧,或者分布在构成形状的线条两侧。如果未给出,车道默认向右分布。
让我们再次列出边的属性:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| id | id (字符串) | 边的 id(必须唯一) |
| from | 引用的节点 id | 边应开始的节点文件中的节点名称 |
| to | 引用的节点 id | 边应结束的节点文件中的节点名称 |
| type | 引用的类型 id | SUMO 边类型文件 中的类型名称 |
| numLanes | int | 边的车道数;必须是整数值 |
| speed | 浮点数 | 边上允许的最大速度(m/s);必须是浮点数(另请参见“使用 km/h 的边最大速度定义”) |
| priority | int | 边的优先级。用于#通行权计算 |
| length | 浮点数 | 边的长度(米) |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 如果给出了形状,它应以 from-node 和 to-node 的位置开始和结束。或者,它也可以以边离开或进入交叉口形状的位置开始和结束。这可以控制最终的交叉口形状。当使用选项 --plain.extend-edge-shape 时,只需提供内部几何点并自动使用起始和结束节点位置扩展形状即可 |
| spreadType | 枚举 ( "right", "center", "roadCenter") | 如何从边几何计算车道几何的描述。参见 SpreadType |
| allow | 车辆类列表 | 允许的车辆类列表(参见访问权限) |
| disallow | 车辆类列表 | 禁止的车辆类列表(参见访问权限) |
| width | 浮点数 | 此边所有车道的车道宽度(米)(用于可视化) |
| name | 字符串 | 街道名称(不必唯一,用于可视化) |
| endOffset | 浮点数 >= 0 | 将停车线从交叉口向后移动给定距离(有效地缩短边并在局部扩大交叉口) |
| sidewalkWidth | 浮点数 >= 0 | 添加给定宽度的人行道(默认为 -1,表示不添加任何内容)。 |
| bikeLaneWidth | 浮点数 >= 0 | 添加给定宽度的自行车道(默认为 -1,表示不添加任何内容)。 |
| distance | 浮点数 | 此边起点处的里程标。如果值为正,里程标沿行驶方向增加;如果值为负,里程标减少。沿边的里程标计算为 abs(distance + offsetFromStart)。 |
| routingType | id | 与偏好一起使用,为路由设置自定义边偏好 |
优先级在计算节点的让路规则时起作用。通常,边上的允许速度和边的车道数量用于计算哪条边在交叉口上具有更高的优先级。使用优先级属性,您可以增加边的优先级,使更多车道让行于它,或使来自此边的车辆进入交叉口时无需等待。
边的定义也必须嵌入到开始和结束标签中,对于示例 "<SUMO_HOME>/data/examples/netbuild/types/cross_notypes/",整个边文件如下所示("cross3l.edg.xml"):
<edges>
<edge id="1fi" from="1" to="m1" priority="2" numLanes="2" speed="11.11"/>
<edge id="1si" from="m1" to="0" priority="3" numLanes="3" speed="13.89"/>
<edge id="1o" from="0" to="1" priority="1" numLanes="1" speed="11.11"/>
<edge id="2fi" from="2" to="m2" priority="2" numLanes="2" speed="11.11"/>
<edge id="2si" from="m2" to="0" priority="3" numLanes="3" speed="13.89"/>
<edge id="2o" from="0" to="2" priority="1" numLanes="1" speed="11.11"/>
<edge id="3fi" from="3" to="m3" priority="2" numLanes="2" speed="11.11"/>
<edge id="3si" from="m3" to="0" priority="3" numLanes="3" speed="13.89"/>
<edge id="3o" from="0" to="3" priority="1" numLanes="1" speed="11.11"/>
<edge id="4fi" from="4" to="m4" priority="2" numLanes="2" speed="11.11"/>
<edge id="4si" from="m4" to="0" priority="3" numLanes="3" speed="13.89"/>
<edge id="4o" from="0" to="4" priority="1" numLanes="1" speed="11.11"/>
</edges>
在此示例中,我们使用了边的显式定义。使用类型的示例在章节类型描述中描述。
注意
街道的 id 有一些约束。它们不能包含以下任何字符:'_'(下划线 - 用于车道 id)、'[' 和 ']'(用于枚举)、' '(空格 - 用作列表分隔符)、'*'(星号,用作通配符)、':'(用作内部车道的标记)。
SpreadType#
每条边都有一个几何定义(默认为从开始交叉口到结束交叉口位置的直线)。spreadType 定义如何从边几何计算车道几何:
- right (默认): 边几何被解释为边的左侧,车道向右展开。如果相反方向的边具有相同(或相反)的几何形状,则此方法效果很好。
- center: 边几何被解释为方向边的中间,车道对称地向两侧展开。这适用于单向边。
- roadCenter: 边几何被解释为双向道路的中间。当两个方向边具有不同的车道数时,此方法效果很好。
道路访问权限 (allow, disallow)#
访问权限是构建多模式场景的重要工具。可以使用属性 allow 或 disallow 来配置此功能,语义如下:
- 未给出 allow 和 disallow:无访问限制。
- 给出 allow:仅允许指定的车辆类(即
allow="bus bicycle"仅允许公共汽车和自行车) - 给出 disallow:允许除指定类之外的所有类(即允许除行人之外的所有内容)
- 特殊值 all 可用于禁止所有内容 (
disallow="all"),以表示绿色路缘或其他类型的车道间距。
- 特殊值 all 可用于禁止所有内容 (
车道特定定义#
您可以允许/禁止特定车辆类使用车道。关于哪些车辆类允许在车道上的信息可以在边描述文件中通过将车道列表及其允许/禁止的车辆类嵌入到这些边的车道中来指定。假设您只想允许公共汽车使用上面示例中边 "2si" 的最左侧车道。只需将此边的定义更改为:
... 之前的定义 ...
<edge id="2si" from="m2" to="0" priority="3" numLanes="3" speed="13.89">
<lane index="2" allow="bus"/>
</edge>
... 更多定义 ...
如果您想禁止乘用车和出租车,以下代码段将完成此操作:
... 之前的定义 ...
<edge id="2si" from="m2" to="0" priority="3" numLanes="3" speed="13.89">
<lane index="2" disallow="passenger taxi"/>
</edge>
... 更多定义 ...
车道的定义包含以下可选属性:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| index | int | 车道的枚举索引(0 是最右侧车道,<NUMBER_LANES>-1 是最左侧车道) |
| allow | 车辆类列表 | 允许的车辆类列表(参见访问权限) |
| disallow | 车辆类列表 | 禁止的车辆类列表(参见访问权限) |
| changeLeft | 车辆类列表 | 可以从此车道向左变道的车辆类列表 |
| changeRight | 车辆类列表 | 可以从此车道向右变道的车辆类列表 |
| speed | 浮点数 | 速度(米/秒) |
| width | 浮点数 | 宽度(米)(用于可视化) |
| endOffset | 浮点数 >= 0 | 将停车线从交叉口向后移动给定距离(有效地缩短车道并在局部扩大交叉口) |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 此车道的自定义形状。 注意: 车道长度将在生成的网络中取平均值。车道变更将忽略车道之间的间隙。 |
| type | 字符串 | 此车道的自定义类型描述(仅信息性) |
| acceleration | 布尔值 | 此车道是否是高速公路加速车道(默认 false) |
有关允许的车辆类及其用法的更多信息,请参见“车辆类”。
车道变更限制#
使用 changeLeft 和 changeRight 定义车道变更限制时,通常应允许车辆类 "emergency",因为紧急车辆在大多数情况下可以忽略非物理限制。
最强的限制是值 "ignoring"。请注意,"ignoring" 类的车辆不能通过 changeLeft 和 changeRight 限制其车道变更。(只有创建单独的平行边才有效)。
停止偏移量 (Stop Offsets)#
每条边或车道可以包含一个 stopOffset 子元素,以指定某些类别车辆的额外停止偏移量。这可用于定义自行车等候区。
<edge id="<ID>">
<stopOffset value="<distance in m.>" vClasses="<space-separated list of vClasses>" />
<lane id="<ID>" index="<INDEX>" ... >
<stopOffset value="<distance in m.>" exceptions="<space-separated list of vClasses>" />
</lane>
...
</edge>
为边定义此元素将影响该边所有没有自己的 stopOffset 元素的车道。请注意,可以定义所有受停止偏移影响的车辆类(属性 vClasses),或那些不受影响的车辆类(属性 exceptions)。您不能同时使用这两个属性。指定车辆类必须从车道末端停止的距离由 value 属性指定。
| 名称 | 类型 | 描述 |
|---|---|---|
| value | 值 (双精度) | 停止偏移量,以米为单位的正值。 |
| vClasses | vClasses 列表 | 指定停止偏移适用于哪些车辆类。 |
| exceptions | vClasses 列表 | 指定停止偏移不适用于哪些车辆类。 |
有关车辆类的规范,请参见此处。
道路路段细化#
通常,每条边具有固定数量的车道和固定的速度;道路拓宽和速度降低是使用连续的边定义的。不过,在某些情况下,设置单条边并沿其长度改变其车道数量或速度更方便。
这可以使用 "split" 实现 - 这是 2009 年 9 月 2 日之后 XML 边定义的子元素。split 可以如下给出:
... 之前的定义 ...
<edge id="2si" from="m2" to="0" priority="3" numLanes="3" speed="13.89">
<split pos="30" lanes="0 1" speed="10"/>
</edge>
... 更多定义 ...
这里发生的是:从其开始处 30 米(pos="30")处,边被拆分,插入一个名为 <EDGE_ID>.<POSITION> 的节点。在此节点之前,边包含所有车道。在此节点之后,仅插入 lanes 属性中给出的车道,并且它们的速度降低。这将产生两条边替换初始边,第二条边仅包含两条车道,最大速度为 10m/s。
最常见的用法示例是相反的方式:必须沿道路添加车道,而不是移除。以下代码段通过示例显示:
... 之前的定义 ...
<edge id="2si" from="m2" to="0" priority="3" numLanes="3" speed="13.89">
<split pos="0" lanes="0 1"/>
<split pos="30" lanes="0 1 2"/>
</edge>
... 更多定义 ...
有几件事需要注意:
- 在道路定义中,我们使用最大车道数(3)
- 我们在位置 0 添加一个 "split";在这种情况下,不会构建节点,但车道数会直接应用于边。
- 如果我们仅添加一个带位置的 split,它会将车道数和速度重置为边的默认值(因此在上面的示例中,我们本可以在第二个 split 中省略 lanes 属性)。
也可以在道路的两个方向添加一个公共的 split。使用下面的示例,创建一个新节点,该节点拆分正向和反向边:
<edge id="123">
<split id="newNode" pos="150"/>
</edge>
<edge id="-123">
<split id="newNode" pos="-150"/>
</edge>
split 的定义使用以下属性:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| pos | 浮点数 | 拆分应沿边进行的位置(米);如果给定负位置,则从边的末尾开始计数插入拆分 |
| lanes | 车道 id 列表 (整数) | 拆分后应存在的车道信息 |
| speed | 浮点数 | 拆分位置后的速度(米/秒) |
| id | id (字符串) | 新创建节点的 id。也可以使用现有节点的 id。(默认情况下,id 由边 id 和 pos 生成) |
| idBefore | id (字符串) | 拆分前边的 id(默认为原始 id) |
| idAfter | id (字符串) | 拆分后边的 id(默认为 <origID.pos>) |
| offset | 浮点数 | 要应用于拆分后边的额外侧向偏移 |
| type, tl, tlType, shape, radius, keepClear | 参见#节点描述 |
环岛 (Roundabouts)#
边可能是环岛的一部分。这会影响通行权计算,并禁用从外部进入环岛的边的掉头。环岛在 .edg.xml 文件中指定如下:
<edges>
... <!--边定义 -->
<roundabout edges="<EDGE_ID> <EDGE_ID> [<EDGE_ID>..]"/>
</edges>
手动指定环岛是对现有环岛启发式算法(通过选项 --roundabouts.guess 激活)的有用补充。猜测的环岛作为 plain-xml 输出的一部分写入(选项 --plain-output-prefix)。然后用户可以自定义此输出并将其反馈给 netconvert。
相邻反向车道#
要启用反向行驶,必须定义反向车道的相邻信息。这可以通过在 .edg.xml 文件中使用 <neigh> 元素显式完成,如下所示:
<edges>
<edge id="a" from="X" to="Y" numLanes="2">
<neigh lane="b_0"/>
</edge>
<edge id="b" from="Y" to="X">
<neigh lane="a_1"/>
</edge>
</edges>
在上面的输入中,边 a 和 b 的最内侧车道被声明为相邻。
删除边或车道#
要删除来自不同来源或预处理网络的边或车道,可以按以下方式提供边 id 和可选索引:
<edges>
<delete id="a"/> <!-- 删除边 "a" -->
<delete id="a" index="0"/> <!-- 删除边 "a" 的第一条车道 -->
</edges>
也可以通过向类型提供属性 remove="true" 来删除特定类型的所有边(见下文)。
类型描述 (Type Descriptions)#
| 边类型描述 | |
|---|---|
| 文件名扩展名 | .typ.xml |
| 内容类型 | 边类型 |
| 开放格式? | 是 |
| SUMO 特有? | 是 |
| XML 模式 | types_file.xsd |
如前所述,边类型旨在用于简化边的定义。每条边的描述应包括车道数量、此边上允许的最大速度以及可选的此边的优先级及其允许和禁止的车辆类。有关边类型的完整描述及其文件格式,请参见 SUMO 边类型文件。
类型的属性当然与边本身的属性完全相同。边开始和结束的节点信息不在类型的描述中给出。它们只能在边的属性中设置。以下是在边定义中引用类型的示例:
<edges>
<edge id="1fi" from="1" to="m1" type="b"/>
<edge id="1si" from="m1" to="0" type="a"/>
<edge id="1o" from="0" to="1" type="c"/>
<edge id="2fi" from="2" to="m2" type="b"/>
<edge id="2si" from="m2" to="0" type="a"/>
<edge id="2o" from="0" to="2" type="c"/>
<edge id="3fi" from="3" to="m3" type="b"/>
<edge id="3si" from="m3" to="0" type="a"/>
<edge id="3o" from="0" to="3" type="c"/>
<edge id="4fi" from="4" to="m4" type="b"/>
<edge id="4si" from="m4" to="0" type="a"/>
<edge id="4o" from="0" to="4" type="c"/>
</edges>
相应的类型文件如下所示(参见 SUMO 边类型文件):
<types>
<type id="a" priority="3" numLanes="3" speed="13.889"/>
<type id="b" priority="2" numLanes="2" speed="11.111"/>
<type id="c" priority="1" numLanes="1" speed="11.111"/>
</types>
如您所见,我们将边分为三类 "a"、"b" 和 "c",并为每个类生成了描述。这样做时,生成的网络类似于使用上述设置生成的网络(示例 "<SUMO_HOME>/docs/examples/netconvert/types/cross_notypes/")。
特定车辆类的速度限制#
使用 <type> 定义可以实现 vClass 特定的速度限制:
<type id="a" priority="3" numLanes="3" speed="38.89">
<restriction vClass="truck" speed="27.89"/>
</type>
vClass 的值必须是可能的车辆类列表中的单个类。
特定车辆类速度限制的一个示例用法是德国高速公路上的卡车,即使在乘用车具有更高速度限制的地方,也不允许超过 100km/h。虽然也可以通过为卡车设置较低的 maxSpeed 来建模,但该方法会排除使用 speedDev 和 speedFactor 来轻松建模法定速度限制周围的速度变化。
注意
特定 vClass 的速度限制也可以从附加文件直接加载到 sumo 中(只需要类型属性 'id')
交叉口上的速度#
如果连接定义了 'type' 属性,这可用于直接加载限制。否则,类型和限制是从交叉口前后边的类型推断的,如下所示:
如果在交叉口前后存在 vclass 特定的速度限制,则该限制也应用于(交叉口-)内部边。默认情况下,将使用交叉口前后限制速度的平均值。 如果网络是使用选项 --junctions.higher-speed 构建的,则在交叉口上使用两者的最大值。
连接描述 (Connection Descriptions)#
| 连接描述 | |
|---|---|
| 文件名扩展名 | .con.xml |
| 内容类型 | 连接 |
| 开放格式? | 是 |
| SUMO 特有? | 是 |
| XML 模式 | connections_file.xsd |
“连接”描述了节点的进入边和离开边是如何连接的(例如,在某些交叉口禁止左转)。您可以在边级别指定连接,也可以详细声明哪条进入车道应连接到哪条离开车道。如果您省略一些连接,netconvert 会根据启发式自动计算缺失的信息。
注意
可以将两条进入车道连接到同一条离开车道。在许多情况下(例如高速公路入口匝道),应避免这种情况,因为预期的车辆行为是尽快变道,而不是行驶到车道末端)。当自行车道结束且自行车必须移动到道路上时,Netconvert 将生成这些“双连接”。SUMO 车辆会意识到以此方式设置的冲突,这有时是网络建模的有用工具。
显式设置哪条边/车道连接到哪条#
虽然如果未给出会被猜测,但边或车道之间的连接定义可以手动设置并使用连接文件提供给 netconvert。连接文件指定了从交叉口出发的哪些边可以由进入该交叉口的特定边到达,以及可选地在两侧应使用哪些车道。
如果您只想描述从特定边可以到达哪些边,定义是:<connection from="<FROM_EDGE_ID>" to="<T0_EDGE_ID>"/>。这告诉 netconvert 不仅允许车辆从名为 <FROM_EDGE_ID> 的边行驶到名为 <TO_EDGE_ID> 的边,而且还禁止从 <FROM_EDGE_ID] 到其他边的所有移动,除非在此文件中指定。让我们重复一下参数:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| from | 引用的边 id | 车辆离开的边的名称 |
| to | 引用的边 id | 离开 "from" 时车辆可以到达的边的名称。如果省略或设置为 "",则进入边将没有连接。 |
当使用这种输入时,netconvert 将计算如果任何连接的边具有多条车道,应使用哪些车道。如果您还想覆盖此计算并手动设置车道,请使用以下内容:<connection from="<FROM_EDGE_ID>" to="<T0_EDGE_ID>" fromLane="<INT_1>" toLane="<INT_2>"/>
这里,从边的 "<FROM_EDGE_ID>" 车道(编号为 <INT_1>)构建一条连接到边 "<TO_EDGE_ID>" 的车道 <INT_2>。车道从道路的右侧(外侧)向左侧(内侧)计数,从 0 开始。再次列出参数:
| 属性名 | 值类型 | 默认值 | 描述 |
|---|---|---|---|
| from | 引用的边 id | 车辆离开的边的名称 | |
| to | 引用的边 id | 离开 "from" 时车辆可以到达的边的名称 | |
| fromLane | <INT> | 进入车道的车道索引(从 0 开始的数字) | |
| toLane | <INT> | 离开车道的车道索引(从 0 开始的数字) | |
| pass | 布尔值 | false | 如果设置,通过此(车道到车道)连接的车辆将不会等待 |
| keepClear | 布尔值 | true | 如果设置为 false,通过此(车道到车道)连接的车辆将不会担心阻塞交叉口。 |
| contPos | 浮点数 | -1 | 如果设置为 0,则不会为此连接构建内部交叉口。如果设置为正值,则将在内部车道起点处此位置(米)构建一个内部交叉口。 |
| visibility | 浮点数 | 4.5 | 指定到连接的距离 [米.],低于此距离,接近的车辆对连接的敌对车道上的任何其他接近车辆具有完全视线(即如果不存在车辆,车辆可以加速)。请注意,过低的可见度(<=0.1m)将阻止车辆穿越次要链接。对于 'zipper' 链接,此属性控制拉链式合并行为开始的点(默认 100m)。对于主要链接(通行权),该属性无效。 |
| speed | 浮点数 | -1 | 指定使用此连接穿越交叉口时的最大速度(米/秒)。默认情况下,使用连接前后边的平均速度。使用默认值时,速度设置为进入和离开车道的平均值,或者如果设置了选项 --junctions.limit-turn-speed,则设置为基于半径的限制。 |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 为此连接的内部车道指定自定义形状。默认情况下使用插值三次样条。 | |
| uncontrolled | 布尔值 | false | 如果设置为 true,即使其节点受控,此连接也不会受 TLS 控制。 |
| allow | 车辆类列表 | 独立于 from-lane 和 to-lane 权限设置自定义权限。 | |
| disallow | 车辆类列表 | 独立于 from-lane 和 to-lane 权限设置自定义权限。 | |
| changeLeft | 车辆类列表 | 可以从此车道向左变道的车辆类列表 | |
| changeRight | 车辆类列表 | 可以从此车道向右变道的车辆类列表 | |
| length | 浮点数 | 为此连接设置自定义长度 | |
| indirect | 布尔值 | false | 声明间接(两步)转弯运动(影响几何形状和通行权) |
| type | 字符串 | 设置自定义边类型以应用特定车辆类的速度限制 |
如果您只想删除连接,使用以下 xml 定义可能很方便:<delete from="<FROM_EDGE_ID>" to="<T0_EDGE_ID>"/>。属性与简单连接元素相同:
| 属性名 | 值类型 | 描述 |
|---|---|---|
| from | 引用的边 id | 要删除的连接的源边 id |
| to | 引用的边 id | 要删除的连接的目标边 id |
| fromLane | 引用的车道号 | 要删除的连接的源车道索引 |
| toLane | 引用的车道号 | 要删除的连接的目标车道索引 |
注意
请注意,在基本格式中(即没有 fromLane 和 toLane 属性),定义会删除从给定进入边到给定离开边的所有连接。当提供 fromLane 和 toLane 属性时,仅删除从给定车道到给定车道的连接。
发行版中有两个示例。两者都使用位于 "<SUMO_HOME>/docs/examples/netconvert/types/cross_notypes/" 的示例中的节点和边描述。此示例中心的交叉口如下图所示。我们现在称其为“无约束网络”,因为所有连接和掉头都是使用默认值计算的。
无约束网络
示例 <SUMO_HOME>/docs/examples/netconvert/connections/cross3l_edge2edge_conns/" 显示了当使用连接来限制可到达边的数量时会发生什么。为此,我们构建了一个连接文件,其中水平边 ("1si" 和 "2si") 仅连接到它们右侧的边和直行方向的边。文件如下所示:
<connections>
<connection from="1si" to="3o"/>
<connection from="1si" to="2o"/>
<connection from="2si" to="4o"/>
<connection from="2si" to="1o"/>
</connections>
如您在下一张图片中所见,结果网络中的水平边不包含左移连接。
具有显式边到边连接的网络
位于 <SUMO_HOME>/docs/examples/netconvert/connections/cross3l_lane2lane_conns" 的第二个示例中,我们额外描述了应连接哪些车道。相应的连接文件说明直行连接应从进入边的第二条车道开始:
<connections>
<connection from="1si" to="3o" fromLane="0" toLane="0"/>
<connection from="1si" to="2o" fromLane="2" toLane="0"/>
<connection from="2si" to="4o" fromLane="0" toLane="0"/>
<connection from="2si" to="1o" fromLane="2" toLane="0"/>
</connections>
构建的网络如下所示:
具有显式车道到车道连接的网络
注意
请不要对同一 from-edge 同时使用两种类型的连接声明(带车道属性和不带车道属性的)!这些设置的行为未经验证和测试。
设置连接优先级#
自版本 0.9.6 起,您还可以让通过两条边之间连接的车辆等待另一个车流。让我们再看一下上面的“具有显式边到边连接的网络”。这里,所有右移车辆都可以行驶。连接文件中的以下定义让垂直边上的右移车辆等待水平边上的直行车辆:
<connections>
<!-- 接下来的四个连接定义与“具有显式边到边连接的网络”中相同 -->
<connection from="1si" to="3o"/>
<connection from="1si" to="2o"/>
<connection from="2si" to="4o"/>
<connection from="2si" to="1o"/>
<!-- 现在,让垂直连接被水平连接禁止 -->
<!-- 禁止从上到右移动,由从右到左直行禁止 -->
<prohibition prohibitor="2si->1o" prohibited="4si->1o"/>
<!-- 禁止从上到下直行,由从右到左直行禁止 -->
<prohibition prohibitor="2si->1o" prohibited="4si->3o"/>
<!-- 禁止从上到右左转,由从右到左直行禁止 -->
<prohibition prohibitor="2si->1o" prohibited="4si->2o"/>
<!-- 禁止从下到右移动,由从左到右直行禁止 -->
<prohibition prohibitor="1si->2o" prohibited="3si->2o"/>
<!-- 禁止从下到上直行,由从左到右直行禁止 -->
<prohibition prohibitor="1si->2o" prohibited="3si->4o"/>
<!-- 禁止从下到右左转,由从左到右直行禁止 -->
<prohibition prohibitor="1si->2o" prohibited="3si->1o"/>
</connections>
可以看出,有必要禁止垂直边的所有连接,由水平边上的逆时针直行连接禁止,否则水平边上的车辆会因为右先于左规则而想要等待。网络如下所示:
具有显式禁止的网络
prohibition 标签的语法是:<prohibition prohibitor="<PROHIBITING_FROM_EDGE_ID>-><PROHIBITING_TO_EDGE_ID>" prohibited="<PROHIBITED_FROM_EDGE_ID>-><PROHIBITED_TO_EDGE_ID>"/>。
这意味着我们定义两个连接(边到边),禁止者 (prohibitor) 和被禁止者 (prohibited)。每个连接由 from-edge 和 to-edge 定义,用 "->" 分隔。
从同一边到同一目标车道的多个连接#
从版本 0.25.0 开始,指定来自同一边的冲突连接将导致在它们之间建立优先级顺序,从而允许进行无碰撞仿真。默认情况下,最右侧车道将拥有通行权,但这可以使用属性 pass 自定义,如下所示:
<connections>
<connection from="WC" to="CE" fromLane="0" toLane="0"/>
<connection from="WC" to="CE" fromLane="1" toLane="0" pass="true"/>
</connections>
交通灯程序定义 (Traffic Light Program Definition)#
| 交通灯描述 | |
|---|---|
| 文件名扩展名 | .tll.xml |
| 内容类型 | 交通灯定义 |
| 开放格式? | 是 |
| SUMO 特有? | 是 |
| XML 模式 | tllogic_file.xsd |
此文件描述交通灯、信号计划,并定义它们控制的连接。它由下面描述的两种类型的元素组成。必须使用选项 --tllogic-files <FILE> 在 netconvert 中加载此类型的文件。
交通灯定义#
<tlLogic ...> 元素遵循 Simulation/Traffic_Lights 中描述的相同格式。通过在 netconvert 中使用它们,多个程序(甚至对于同一交叉口)可以嵌入到 .net.xml 文件中,而不是加载到 SUMO 中。
注意
通过 netconvert 将 WAUT(程序之间的计划切换) 嵌入网络目前不支持。这些定义必须作为附加文件在仿真开始时加载。
受控连接#
<connection .../> 元素是#连接描述的扩展,用于定义信号计划与受控连接之间的关系。
这可用于通过实现信号组来简化信号计划。在这种情况下,多个连接由信号计划的相同索引定义。它也可用于定义控制多个交叉口的交通灯控制器。
| 属性名 | 值类型 | 描述 |
|---|---|---|
| from | 引用的边 id | 车辆离开的边的名称 |
| to | 引用的边 id | 离开 "from" 时车辆可以到达的边的名称 |
| fromLane | int | 进入车道的车道索引(从 0 开始的数字) |
| toLane | int | 离开车道的车道索引(从 0 开始的数字) |
| tl | string | 控制此连接的交通灯 id |
| linkIndex | int | 控制此连接的 <phase> 元素的 state 属性中的索引 |
您可以通过在 netconvert 中加载 sumo.net.xml 并使用选项 --plain-output-prefix 来轻松获取此类型文件的示例。
人行横道 (Pedestrian Crossings)#
在为行人仿真构建网络时,可以显式指定交叉口的人行横道。这是使用元素在连接文件中完成的。
<crossing node="C" edges="edge1 edge2" priority="true"/>
属性描述如下。
| 属性名 | 值类型 | 描述 |
|---|---|---|
| node | id (字符串) | 此横道所在节点的名称 |
| edges | id (字符串列表) | 被横穿的(道路)边 |
| priority | 布尔值 | 行人是否优先于车辆(在受 TLS 控制的交叉口自动设置为 true)。 |
| width | 实数 (米) | 横道的宽度。 |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 指定此横道的自定义形状。默认情况下是直的。 注意: 形状必须围绕交叉口按逆时针方向定义。 |
| linkIndex | int | 指定信号计划中的自定义索引(正向) |
| linkIndex2 | int | 指定信号计划中的自定义索引(反向) |
| discard | 布尔值 | 是否应丢弃具有给定边的横道。如果 discard 设置为 true,省略 edges 属性会导致丢弃所有横道。 |
行人只能在横道处过街。横道可能具有优先权,这意味着行人可以自由行走,无需考虑车辆交通。这可用于模拟受控交叉口和有标记的人行横道(至少在德国等一些国家)的行为。在无控制的交叉口,行人只能在道路交通中有合适间隙时过街。
注意
当定义双向道路的两条边被分开(例如通过绿色路缘)时,可以为每条边定义一个单独的横道。这将导致所谓的分裂横道,中间有一个步行区。
步行区 (Walking Areas)#
在为行人仿真构建网络时,会自动生成步行区。这些网络元素用于连接多个人行道和人行横道(通常在交叉口的每个角落一个)。步行区的形状可以显式指定。这是在连接文件中使用 walkingArea 元素完成的。
<walkingArea node="C" edges="SC" shape="115.88,88.57 120.38,88.57 120.38,86.87 120.37,83.87 119.86,80.83 118.46,78.53 115.46,78.50 113.74,78.55 113.73,83.05"/>
属性描述如下。
| 属性名 | 值类型 | 描述 |
|---|---|---|
| node | id (字符串) | 此步行区所在节点的名称 |
| edges | id (字符串列表) | 唯一定义步行区的(道路)边。通常,连接到步行区的单条带人行道的边就足够了。如果步行区不连接到任何人行道,而是连接两个人行横道,则必须使用被两个横道横穿的边。 |
| shape | 位置列表;每个位置以 x,y 或 x,y,z 编码,单位为米(数字之间不要用空格分隔!)。 | 指定此步行区的自定义形状。 |
| width | 双精度 | 此步行区上等待/行走的自定义宽度 |
