需要 Network Analyst 许可。
网络数据集中的赋值器用于计算并分配每个网络元素的属性值。 字段脚本和元素脚本是两种不同类型的赋值器。 它们分别利用表达式来计算分配给每个元素的值。 字段脚本赋值器参考网络源中的字段,而元素脚本赋值器则利用同一属性的参数或其他网络属性的值。
两种赋值器(字段脚本和元素脚本)均使用类似于计算字段工具的 Python 表达式。
本主题将介绍使用 Python 配置的字段脚本和元素脚本赋值器的实例。
字段脚本赋值器示例
字段脚本赋值器通过引用网络数据集源要素类中的字段来计算属性值。
在使用 Python 构建字段脚本赋值器时,应使用字段的名称(而不是别名)进行引用,并使用 ! 代码将名称括起来。 例如,如字段名称为 RoadClass,则在 Python 代码中字段应表示为 !RoadClass!。
要素的几何形状可用于涉及形状长度的计算。 形状几何对象基于源段在源要素类坐标系中的比例测地线长度进行计算。 例如,如要素类的形状字段名为 Shape,则在 Python 代码中应表示为 !Shape!。 当 !Shape! 作为基于距离的成本属性使用时,将依据源段的比例长度,并将坐标系的单位转换为成本属性的单位。 几何对象的属性和方法(如 !Shape!.length 或 !Shape!.getLength())不受支持。 字段脚本赋值器仅支持基础 !Shape!。
包含要素平面长度的 !Shape_Length! 字段可用于长度计算,但将视为数字,不考虑坐标系或要素的比例长度。 在赋值器内部,其单位将被视为与属性单位相同,而不是坐标系的单位。 因此,建议优先使用 !Shape! 字段
空值的处理方式因上下文而异。 对于布尔操作,空值要么符合标准,要么不符合。 然而,当空值用于数学运算时,赋值器可能无法计算出预期值,且在构建网络数据集时会导致构建错误。 因此,在使用字段脚本赋值器时,妥善处理空值非常重要,这样可以避免在构建或求解网络数据集时出现错误。 本代码示例演示了使用根据源要素类中的两个字段计算的分钟单位来配置成本属性。 RoadClass 字段表示道路类,该脚本将使用道路类来确定道路的限速。 Miles 字段表示道路的长度(以英里为单位)。 将组合这两个字段的值以返回沿道路的行驶时间(以分钟为单位)。 将通过为这些道路分配默认限速值来处理 Null 和异常 RoadClass 字段值。 当构建网络数据集时,将不会对 NULL Miles 字段值进行处理,并且将生成错误。 这是预期操作,因为必须解决这些错误,才能确保网络正确运行,并且无法为路段的长度设置合理的默认值。Value:
calc_time(!RoadClass!, !Miles!)
Code Block:
def calc_time(rc, d):
# This example assumes that the speed limit is in miles per hour
# and that the distance field is in miles
if rc == 1: # Local roads
speed_limit = 30
elif rc == 6: # Major roads
speed_limit = 55
elif rc == 2: # Highways
speed_limit = 70
else: # Set a default speed limit if RoadClass does not match any other option
speed_limit = 45
return 60 * d / speed_limit
元素脚本赋值器示例
元素脚本赋值器通过引用网络数据集中的其他属性、参数和属性值来计算属性值。 由于元素脚本赋值器在分析时计算值,而不是在构建网络数据集时,因此此类复制器可能对分析性能产生负面影响。 如果可能,建议使用其他类型的赋值器。
以下部分将介绍如何利用网络属性、参数及其他网络元素属性,通过 Python 构建元素脚本赋值器。
使用网络属性和参数
AttributeValueByName() 方法可以引用其他网络属性的值,而 ParameterValueByName() 方法则使用上下文属性的参数值,即为其编写赋值器的属性。
方法 | 描述 |
---|---|
AttributeValueByName | 使用上下文网络元素的其他属性值。 该方法接受网络属性名称作为输入字符串。 例如: Edge.AttributeValueByName("OtherCost") Junction.AttributeValueByName("OtherRestriction") Turn.AttributeValueByName("OtherRestriction") |
ParameterValueByName | 使用上下文网络属性的指定参数值。 该方法接受上下文网络属性参数名称作为输入字符串。 示例: ParameterValueByName("OtherParamName") |
以下示例将计算遍历一个名为 CostAdjustedforSlope 的成本属性的路段的阻抗,其中骑自行车穿越道路的时间成本会根据路段的坡度进行修改。 网络具有一个名为 AverageSlope 的描述属性,用于计算道路段的平均坡度。 同时,网络还具备一个名为 Minutes 的成本属性,用于计算穿越道路段所需的分钟数。 已经在 CostAdjustedforSlope 上设置了两个参数:SteepUpFactor 和 SteepDownFactor, 分别表示上坡修正因子和下坡修正因子。 如果 AverageSlope 低于 -0.05,表示陡峭的下坡段,将减少穿越该道路的时间。 而当 AverageSlope 超过 0.075 时,将增加时间成本。Value:
cost_adjusted_for_slope("Minutes", "AverageSlope", "SteepUpFactor", "SteepDownFactor")
Code Block:
def cost_adjusted_for_slope(
time_cost_attr_name, slope_attr_name,
up_factor_param_name, down_factor_param_name
):
# Retrieve the values of other attributes for this road
time_cost = Edge.AttributeValueByName(time_cost_attr_name)
slope = Edge.AttributeValueByName(slope_attr_name)
# Retrieve the value of parameters for this attribute
up_factor = ParameterValueByName(up_factor_param_name)
down_factor = ParameterValueByName(down_factor_param_name)
# Set default values in case the parameter values are null
if up_factor is None:
up_factor = 1.25
if down_factor is None:
down_factor = 0.80
# Calculate the modified travel time cost based on slope
factor = 1
if slope < -0.05: # Steep downhill
factor = down_factor
elif slope > 0.075: # Steep uphill
factor = up_factor
modified_cost = factor * time_cost
return modified_cost
在下一个示例中,元素脚本赋值器用于名为 ClosedForEvent 的限制,该限制依据名为 MarketEvent 的布尔参数限制交汇点。 描述属性 MarketIntersection 包含布尔值,用以判断特定交汇点是否会受到事件影响。 如果 MarketEvent 和 MarketIntersection 均为真,则该交汇点将被限制;否则,交汇点可穿越。Value:
is_closed_for_event("MarketIntersection", "MarketEvent")
Code Block:
def is_closed_for_event(is_conditionally_open_attr_name, event_closure_bool_param_name):
is_affected_by_event = Junction.AttributeValueByName(is_conditionally_open_attr_name)
is_closed_for_event_param = ParameterValueByName(event_closure_bool_param_name)
return is_affected_by_event and is_closed_for_event_param
使用网络元素属性
元素脚本赋值器同样可以利用上下文网络元素的属性。 在元素脚本复制器代码中,可以通过在元素类型名称后调用该属性来使用网络元素属性。 本示例将演示如何使用转弯元素的 Angle 属性,通过元素脚本赋值器来配置转弯限制属性。 转弯角度介于一定范围内的急转弯将受到限制。Value:
no_backwards_turn(Turn.Angle)
Code Block:
def no_backwards_turn(angle):
if angle >= 135 and angle <= 225:
# Restrict turns with sharp angles
return True
return False