网络使用的赋值器类型
网络中定义的每个属性都必须具有与参与网络的每个源相对应的值。赋值器为每个源的属性指定值。在 ARC/INFO 和 ArcView GIS(ArcGIS 的前身)中,属性值由 shapefile 或 coverage 中的字段指定。在 ArcGIS 中,字段赋值器为网络源字段的网络属性赋值。此外,ArcGIS 还提供其他类型的可用赋值器,例如常量、字段表达式、函数和脚本赋值器。
赋值器介绍如下。
赋值器 |
描述 |
---|---|
字段赋值器 |
为网络属性指定值的最常见方式就是识别单个字段,该字段用于在网络数据集构建时计算网络属性。例如,当属性值描述测量(如用米表示的每个路段的长度)时,可以使用字段赋值器。 |
字段表达式赋值器 |
字段赋值器经过修改可以使用字段表达式作为值来代替单个字段。在此情况下,可以在字段赋值器 对话框中使用 VBScript 或 Python 来构建表达式。例如,如果网络属性的单位是米,而源数据的单位是英尺,可以创建一个表达式在构建网络数据集时将英尺转换为米。 提示: 以 VBScript 编写的字段表达式赋值器执行速度比以 Python 编写的赋值器快得多。为此,您应尽量使用 VBScript;然而,在选择脚本语言时,请牢记以下几点:
|
常量赋值器 |
可以为属性指定一个常数值。该值可以是表示成本、描述符和等级等属性的数字 (0, 1, 2),也可以是表示约束属性的布尔数据类型“使用约束条件”或“忽略约束条件”。 |
函数赋值器 |
函数赋值器通过执行关于另一属性值或参数值的倍乘函数或逻辑函数来计算属性值。对于数值属性类型,其值可以通过另一属性值乘以某值的表达式获得,例如,行驶时间* 1.25。对于布尔属性类型,其值可以通过将另一属性值与一个参数值比较的表达式获得,例如:MaxHeight < VehicleHeight。 |
通用转弯延迟赋值器 |
通用转弯延迟赋值器用于为两个边元素之间的过渡指定默认成本值。该成本取决于两条边之间的偏转角,以及所遍历的各条边的道路类(主要道路、次要道路或地方道路)。您可以将等级范围对话框和等级属性结合使用来指定道路类。例如,可以使用通用转弯延迟赋值器进行如下设定:由偏转角确定的所有左转弯在从地方道路左转到次要道路时所用的时间大于从地方道路左转到其他地方道路的时间。还可以指定增加其他过渡的成本,例如,在两条次要道路的交叉路口处继续直行时,增加 10 秒的延迟时间。 |
脚本赋值器 |
可根据 VBScript 或 Python 脚本的执行结果指定属性。这为构建复杂属性模型提供了方法。不同于其他赋值器,脚本赋值器不会在构建网络时指定值。相反,只有在特定的网络分析需要使用某属性时(可能发生在求解时),它才会为该属性指定值。如果某个属性的值不断变化,使用脚本赋值器可以确保每个网络分析的属性都得到更新。 提示: 由于脚本赋值器在分析时计算属性值,因此它会对分析性能产生负面影响。如有可能,尝试使用其他赋值器。 以 VBScript 编写的脚本赋值器执行速度比以 Python 编写的赋值器快得多。为此,您应尽量使用 VBScript;然而,在选择脚本语言时,请牢记以下几点:
|
边流量赋值器 |
边流量赋值器专用于流量数据。该类赋值器可通过历史数据或实时数据为某一天的特定时刻和一周中的某一天提供行驶时间。它们包含回退成本属性,可以在一天中的特定时刻的行驶时间不可用时提供工作日及周末的行驶时间。边流量赋值器还具有时间中立成本属性,当路径分析中的排序停止或访问车辆配送时,Network Analyst 参考该属性。 |
每个交汇点源和转弯源都可以有一个赋值器。每个边源可以有两个赋值器 - 边的每个数字化方向各有一个。
可以为边、交汇点和转弯指定默认赋值器。如果没有为特定的源指定明确的赋值器,则该源的值由默认赋值器指定。
以下为指定赋值器的常规工作流程:
- 选择必须指定赋值器的源
- 选择赋值器类型,如字段、常量、函数或脚本。
- 为网络属性指定值。
如果值从一个字段获取,可以在下拉菜单中选择该字段。如果值需要按照字段表达式计算,可以将赋值器类型设置为字段并按键盘上的 F12 调出字段赋值器 对话框。另外,右键单击赋值器 对话框上的源并从值菜单中选择属性也可以打开字段赋值器 对话框。
赋值器示例
为成本属性指定值
下图中的 DriveTime 网络属性为 Streets 源要素类使用了字段赋值器。这在类型列中指明。值列显示 FT_Minutes 字段为 Streets 源的“自-至”方向提供的网络属性值。同样,街道源“至-自”方向的值也由 TF_Minutes 字段决定。
在此例中,网络中的其他边源是过渡边,没有行驶时间。因此,可以为其指定常数值 -1,或常数值零更好,并指定禁止汽车和其他街道车辆的约束属性。
首选应是约束条件而不是负成本,因为累积成本属性时会减去负成本。
此外,成本属性也可以使用函数赋值器通过另一个成本属性获得。例如,对慢速车辆行驶时间建模的属性可以由函数赋值器引用对常速车辆行驶时间建模的属性乘以减速系数获得。
为约束条件指定值
约束属性为布尔数据类型。由于源元素可使用或忽略关联的约束条件,因此可为其指定常数值使用约束条件或忽略约束条件。
此外,约束属性也可以使用函数赋值器通过将另一个属性与一个参数值比较获得。例如,对车辆高度限制建模的属性可以使用函数赋值器将道路的高度限制与车辆实际高度(存储在一个属性参数中)进行比较后获得。当该表达式计算结果为真时,该道路将使用约束条件;当该表达式计算结果为假时,则忽略约束条件。这项规则唯一例外的是,任何时候任意一个运算对象(MaxHeight 或 Vehicle Height)的值为零时,表达式的计算结果总为假。
约束属性也可以通过源要素类中的字段指定。例如,可以使用字段表达式赋值器生成布尔型结果 - 如果表达式为真,元素将使用约束条件,否则元素将忽略约束条件。
创建网络数据集后,ArcGIS Network Analyst 扩展模块将搜索所有源来查找常用字段,如“单向”字段。如果在任意源内找到“单向”字段,都会创建“单向”网络属性并根据字段表达式为相关源指定值。
以下是单向约束属性的 VBScript 表达式的两个屏幕截图。街道的每个数字化方向都有一个赋值器和表达式。
这些表达式根据“单向”字段中的文本值确定允许的行驶方向:
- FT 或 F = 仅允许沿线要素的数字化方向行驶(“自-至”方向)。
- TF 或 T = 仅允许沿与线要素数字化方向相反的方向行驶(“至-自”方向)。
- N = 在这两个方向都不允许行驶。
- 其他任意值 = 在这两个方向都允许行驶。
尽管建议网络赋值器使用 VBScript,但是如果赋值器在 ArcGIS for Server (Linux) 上执行,则需要在 Python 中编写脚本。对于在赋值器对话框的预逻辑脚本代码和值 = 部分输入的内容,VBScript 与 Python 是不同的。
对于 VBScript,您在预逻辑脚本代码中编写一个设置变量的表达式,然后将值 = 设置为该变量。
若要编写 Python 赋值器,您需要在预逻辑脚本代码文本框中编写一个函数,以 def 关键字开头,然后使用 return 关键字在某个点返回一个值,然后从值 = 文本框中调用该函数。以下是说明如何编写 Python 字段表达式赋值器来设置单向约束的两个屏幕截图。将其与上面的 VBScript 示例进行对比,可更好地理解在 VBScript 和 Python 中编写赋值器表达式的区别。
“约束条件用法”参数
约束属性始终具有一个名为“约束条件用法”的关联参数,该参数决定是禁止、仅避免还是甚至首选使用约束条件的元素。在大多数情况下,“约束条件用法”设置为“禁止”,但也有几种情况可以进行其他选择。
分配等级
通过为网络数据集分配等级,可以将边分为不同的等级分级,进而减少求解时间。但应记住,等级求解的结果可能不如非等级求解的结果理想。建议您另外阅读关于使用等级进行网络分析,以便更好地理解等级的涵义以及使用它们的原因。
等级分级以连续的整数定义,从 1 开始。最小的整数(即 1)代表最高等级分级。整数值越大,表明等级分级越低。例如,如果将网络分为三个等级分级,应该为主要道路指定值 1、为次要道路指定值 2,并为三级道路指定值 3。主要道路可以包括省际高速公路,而三级道路可以包括居住区街道。
网络数据集中的等级通常用字段赋值器或字段表达式赋值器来指定。如果 Streets 要素类具有值为 1、2 和 3 的道路类属性(等级),而这三个值分别表示省际公路、主要道路和次要道路,则只使用字段赋值器便可设定该等级属性。
通常会为等级属性指定三个、四个或五个等级分级,但也可以指定所需数量的分级,只要这些分级是由从 1 开始的连续整数表示即可。但是,应避免指定过多的等级分级,因为这会使某些边相对于等级中的其他边而言是断开的,从而导致求解网络分析图层时出现故障。
如果源要素类的某个属性划分的道路组数大于等级中所需的分级数,您可以使用字段表达式赋值器对这些组做进一步分类,从而获得所需的等级分级数。例如,假设街道要素类有一个名为 Func_Class 的整型字段,该字段具有以下六个道路类:
Func_Class |
街道类型 |
---|---|
1 |
省际公路 |
2 |
省际收费公路 |
3 |
国道 |
4 |
主要道路 |
5 |
地方街道 |
6 |
高速公路匝道 |
此外,假定您要按下表对 Func_Class 值进行分组,以创建三个等级分级。
等级分级 | Func_Class 值 |
---|---|
1 | 1(省际公路) 2(省际收费公路) 6(高速公路匝道) |
2 | 3(国道) 4(主干道) |
3 | 5(地方街道) |
要针对这种情况建模,应向“等级”属性的字段赋值器添加脚本。可以选择用 VBScript 或 Python 脚本写入。下例使用的是 VBScript,创建了名为 level 的变量并将其设置为 3(本例中的最低等级分级)。接下来,设置以下条件:如果 Func_Class 为 1、2 或 6,则为 level 指定值 1。如果 Func_Class 为 3 或 4,则为 level 指定值 2。对于所有其他情况,该值保留为 3。由于值文本框包含 level,因此等级网络属性的计算结果是它在脚本结尾处表示的值。
这样可以确保为 Func_Class 值为 1、2 或 6 的所有元素指定等级值 1;为 Func_Class 值为 3 或 4 的所有元素指定等级值 2;并为所有其他元素(即 Func_Class 值为 5 的元素)指定等级值 3。
在 ArcGIS 10 之前的版本中,等级范围 对话框用于将多个字段值恰好转换为三个等级分级。但是,目前将其与通用转弯延迟赋值器结合使用时或在设置流量显示的比例范围时,只是用来定义主次道路和地方道路。这表示等级范围 对话框对网络数据集的等级属性不起任何作用,而只影响通用转弯延迟赋值器。
对等级属性使用通用转弯延迟赋值器时,必须将边划分为三类:地方道路、次要道路和主要道路。由于等级属性可指定任意数量的等级分级,因此使用等级范围 对话框可将指定的分级进一步划分为恰好三种道路类。这样便可基于道路类指定默认添加到转弯行进策略的成本。例如,可以为从次要道路转到地方道路的所有左转弯添加 10 秒延迟,为从地方道路转到其他地方道路的所有左转弯添加 3 秒延迟。将道路类与通用转弯延迟赋值器结合使用时,可以实现许多其他转弯组合。
查看流量时可设置比例范围,以在放大地图时显示所有存在流量的道路。随着地图的缩小,显示屏幕中将依次过滤掉地方干道、次要道路和主要道路。这样交通图将保持工整,只显示与不同地图比例相关的道路等级。比例范围将根据等级范围 对话框中指定的等级范围进行设置。