Ejemplos de evaluadores de scripts

Disponible con una licencia de Network Analyst.

Los evaluadores de un dataset de red calculan y asignan un valor de atributo a cada elemento de la red. Script de campo y Script de elemento son dos tipos de evaluadores. Cada uno de ellos utiliza expresiones para calcular el valor que se asigna a cada elemento. Los evaluadores Script de campo utilizan campos de fuentes de red; los evaluadores Script de elemento utilizan parámetros del mismo atributo o valores de otros atributos de red.

Cada uno de estos evaluadores, Script de campo y Script de elemento, utiliza expresiones de Python, similares a la herramienta Calcular campo.

Este tema presenta ejemplos de evaluadores Script de campo y Script de elemento configurados con Python.

Más información sobre los tipos de evaluadores utilizados por la red

Ejemplos de evaluadores Script de campo

Los evaluadores Script de campo calculan el valor del atributo haciendo referencia a los campos de las clases de entidades de origen del dataset de red.

Cuadro de diálogo del evaluador Script de campo

Al construir evaluadores Script de campo con Python, los campos deben referenciarse utilizando sus nombres (no sus alias) y codificarse utilizando ! para poner entre corchetes el nombre. Por ejemplo, al utilizar un campo llamado RoadClass, codifique el campo como !RoadClass! en Python.

La geometría de una entidad puede utilizarse para cálculos que impliquen la longitud de la forma. El objeto de geometría de forma se calcula a partir de la longitud geodésica proporcional del segmento de origen en las unidades del sistema de coordenadas de la clase de entidad de origen. Por ejemplo, si el campo de forma de la clase de entidad se denomina Shape, codifíquelo como !Shape! en Python. Cuando !Shape! se utilice como parte de un atributo de coste basado en la distancia, se utilizará la longitud proporcional del segmento de origen y las unidades del sistema de coordenadas se convertirán a las unidades del atributo de coste. Las propiedades y métodos del objeto de geometría, como !Shape!.length o !Shape!.getLength() no son compatibles. Solo el !Shape! base es compatible con los evaluadores Script de campo.

El campo !Shape_Length!, que contiene la longitud plana de la entidad, también puede utilizarse para calcular la longitud, pero se tratará como un número sin tener en cuenta el sistema de coordenadas o la longitud proporcional de una entidad. Dentro del evaluador, sus unidades se interpretarán como la misma unidad que la unidad del atributo, en lugar de la unidad del sistema de coordenadas. Por esta razón, se recomienda utilizar el campo !Shape! en su lugar

Los valores nulos se tratan de otro modo en función del contexto del valor. Para operaciones booleanas, el valor nulo o bien coincide con los criterios deseados o no. Sin embargo, cuando se utiliza un valor nulo en una operación matemática, es posible que el evaluador no pueda computar el valor deseado y se produzca un error de compilación al construir el dataset de red. Cuando se utiliza un evaluador Script de campo, es importante manipular los valores nulos para evitar errores al construir o resolver contra el dataset de red.

Este ejemplo de código muestra la configuración de un atributo de coste con unidades de minutos calculadas a partir de dos campos de la clase de entidades de origen. El campo RoadClass representa la clase de carretera y el script utiliza la clase de carretera para determinar el límite de velocidad de la carretera. El campo Miles representa la longitud de la carretera en millas. Los valores de estos dos campos se combinan para obtener el tiempo de viaje a lo largo de la carretera en minutos. Los valores de campo RoadClass nulos e inesperados se gestionan asignando un valor de límite de velocidad por defecto para estas carreteras. Los valores de campo Miles nulos no se gestionan y generarán errores cuando se construya el dataset de la red. Esto es deseable, ya que estos errores deben corregirse para que la red funcione correctamente, y no es posible definir un valor predeterminado razonable para la longitud de un segmento de carretera.

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

Ejemplos de evaluadores Script de elemento

Cuadro de diálogo del evaluador Script de elemento

Los evaluadores Script de elemento calculan el valor del atributo haciendo referencia a los valores de otros atributos, parámetros y propiedades del dataset de red. Dado que el evaluador Script de elemento calcula sus valores en el momento del análisis y no cuando se construye el dataset de red, este tipo de evaluador tiende a afectar negativamente al rendimiento del análisis. Si es posible, utilice otro tipo de evaluador.

En las secciones siguientes, se describe cómo construir evaluadores Script de elemento con Python mediante atributos y parámetros de red y otras propiedades de los elementos de red.

Utilizar atributos y parámetros de red

El método AttributeValueByName() puede utilizar los valores de otros atributos de red, mientras que el método ParameterValueByName() utiliza los valores de los parámetros del atributo de contexto, el mismo atributo para el que se está escribiendo el evaluador.

MétodoDescripción

AttributeValueByName

Utilice el valor de otro atributo del elemento de red contextual.

Este método toma un nombre de atributo de red como cadena de caracteres de entrada.

Ejemplos:

Edge.AttributeValueByName("OtherCost")

Junction.AttributeValueByName("OtherRestriction")

Turn.AttributeValueByName("OtherRestriction")

ParameterValueByName

Utilice el valor del parámetro de atributo de red especificado del atributo de red contextual.

Este método toma un nombre de parámetro de atributo de red contextual como cadena de caracteres de entrada.

Ejemplo:

ParameterValueByName("OtherParamName")

Más información sobre los atributos de red

Más información sobre los parámetros de red

El siguiente ejemplo determina la impedancia para atravesar un segmento de carretera para un atributo de coste denominado CostAdjustedforSlope, en el que el coste de tiempo para atravesar la carretera en bicicleta se modifica en función de la pendiente del segmento de carretera. La red tiene un atributo descriptor denominado AverageSlope, que calcula la pendiente media del segmento de carretera. La red también tiene un atributo de coste llamado Minutes, que calcula el tiempo en minutos que se tarda en atravesar el segmento de carretera. Se han establecido dos parámetros en CostAdjustedforSlope, uno llamado SteepUpFactor y otro SteepDownFactor. Representan el factor de modificación para subir o bajar, respectivamente, una pendiente pronunciada. Si AverageSlope está por debajo de -0,05, lo que indica un segmento de carretera con pendiente descendente, disminuye el tiempo de recorrido por la carretera. Un valor de AverageSlope superior a 0,075 aumenta el coste de tiempo.

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

En el siguiente ejemplo, el evaluador Script de elemento es para una restricción llamada Closed ForEvent, que restringe los cruces basándose en un parámetro booleano llamado MarketEvent. Un atributo descriptor llamado MarketIntersection contiene un valor booleano que determina si el cruce dado se verá afectada por el suceso. Si tanto MarketEvent como MarketIntersection son verdaderos, el cruce estará restringido; en caso contrario, será transitable.

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

Utilizar las propiedades de los elementos de red

Los evaluadores Script de elemento también pueden utilizar propiedades del elemento de red contextual. Para utilizar las propiedades de los elementos de red en el código del evaluador Script de elemento, invoque la propiedad después del nombre del tipo de elemento.

Este ejemplo muestra cómo configurar un atributo de restricción de giro con un evaluador Script de elemento utilizando la propiedad Angle del elemento de giro. Los giros bruscos, para los que el ángulo de giro se encuentra en un determinado rango de valores, están restringidos.

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