Exemples d’évaluateur de script

Disponible avec une licence Network Analyst.

Les évaluateurs d’un jeu de données réseau calculent et une valeur attributaire pour chaque élément de réseau. Les scripts de champ et les scripts d’élément constituent deux types d’évaluateur. Chacun d’eux utilise des expressions pour calculer la valeur à attribuer à chaque élément. Les évaluateurs de script de champ font appel à des champs provenant des sources de réseau ; les évaluateurs de script d’élément utilisent des paramètres sur le même attribut ou encore des valeurs issues d’autres attributs de réseau.

Chacun de ces évaluateurs, le script de champ et le script d’élément, utilisent les expressions Python, analogues à l’outil Calculer un champ.

Cette rubrique présente des exemples d’évaluateurs de script de champ et de script d’élément configurés grâce à Python.

En savoir plus sur les types d’évaluateurs utilisés par le réseau

Exemples d’évaluateurs de script de champ

Les évaluateurs de script de champ calculent la valeur de l’attribut en référençant les champs à partir des classes d’entités source du jeu de données réseau.

Boîte de dialogue Évaluateur de script de champ

Lors de la construction des évaluateurs de script de champ avec Python, les champs doivent être référencés à l’aide de leur nom (au lieu de leurs alias) et codés à l’aide de ! pour encadrer le nom. Ainsi, lors de l’utilisation d’un champ appelé RoadClass, codez le champ en tant que !RoadClass! dans Python.

La géométrie d’une entité peut être utilisée pour les calculs impliquant le champ Shape_Length. L’objet géométrie de type forme est calculé selon la longueur géodésique proportionnelle du segment source exprimée dans les unités du système de coordonnées de la classe d’entités source. Par exemple, si le champ de forme de la classe d’entités est appelé Shape, codez-le sous la forme de !Shape! dans Python. Lorsque !Shape! est utilisée en tant que partie d’un attribut de coût basé sur une distance, la longueur proportionnelle du segment source est utilisée et les unités du système de coordonnées sont converties dans les unités de l’attribut de coût. Les propriétés et méthodes de l’objet Géométrie, par exemple  !Shape!.length ou !Shape!.getLength() ne sont pas prises en charge. Seule la base !Shape! est prise en charge dans les évaluateurs de script de champ.

Le champ !Shape_Length!, qui contient la longueur planaire de l’entité, permet également de calculer la longueur, mais il est traité comme un nombre sans tenir compte du système de coordonnées ou de la longueur proportionnelle d’une entité. Dans l’évaluateur, les unités sont interprétées comme les mêmes unités que celles de l’attribut et non comme les unités du système de coordonnées. Pour cette raison, il est recommandé d’utiliser à la place le champ !Shape!.

Les valeurs nulles sont traitées différemment selon le contexte de la valeur. Dans le cadre des opérations booléennes, les valeurs nulles correspondent ou non aux critères souhaités. Cependant, lorsqu’une valeur nulle est utilisée dans une opération mathématique, l’évaluateur peut être dans l’incapacité de calculer la valeur souhaitée. Cela aboutit à une erreur de génération du jeu de données réseau. Lors de l’utilisation d’un évaluateur de script de champ, il est important de traiter les valeurs nulles pour éviter des erreurs à la création ou la résolution du jeu de données réseau.

Cet exemple de code illustre la configuration d’un attribut de coût avec les unités Minutes, calculé à partir de deux champs dans la classe d’entités source. Le champ RoadClass représente la classe Route et le script utilise cette classe pour déterminer la limitation de vitesse de la route. Le champ Miles représente la longueur de la route en miles. Les valeurs de ces deux champs sont combinées pour renvoyer le temps de trajet le long de la route en minutes. Les valeurs de champ RoadClass nulles et inattendues sont gérées en attribuant une valeur de limitation de vitesse par défaut pour ces routes. Les valeurs de champ Miles nulles ne sont pas gérées et génèrent des erreurs lorsque le jeu de données réseau est construit. Cela est recommandé car ces erreurs doivent être résolues pour que le réseau fonctionne correctement et il n’est pas possible de définir une valeur par défaut raisonnable pour la longueur d’un segment de route.

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

Exemples d’évaluateurs de script d’élément

Boîte de dialogue Évaluateur de script d’élément

Les évaluateurs de script d’élément calculent la valeur de l’attribut en référençant les valeurs d’autres attributs, paramètres et propriétés du jeu de données réseau. L'évaluateur de script d’élément calcule ses valeurs au moment de l’analyse plutôt que lorsque le jeu de données réseau est créé, ce type d’évaluateur a tendance à avoir un impact négatif sur les performances d’analyse. Utilisez si possible un autre type d’évaluateur.

Les sections suivantes décrivent la façon de créer des évaluateurs de script d’élément avec Python à l’aide des attributs de réseau, des paramètres et d’autres propriétés des éléments de réseau.

Utiliser les paramètres et les attributs de réseau

La méthode AttributeValueByName() peut utiliser les valeurs d’autres attributs de réseau tandis que la méthode ParameterValueByName() utilise les valeurs de paramètre de l’attribut contextuel, le même attribut pour lequel l’évaluateur est écrit.

MéthodeDescription

AttributeValueByName

Utilisez la valeur d’un autre attribut de l’élément de réseau contextuel.

Cette méthode prend le nom de l’attribut de réseau comme chaîne en entrée.

Exemples :

Edge.AttributeValueByName("OtherCost")

Junction.AttributeValueByName("OtherRestriction")

Turn.AttributeValueByName("OtherRestriction")

ParameterValueByName

Utilisez la valeur de paramètre de l’attribut de réseau spécifié de l’attribut de réseau contextuel.

Cette méthode prend le nom du paramètre de l’attribut de réseau contextuel comme chaîne en entrée.

Exemple :

ParameterValueByName("OtherParamName")

En savoir plus sur les attributs de réseau

En savoir plus sur les paramètres de réseau

L’exemple suivant détermine l’impédance nécessaire pour cheminer sur un segment de route pour un attribut de coût appelé CostAdjustedforSlope pour lequel le coût de temps de circulation à vélo sur la route est modifiée en fonction de la pente du segment de route. Le réseau possède un attribut de descripteur appelé AverageSlope, qui calcule la pente moyenne d’un segment de route. Le réseau possède également un attribut de coût appelé Minutes, qui calcule le nombre de minutes nécessaires pour parcourir un segment de route. Deux paramètres ont été configurés sur CostAdjustedforSlope, l’un s’appelle SteepUpFactor et l’autre SteepDownFactor. Ils représentent le facteur de modification pour monter ou descendre une pente raide, respectivement. Si AverageSlope est inférieur à -0,05 (ce qui indique un segment de route raide en pente descendante), il diminue le temps nécessaire pour parcourir la route. Une valeur AverageSlope supérieure à 0,075 augmente le coût de temps.

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

Dans l’exemple suivant, l’évaluateur de script d’élément est associé à une restriction intitulée ClosedForEvent, laquelle restreint les jonctions en fonction d’un paramètre booléen nommé MarketEvent. Un attribut de type descripteur appelé MarketIntersection contient une valeur booléenne déterminant la jonction spécifique affectée par l’événement. Si les paramètres MarketEvent et MarketIntersection sont tous les deux vrais, la jonction sera restreinte. Dans le cas contraire, il est possible de traverser la jonction.

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

Utiliser les propriétés d’élément de réseau

Les exemples d’évaluateurs de script d’élément peuvent également utiliser des propriétés de l’élément de réseau contextuel. Pour utiliser les propriétés d’élément de réseau dans le code de l’évaluateur de script d’élément, appelez la propriété après le nom du type d’élément.

Cet exemple illustre comment configurer un attribut de restriction tournant avec un évaluateur de script d’élément à l’aide de la propriété Angle de l’élément tournant. Les tournants serrés, pour lesquels l’angle de tournant figure dans une plage de valeurs donnée, sont restreints.

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