Mit der Network Analyst-Lizenz verfügbar.
Evaluatoren in einem Netzwerk-Dataset berechnen einen Attributwert für jedes Netzwerkelement und weisen ihn zu. "Feldskript" und "Elementskript" sind zwei Typen von Evaluatoren. Sie berechnen den Wert, der den einzelnen Elementen zugewiesen wird, mithilfe von Ausdrücken. Feldskript-Evaluatoren verwenden Felder aus Netzwerkquellen. Elementskript-Evaluatoren verwenden Parameter für dasselbe Attribut oder Werte von anderen Netzwerkattributen.
Die Feldskript- und Elementskript-Evaluatoren verwenden Python-Ausdrücke auf ähnliche Weise wie das Werkzeug Feld berechnen.
In diesem Thema werden Beispiele für Feldskript- und Elementskript-Evaluatoren beschrieben, die mit Python konfiguriert werden.
Weitere Informationen zu den in einem Netzwerk verwendeten Evaluator-Typen
Beispiele für Feldskript-Evaluatoren
Feldskript-Evaluatoren berechnen den Wert eines Attributs durch das Referenzieren von Feldern aus den Quell-Feature-Classes des Netzwerk-Datasets.
Beim Erstellen von Feldskript-Evaluatoren mit Python müssen Felder anhand ihrer Namen (nicht Aliase) referenziert und in ! eingeschlossen werden. Wenn Sie beispielsweise ein Feld mit dem Namen RoadClass verwenden, codieren Sie das Feld in Python als !RoadClass!.
Für Berechnungen, die die Shape-Länge beinhalten, kann die Geometrie eines Features verwendet werden. Das Shape-Geometrieobjekt wird anhand der proportionalen geodätischen Länge des Quellsegments in den Einheiten des Koordinatensystems der Quell-Feature-Class berechnet. Wenn beispielsweise das Shape-Feld der Feature-Class den Namen Shape aufweist, codieren Sie es in Python als !Shape!. Wenn !Shape! als Teil eines entfernungsbasierten Kostenattributs verwendet wird, wird die proportionale Länge des Quellsegments verwendet, und die Einheiten des Koordinatensystems werden in die Einheiten des Kostenattributs konvertiert. Eigenschaften und Methoden des Geometrieobjekts, wie z. B. !Shape!.length oder !Shape!.getLength() werden nicht unterstützt. In den Feldskript-Evaluatoren wird nur das Basis-!Shape! unterstützt.
Das Feld !Shape_Length!, das die planare Länge des Features enthält, kann ebenfalls zum Berechnen der Länge verwendet werden. Es wird jedoch als Zahl behandelt, und das Koordinatensystem und die proportionale Länge des Features werden nicht berücksichtigt. Seine Einheiten werden im Evaluator als identisch mit der Einheit des Attributs und nicht als Einheit des Koordinatensystems interpretiert. Deshalb wird empfohlen, stattdessen das Feld !Shape! zu verwenden.
NULL-Werte werden je nach Kontext des Wertes unterschiedlich behandelt. Für Boolesche Operationen stimmt NULL mit den gewünschten Kriterien überein oder nicht überein. Wenn jedoch ein NULL-Wert in einer mathematischen Operation verwendet wird, kann der Evaluator möglicherweise nicht den gewünschten Wert berechnen, und dies verursacht beim Berechnen des Netzwerk-Datasets einen Berechnungsfehler. Bei Verwendung eines Feldskript-Evaluators müssen NULL-Werte behandelt werden, um Fehler beim Erstellen oder Berechnen des Netzwerk-Datasets zu vermeiden. Dieses Codebeispiel veranschaulicht die Konfiguration eines Kostenattributs mit Minuteneinheiten, das aus zwei Feldern in der Quell-Feature-Class berechnet wird. Das Feld RoadClass stellt die Straßenklasse dar, und das Skript verwendet die Straßenklasse, um die Geschwindigkeitsbegrenzung der Straße zu bestimmen. Das Feld Miles gibt die Länge der Straße in Meilen an. Die Werte dieser beiden Felder werden kombiniert, um die Fahrzeit entlang der Straße in Minuten zu ermitteln. NULL-Werte und unerwartete Feldwerte für RoadClass werden verarbeitet, indem für diese Straßen ein Standardwert für die Höchstgeschwindigkeit zugewiesen wird. NULL-Feldwerte für Miles werden nicht verarbeitet und führen zu Fehlern, wenn das Netzwerk-Dataset erstellt wird. Dies ist sinnvoll, da diese Fehler behoben werden müssen, damit das Netzwerk korrekt funktioniert, und da es nicht möglich ist, einen angemessenen Standardwert für die Länge eines Straßensegments festzulegen.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
Beispiele für Elementskript-Evaluatoren
Elementskript-Evaluatoren berechnen den Wert des Attributs durch Referenzieren der Werte anderer Attribute, Parameter und Eigenschaften des Netzwerk-Datasets. Da der Elementskript-Evaluator Berechnungen während der Analyse statt während der Erstellung des Netzwerk-Datasets durchführt, kann dieser Typ von Evaluator die Analyse-Performance beeinträchtigen. Verwenden Sie möglichst einen anderen Evaluator-Typ.
In den folgenden Abschnitten wird beschrieben, wie mit Python unter Verwendung von Netzwerkattributen, Netzwerkparametern und weiteren Eigenschaften der Netzwerkelemente Elementskript-Evaluatoren erstellt werden.
Verwenden von Netzwerkattributen und -parametern
In der Methode AttributeValueByName() können die Werte anderer Netzwerkattribute verwendet werden. Hingegen werden in der Methode ParameterValueByName() Parameterwerte des Kontextattributs verwendet. Dies ist das Attribut, für das der Evaluator erstellt wird.
Methode | Beschreibung |
---|---|
AttributeValueByName | Verwenden Sie den Wert eines anderen Attributs des Kontext-Netzwerkelements. Diese Methode akzeptiert den Namen eines Netzwerkattributs als Eingabezeichenfolge. Beispiele: Edge.AttributeValueByName("OtherCost") Junction.AttributeValueByName("OtherRestriction") Turn.AttributeValueByName("OtherRestriction") |
ParameterValueByName | Verwenden Sie den Wert des angegebenen Netzwerkattribut-Parameters des Kontext-Netzwerkattributs. Diese Methode akzeptiert den Namen eines Kontext-Netzwerkattribut-Parameters als Eingabezeichenfolge. Beispiel: ParameterValueByName("OtherParamName") |
Weitere Informationen zu Netzwerkattributen
Weitere Informationen über Netzwerkparameter
Im folgenden Beispiel wird die Impedanz beim Überqueren eines Straßensegments für ein Kostenattribut mit dem Namen CostAdjustedforSlope bestimmt. Dabei ändern sich die Zeitkosten für das Überqueren der Straße per Fahrrad abhängig von der Neigung des Straßensegments. Das Netzwerk verfügt über ein Deskriptor-Attribut mit dem Namen AverageSlope, das die durchschnittliche Neigung des Straßensegments berechnet. Das Netzwerk verfügt außerdem über ein Kostenattribut mit dem Namen Minutes, das die Dauer des Überquerens des Straßensegments in Minuten berechnet. Für CostAdjustedforSlope wurden zwei Parameter eingerichtet, deren Namen SteepUpFactor und SteepDownFactor lauten. Diese stellen den Änderungsfaktor für das Zurücklegen einer Strecke mit steiler Neigung in Aufwärts- oder Abwärtsrichtung dar. Wenn AverageSlope geringer als -0,05 ist und somit ein Straßensegment mit steiler Abwärtsneigung angibt, verringert sich die Zeit zum Überqueren der Straße. Bei einem Wert für AverageSlope, der höher als 0,075 ist, erhöhen sich die Zeitkosten.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
Im nächsten Beispiel wird der Elementskript-Evaluator für eine Beschränkung mit dem Namen Closed ForEvent verwendet, die Knoten auf der Grundlage eines booleschen Parameters mit dem Namen MarketEvent sperrt. Ein Deskriptor-Attribut mit dem Namen MarketIntersection enthält einen booleschen Wert, der bestimmt, ob der angegebene Knoten von dem Ereignis betroffen ist. Wenn sowohl MarketEvent als auch MarketIntersection "True" sind, ist der Knoten beschränkt. Andernfalls ist er passierbar.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
Verwenden von Netzwerkelement-Eigenschaften
Elementskript-Evaluatoren können auch Eigenschaften des Kontext-Netzwerkelements verwenden. Um im Code des Elementskript-Evaluators Netzwerkelement-Eigenschaften zu verwenden, rufen Sie die Eigenschaft nach dem Namen des Elementtyps auf. Dieses Beispiel veranschaulicht, wie ein Abbiege-Beschränkungsattribut mit einem Elementskript-Evaluator unter Verwendung der Eigenschaft Angle des Abbiege-Elements konfiguriert werden kann. Scharfe Kurven, bei denen der Kurvenwinkel in einen bestimmten Wertebereich fällt, sind eingeschränkt.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