Erstellen eines Python-Skriptwerkzeugs mit arcpy.nax

Mit der Network Analyst-Lizenz verfügbar.

Sie können das arcpy.nax-Modul Python verwenden, um Netzwerkanalyse-Workflows zu automatisieren. Nachdem Sie mit Python ein arcpy.nax-Skript geschrieben haben, können Sie das Skript in ein Skriptwerkzeug umwandeln, das wie jedes andere Geoverarbeitungswerkzeug ausgeführt werden kann. In diesem Lernprogramm erfahren Sie, wie Sie einen einfachen Netzwerkanalyse-Workflow schreiben und ein Skriptwerkzeug für dessen Ausführung konfigurieren.

Hinweis:

In diesem Lernprogramm lernen Sie zwar, wie Sie ein Skriptwerkzeug in einer .atbx-Toolbox erstellen, aber Sie können auch ein benutzerdefiniertes Geoverarbeitungswerkzeug mit Python und dem Modul arcpy.nax unter Verwendung einer Python-Toolbox (.pyt) erstellen. Lernen Sie die Unterschiede zwischen einem Skriptwerkzeug und einer Python-Toolbox (.pyt) kennen. Viele der Lektionen in diesem Lernprogramm gelten für beide Werkzeugtypen.

Das in diesem Lernprogramm erstellte Skriptwerkzeug dient zum Ausführen einer Einzugsgebiets-Analyse und zum Schreiben der resultierenden Einzugsgebiets-Polygone in eine Feature-Class.

Hinweis:

In diesem Lernprogramm wird die Einzugsgebiets-Analyse als Beispiel verwendet, aber Sie können ein Skriptwerkzeug zum Ausführen beliebiger Netzwerkanalysetypen erstellen.

Sie erstellen das Werkzeug mit den folgenden Parametern, die beim Verwenden des Werkzeugs eingestellt werden können:

  • Input Facilities: Punkte, für die die Einzugsgebiets-Polygone berechnet werden
  • Output Polygons: Ausgabe-Feature-Class, die vom Werkzeug erstellt wird
  • Network: Netzwerk-Dataset oder Netzwerkanalyseservice, mit dem die Einzugsgebiete berechnet werden
  • Travel Mode: Reisemodus für die Analyse
  • Cutoffs: Grenzwert des Einzugsgebiets für die Reisezeit oder die Entfernung
  • Cutoff Units: Zeit- oder Entfernungseinheiten, in denen der Parameterwert Grenzwerte interpretiert werden soll
  • Time of Day: Datum und Uhrzeit, die für die Analyse verwendet werden sollen
Zeigt das Dialogfeld für das in diesem Lernprogramm erstellte Skriptwerkzeug gefüllt mit gültigen Eingaben an.

Zusammenstellen von Testdaten

Ziel dieses Lernprogramms ist das Erstellen eines Skriptwerkzeugs, das für beliebige Eingabedaten verwendet werden kann. Es sind keine bestimmten Daten erforderlich, aber Sie benötigen zum Testen des Skriptwerkzeugs Folgendes:

  • Ein Netzwerk-Dataset oder Zugriff auf einen Netzwerkanalyseservice
  • Eine Point-Feature-Class mit Testpunkten, die sich im gleichen geographischen Bereich wie das Netzwerk befinden

Wenn Sie keine eigenen Daten haben, können Sie die bereitgestellten Lernprogrammdaten herunterladen und verwenden.

Hinweis:
Beim Durcharbeiten dieses Lernprogramms kann als Netzwerkdatenquelle eine der folgenden Optionen verwendet werden: das für das Lernprogramm angegebene Netzwerk-Dataset, ArcGIS Online oder ein ArcGIS Enterprise-Routing-Service, der mit einem Netzwerk-Dataset veröffentlicht wurde, das die Geographie der Eingabedaten der Analyse abdeckt. Wenn Sie ArcGIS Online verwenden, werden Credits verbraucht. Weitere Informationen zur Netzwerkanalyse mit einem Service
Tipp:

Die bereitgestellten Lernprogrammdaten enthalten ein abgeschlossenes Skriptwerkzeug, das mit den folgenden Schritten des Lernprogramms erstellt wurde. Sie finden es im Ordner Tutorial\ScriptTool der extrahierten Lernprogrammdaten.

  1. Wechseln Sie zur Daten-Download-Seite.
  2. Klicken Sie auf die Schaltfläche Herunterladen, um die Datei lokal zu speichern.
  3. Entzippen Sie die heruntergeladene Datei.

Erstellen des Werkzeugs

Zuerst erstellen Sie das Werkzeug in einer neuen Toolbox und definieren die Eingabe- und Ausgabeparameter.

Erstellen der Toolbox

Erstellen Sie eine Toolbox zum Speichern des Skriptwerkzeugs.

  1. Öffnen Sie ArcGIS Pro, und erstellen Sie ein neues Projekt mit einer Karte.
  2. Klicken Sie im Bereich Katalog, der sich standardmäßig auf der rechten Seite der Anwendung befindet, mit der rechten Maustaste auf Ordner, und wählen Sie Ordnerverbindung hinzufügen Ordnerverbindung hinzufügen aus.

    Daraufhin wird das Dialogfeld Ordnerverbindung hinzufügen angezeigt.

  3. Stellen Sie eine Verbindung mit einem Ordner Ihrer Wahl her.

    In diesem Ordner werden Sie die Toolbox erstellen und die Python .py-Datei des Skriptwerkzeugs speichern.

  4. Klicken Sie mit der rechten Maustaste auf die Ordnerverbindung, und klicken Sie auf Neu > Toolbox (.atbx).

    Daraufhin wird eine Toolbox-Datei mit der Erweiterung .atbx erstellt. Der Name der Toolbox wird in den Bearbeitungsmodus versetzt.

  5. Ändern Sie den Namen der Toolbox in TutorialScriptTool.atbx.
  6. Klicken Sie mit der rechten Maustaste auf die Toolbox, und klicken Sie dann auf Eigenschaften.

    Das Dialogfeld Toolbox-Eigenschaften wird geöffnet.

  7. Aktualisieren Sie im Feld Beschriftung die Beschriftung der Toolbox in Tutorial Script Tool.
  8. Aktualisieren Sie im Feld Alias den Alias der Toolbox in TutorialScriptTool.

    Der Alias der Toolbox wird beim Aufrufen eines Werkzeugs über einen Python-Prozess verwendet.

    Das Dialogfeld
  9. Klicken Sie auf OK, um das Dialogfeld Toolbox-Eigenschaften zu schließen.

Erstellen des Skriptwerkzeugs in der Toolbox

Als Nächstes erstellen Sie das Skriptwerkzeug in der Toolbox und aktualisieren seine grundlegenden Eigenschaften.

  1. Klicken Sie mit der rechten Maustaste auf die im vorherigen Abschnitt erstellte Toolbox, und klicken Sie auf Neu > Skript.

    Das Dialogfeld Neues Skript wird angezeigt.

  2. Klicken Sie in der Liste der seitlichen Registerkarten auf die Registerkarte Allgemein, wenn diese nicht bereits ausgewählt ist.
  3. Geben Sie im Textfeld Name den Namen ServiceAreaTutorialScriptTool ein.

    Der Name wird beim Aufrufen des Werkzeugs über einen Python-Prozess verwendet. Verwenden Sie für den Namen nur alphanumerische Zeichen. Der Name darf keine Leerzeichen oder Sonderzeichen enthalten.

  4. Geben Sie im Textfeld Beschriftung den Text Service Area Tutorial Script Tool ein.

    Die Beschriftung ist der Anzeigename des Skriptwerkzeugs im Bereich Geoverarbeitung und darf Leerzeichen enthalten.

    Das Dialogfeld
  5. Geben Sie nach Wunsch im Textfeld Beschreibung eine Beschreibung für das Skriptwerkzeug ein.

Definieren der Werkzeugparameter

Im nächsten Schritt definieren Sie die Parameter des Werkzeugs. Parameter werden im Dialogfeld des Werkzeugs angezeigt und ermöglichen den Benutzern das Auswählen von Eingabedaten, Ausgabeverzeichnissen und anderen Optionen. Bei der Ausführung des Werkzeugs werden die Parameterwerte an das Python-Skript des Werkzeugs gesendet. Die Parameterwerte werden vom Skript abgerufen und bei der Analyse verwendet.

Sie erstellen wie zu Beginn des Lernprogramms beschrieben sieben Parameter.

Weitere Informationen zum Festlegen von Parametern für Skriptwerkzeuge

  1. Klicken Sie in der Liste der seitlichen Registerkarten auf die Registerkarte Parameter.
  2. Führen Sie zum Erstellen des Parameters Input Facilities die folgenden Teilschritte aus:

    Mit dem Parameter Input Facilities können die Benutzer eine Feature-Class oder einen Layer mit Punkten auswählen, um die die Einzugsgebiets-Polygone berechnet werden.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Input Facilities ein, und drücken Sie die Eingabetaste.

      Der Parameter Input Facilities wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Input_Facilities aktualisiert.

    2. Klicken Sie in der Zelle Datentyp auf die Schaltfläche "Optionen" Optionen, um das Dialogfeld Datentyp des Parameters zu öffnen.
    3. Wählen Sie im Dialogfeld Datentyp des Parameters im Dropdown-Menü die Option Feature-Layer aus, und klicken Sie auf OK, um das Dialogfeld zu schließen.
      Das Dialogfeld "Datentyp des Parameters" mit ausgewähltem Typ "Feature-Layer"

      Bei einem Parameter des Typs Feature-Layer können die Benutzer des Werkzeugs als Eingabe für diesen Parameter entweder einen Layer auf der Karte auswählen oder einen Katalogpfad zu einer Feature-Class verwenden.

    4. Klicken Sie auf die Zelle in der Spalte Filter. Führen Sie gegebenenfalls einen Bildlauf nach rechts durch, um die Spalte anzuzeigen.
    5. Wählen Sie im Dropdown-Menü die Option Feature-Typ aus.
      Wählen Sie den Filter "Feature-Typ" für den Parameter "Input Facilities" aus.

      Das Dialogfeld Feature-Typ-Filter wird angezeigt.

    6. Aktivieren Sie im Dialogfeld Feature-Typ-Filter die Option Punkt, und klicken Sie auf OK, um das Dialogfeld zu schließen.
      Das Dialogfeld "Feature-Typ-Filter" mit aktivierter Option "Punkt"

      Einrichtungen von Einzugsgebieten müssen Punkte sein. Wenn dieser Feature-Typ-Filter festgelegt wurde, sind als Eingaben für den Parameter Input Facilities nur Point-Feature-Classes und Punkt-Layer zulässig. Wenn die Benutzer zum Beispiel eine Polygon- oder Line-Feature-Class auswählen, wird für den Werkzeugparameter automatisch ein Fehler angezeigt.

  3. Führen Sie zum Erstellen des Parameters Output Polygons die folgenden Teilschritte aus:

    Mit dem Parameter Output Polygons können die Benutzer den Speicherort für die bei der Ausführung des Werkzeugs erstellte Polygon-Feature-Class des Einzugsgebiets auswählen.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Output Polygons ein, und drücken Sie die Eingabetaste.

      Der Parameter Output Polygons wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Output_Polygons aktualisiert.

    2. Klicken Sie genauso wie beim Definieren des Datentyps für den Parameter Input Facilities auf die Zelle Datentyp, um das Dialogfeld Datentyp des Parameters zu öffnen. Legen Sie dieses Mal den Datentyp auf Feature-Class fest.

      Bei einem Ausgabeparameter des Typs Feature-Class können Sie den Katalogpfad zu einer neuen Feature-Class auswählen.

    3. Klicken Sie auf die Zelle in der Spalte Richtung, und wählen Sie im Dropdown-Menü die Option Ausgabe aus.

      Da dieser Parameter als Ausgabeparameter konfiguriert ist, können die Benutzer einen Ausgabedateipfad und einen Namen für eine noch nicht vorhandene Feature-Class auswählen.

  4. Führen Sie zum Erstellen des Parameters Network die folgenden Teilschritte aus:

    Mit dem Parameter Network können die Benutzer das Netzwerk-Dataset oder den Netzwerkanalyseservice für die Berechnung der Einzugsgebiete auswählen.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Network ein, und drücken Sie die Eingabetaste.

      Der Parameter Network wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Network aktualisiert.

    2. Legen Sie in der Spalte Datentyp den Datentyp auf Netzwerkdatenquelle fest.

      Bei dem Parametertyp Netzwerkdatenquelle können die Benutzer einen Netzwerk-Dataset-Layer, einen Netzwerk-Dataset-Katalogpfad oder die URL eines Netzwerkanalyseservice auswählen. Für einen Parameter des Typs Netzwerk-Dataset-Layer können die Benutzer nur einen Netzwerk-Dataset-Layer oder einen Netzwerk-Dataset-Katalogpfad auswählen. Eine Service-URL kann in dem Fall nicht verwendet werden. Mit dem Parametertyp Netzwerk-Dataset ist nur ein Netzwerk-Dataset-Katalogpfad zulässig. Dieser Typ wird häufiger als Parametertyp für Ausgaben als für Eingaben verwendet.

  5. Führen Sie zum Erstellen des Parameters Travel Mode die folgenden Teilschritte aus:

    Mit dem Parameter Travel Mode können die Benutzer den für die Analyse verwendeten Reisemodus auswählen. Sie konfigurieren diesen Parameter mit einer Abhängigkeit, damit die Auswahlliste automatisch gemäß den für den ausgewählten Wert des Parameters Network verfügbaren Reisemodi aktualisiert wird.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Travel Mode ein, und drücken Sie die Eingabetaste.

      Der Parameter Travel Mode wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Travel_Mode aktualisiert.

    2. Legen Sie in der Spalte Datentyp den Datentyp auf Netzwerkreisemodus fest.
    3. Klicken Sie auf die Zelle in der Spalte Abhängigkeit. Führen Sie gegebenenfalls einen Bildlauf nach rechts durch, um die Spalte anzuzeigen.
    4. Wählen Sie in der Zelle der Spalte Abhängigkeit im Dropdown-Menü die Option Network aus.
      Wählen Sie im Dropdown-Menü in der Spalte "Abhängigkeit" des Parameters "Travel Mode" den Parameter "Network" aus.

      Der Parameter Travel Mode ist jetzt mit dem Parameter Network verknüpft. Im Dialogfeld des Werkzeugs wird die Auswahlliste des Parameters Travel Mode automatisch gemäß dem im Parameter Network festgelegten Wert aktualisiert.

  6. Führen Sie zum Erstellen des Parameters Cutoffs die folgenden Teilschritte aus:

    Mit dem Parameter Cutoffs können die Benutzer einen oder mehrere numerische Werte auswählen, die die Grenzwerte der Reisezeit oder Entfernung für das Einzugsgebiet angeben. Die Einzugsgebiets-Polygone zeigen den Bereich an, der von den Eingabeeinrichtungen aus innerhalb dieser Grenzwerte erreichbar ist. Wenn mehrere Werte eingegeben werden, wird für jede Einrichtung und jeden Grenzwert ein Einzugsgebiets-Polygon erstellt. Die Ausgabe kann beispielsweise Polygone enthalten, die sowohl eine Fahrzeit von 10 Minuten als auch eine Fahrzeit von 15 Minuten um jede Einrichtung herum darstellen.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Cutoffs ein, und drücken Sie die Eingabetaste.

      Der Parameter Cutoffs wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Cutoffs aktualisiert.

    2. Klicken Sie in der Zelle Datentyp auf die Schaltfläche "Optionen" Optionen, um das Dialogfeld Datentyp des Parameters zu öffnen.
    3. Wählen Sie im Dialogfeld Datentyp des Parameters im Dropdown-Menü die Option Double aus.
    4. Aktivieren Sie im Dialogfeld Datentyp des Parameters die Option Mehrere Werte.
      Dialogfeld "Datentyp des Parameters" mit ausgewähltem Typ "Double" und aktivierter Option "Mehrere Werte"

      Wenn die Option Mehrere Werte aktiviert ist, können die Benutzer mehr als einen Wert für den Parameter eingeben.

    5. Klicken Sie auf OK, um das Dialogfeld Datentyp des Parameters zu schließen.

    Grenzwerte für Einzugsgebiete müssen größer als null sein. Es wäre nicht sinnvoll, ein Polygon zu erstellen, das eine Fahrzeit von null Minuten oder eine negative Fahrzeit darstellt. Sie können einen numerischen Parameter mit einem Bereichsfilter konfigurieren, indem Sie die Option Bereich in der Spalte Filter auswählen. Wenn Benutzer eine Zahl außerhalb dieses Bereichs auswählen, wird automatisch eine Fehlermeldung angezeigt. Für Bereichsfilter werden jedoch nur numerische Bereiche unterstützt, und Sie möchten die untere Grenze von 0 ausschließen, aber Dezimalwerte wie 0,5 zulassen. Daher verwenden Sie anstelle des bereitgestellten Bereichsfilters die Werkzeugvalidierung zum Erstellen eines eigenen Bereichsfilters mit Python-Code. Die Vorgehensweise dafür wird weiter unten in diesem Lernprogramm beschrieben.

  7. Führen Sie zum Erstellen des Parameters Cutoff Units die folgenden Teilschritte aus:

    Mit dem Parameter Cutoff Units können die Benutzer die Maßeinheit angeben, in der der Parameterwert Cutoffs interpretiert werden soll.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Cutoff Units ein, und drücken Sie die Eingabetaste.

      Der Parameter Cutoff Units wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Cutoff_Units aktualisiert.

    2. Vergewissern Sie sich in der Spalte Datentyp, dass der Datentyp auf String (d. h. Zeichenfolge) festgelegt ist oder ändern Sie ihn gegebenenfalls entsprechend.

    Um eine Auswahlliste für einen Parameter zu konfigurieren, können Sie die Option Werteliste in der Spalte Filter auswählen und die Liste der Werte eingeben, die den Benutzern angezeigt werden sollen. Die Auswahlliste für den Parameter Cutoff Units soll jedoch dynamisch sein und davon abhängen, ob der vom Benutzer für den Parameter Travel Mode ausgewählte Wert Zeit- oder Entfernungseinheiten aufweist. Im nächsten Abschnitt verwenden Sie die Werkzeugvalidierung, um mit Python-Code eine dynamische Auswahlliste zu erstellen.

  8. Führen Sie zum Erstellen des Parameters Time of Day die folgenden Teilschritte aus:

    Mit dem Parameter Time Of Day können die Benutzer Datum und Uhrzeit für die Analyse festlegen. Dabei handelt es sich um Datum und Uhrzeit des Zeitpunktes, zu dem Fahrzeuge oder Fußgänger die Einrichtungen verlassen. Da der Zeitpunkt nicht immer relevant ist, konfigurieren Sie diesen Parameter als optional. Die Benutzer können ihn bei Bedarf festlegen oder leer lassen.

    1. Klicken Sie auf die erste leere Zelle unter der Spalte Beschriftung, geben Sie Time Of Day ein, und drücken Sie die Eingabetaste.

      Der Parameter Time Of Day wird erstellt. Die Zelle in der Spalte Name wird automatisch auf Time_Of_Day aktualisiert.

    2. Legen Sie in der Spalte Datentyp den Datentyp auf Datum fest.
    3. Klicken Sie auf die Zelle in der Spalte Typ, und wählen Sie im Dropdown-Menü die Option Optional aus.

      Da dieser Parameter als optional konfiguriert ist, können die Benutzer ihn leer lassen, ohne dass ein Fehler angezeigt wird.

  9. Überprüfen Sie die Parameterkonfiguration. Sie sollte ungefähr wie die folgende Abbildung aussehen:
    Die vollständige Parameterkonfiguration für das Skriptwerkzeug
  10. Klicken Sie im Dialogfeld Neues Skript auf OK, um die vorgenommenen Änderungen zu bestätigen und das Dialogfeld zu schließen.

Überprüfen der Werkzeugparameter

Nachdem Sie die Werkzeugparameter konfiguriert haben, sollten Sie jetzt überprüfen, ob sie wie gewünscht funktionieren. Sie müssen noch die benutzerdefinierte Validierung für einige Parameter konfigurieren, und Sie können das Werkzeug noch nicht ausführen, da Sie den Ausführungscode für das Werkzeug noch nicht geschrieben haben. Nehmen Sie sich jedoch einen Moment Zeit, um die bisherige Parameterkonfiguration zu überprüfen.

  1. Suchen Sie im Bereich Katalog in der Toolbox das neue Skriptwerkzeug Service Area Tutorial Script Tool.
    Die Toolbox und das Skriptwerkzeug im Bereich "Katalog"
  2. Doppelklicken Sie auf das Werkzeug, um es zu öffnen.

    Das Skriptwerkzeug Service Area Tutorial Script Tool wird im Bereich Geoverarbeitung geöffnet. Die sieben Parameter, die Sie im vorherigen Abschnitt erstellt haben, werden angezeigt.

    Dialogfeld des Skriptwerkzeugs mit allen Parametern im Bereich "Geoverarbeitung"
  3. Sehen Sie sich die einzelnen Parameter genauer an, und vergewissern Sie sich, dass das Verhalten Ihren Erwartungen entspricht.
    1. Sehen Sie sich den Parameter Input Facilities genauer an.

      Sie sollten mit diesem Parameter nur Punkt-Layer und Point-Feature-Classes auswählen können. Polygon- und Line-Feature-Classes werden in der Auswahlliste nicht angezeigt, und wenn Sie sie manuell eingeben, wird eine Fehlermeldung angezeigt, in der darauf hingewiesen wird, dass die Eingabe einen ungültigen Geometrietyp aufweist.

      Tipp:
      Wenn die Karte keine Feature-Layer enthält, wird keine Auswahlliste angezeigt. Fügen Sie der Karte Layer hinzu, wenn Sie das Verhalten des Parameters prüfen möchten.

    2. Untersuchen Sie den Parameter Output Polygons.

      Sie sollten das Ausgabeverzeichnis auswählen können. Wenn Sie eine vorhandene Feature-Class auswählen, sollte für den Parameter eine Warnung angezeigt werden, aus der hervorgeht, dass die Ausgabe bereits vorhanden ist.

    3. Sehen Sie sich die Parameter Network und Travel Mode genauer an.

      Der Parameter Travel Mode sollte anfangs leer sein und keine Auswahlliste enthalten. Für den Parameter Network sollten Sie einen Netzwerk-Dataset-Layer, einen Netzwerk-Dataset-Katalogpfad oder eine URL eines Netzwerkanalyseservice auswählen können.

    4. Wählen Sie für den Parameter Network einen Wert aus.

      Die Auswahlliste des Parameters Travel Mode wird automatisch aktualisiert und enthält nun die Liste der verfügbaren Reisemodi, die mit dem Wert Network verknüpft sind.

    5. Sehen Sie sich den Parameter Cutoffs genauer an.

      Sie können mehrere numerische Werte eingeben.

      Zurzeit können Sie negative Zahlen oder 0 eingeben, und für den Parameter wird kein Fehler angezeigt. Später verwenden Sie die Werkzeugvalidierung, um dieses Verhalten zu aktualisieren.

    6. Sehen Sie sich den Parameter Cutoff Units genauer an.

      Zurzeit wird für den Parameter keine Auswahlliste angezeigt. Später verwenden Sie die Werkzeugvalidierung, um eine vom Wert Travel Mode abhängende Auswahlliste bereitzustellen.

    7. Sehen Sie sich den Parameter Time Of Day genauer an.

      Anders als bei den anderen Parametern wird kein rotes Sternchen angezeigt, wenn dieser Parameter leer ist, da er optional ist. Sie können die Auswahl für Datum und Uhrzeit verwenden oder manuell ein Datum und eine Uhrzeit eingeben.

Schreiben des Python-Skriptes

In diesem Abschnitt schreiben Sie das Python-Skript, das vom Skriptwerkzeug ausgeführt werden soll. Das Skriptwerkzeug führt die folgenden Aktionen aus:

  • Abrufen der Eingabeparameter
  • Gegebenenfalls Auschecken der Lizenz für die Erweiterung "ArcGIS Network Analyst"
  • Initialisieren der Einzugsgebiets-Analyse
  • Festlegen der Einstellungen für die Einzugsgebiets-Analyse
  • Laden der Einrichtungen für die Eingabe
  • Berechnen der Einzugsgebiets-Analyse und Behandeln von Berechnungsfehlern
  • Schreiben der ausgegebenen Einzugsgebiets-Polygone in eine Feature-Class

  1. Erstellen Sie eine Datei namens ServiceAreaTutorialScriptTool.py im gleichen Ordner, in dem Sie zuvor die Toolbox erstellt haben, und öffnen Sie die Datei für die Bearbeitung in der integrierten Entwicklungsumgebung (Integrated Development Environment, IDE) oder im Texteditor Ihrer Wahl.

    Sie können für diese Übung eine beliebige Python-IDE bzw. einen beliebigen Texteditor verwenden.

  2. Lesen Sie die folgenden Teilabschnitte, um sich über die Komponenten des Codes zu informieren, den Sie für das Skriptwerkzeug verwenden werden.
  3. Den vollständigen Code finden Sie am Ende dieses Abschnitts. Kopieren Sie diesen Code, fügen Sie ihn in die ServiceAreaTutorialScriptTool.py-Datei ein, und speichern Sie die Datei.

    Vorsicht:
    Vergewissern Sie sich nach dem Einfügen des Codes in die ServiceAreaTutorialScriptTool.py-Datei, dass die Einrückung richtig ist.

Abrufen der Eingabeparameter

Der Code des Skriptwerkzeugs muss die Benutzereingaben aus den Parametern des Werkzeugs mit der ArcPy-Funktion GetParameter oder GetParameterAsText abrufen. Die Funktion GetParameter gibt den Parameterwert im definierten Datentyp des Parameters zurück, und die Funktion GetParameterAsText gibt immer den Wert des Parameters als Zeichenfolge zurück.

In diesem Codeausschnitt ruft das Skript die Werkzeugparameter ab und weist sie Variablen zu. Die Funktion GetParameter wird verwendet, wenn Sie den Datentyp des Eingabeparameters beibehalten möchten. Die Funktion GetParameterAsText wird beim Abrufen der Eingabeeinrichtungen und der Netzwerkdatenquelle verwendet, obwohl diese Eingaben Layer sein können, da die Zeichenfolgennamen der Layer als gültige Eingaben für Geoverarbeitungswerkzeuge und ArcPy-Funktionen verwendet werden können. Die hier für GetParameter und GetParameterAsText verwendeten Indexwerte entsprechen der Reihenfolge der Parameter, die Sie weiter oben definiert haben.

input_facilities = arcpy.GetParameterAsText(0)
output_polygons = arcpy.GetParameterAsText(1)
network = arcpy.GetParameterAsText(2)
travel_mode = arcpy.GetParameter(3)
cutoffs = arcpy.GetParameter(4)
cutoff_units = arcpy.GetParameterAsText(5)
time_of_day = arcpy.GetParameter(6)

Auschecken der Lizenz für die Erweiterung "ArcGIS Network Analyst"

Die Lizenz für die Erweiterung "ArcGIS Network Analyst" ist erforderlich, wenn die Werkzeugbenutzer für den Parameter Network ein Netzwerk-Dataset auswählen. Wenn sich die Benutzer stattdessen durch Festlegen einer Portal-URL für die Verwendung eines Netzwerkanalyseservice entscheiden, ist die Lizenz für die Erweiterung "ArcGIS Network Analyst" nicht erforderlich.

In diesem Codeausschnitt wird versucht, die Erweiterungslizenz auszuchecken, wenn das Eingabe-Netzwerk nicht mit http beginnt und es sich daher vermutlich nicht um einen Netzwerkanalyseservice handelt. Wenn die Erweiterung nicht verfügbar ist, wird ein Fehler ausgelöst. Die Fehlerbehandlung wird weiter unten in diesem Lernprogramm erläutert.

# Check out the Network Analyst extension license if the input network
# is a local network dataset and not a service.
if not network.startswith("http"):
    if arcpy.CheckExtension("network") == "Available":
        arcpy.CheckOutExtension("network")
    else:
        # Throw an error if the license cannot be checked out.
        arcpy.AddError("The Network Analyst license is unavailable.")
        raise CustomError

Initialisieren der Einzugsgebiets-Analyse

Im ersten Schritt eines Netzwerkanalyse-Workflows mit arcpy.nax wird das Analyseobjekt des Solvers mit der festgelegten Netzwerkdatenquelle instanziiert.

Weitere Informationen zu den Schritten eines Netzwerkanalyse-Workflows mit arcpy.nax

In diesem Codeausschnitt wird das Einzugsgebiets-Analyseobjekt initialisiert.

# Instantiate the ServiceArea solver object
sa = arcpy.nax.ServiceArea(network)

Festlegen der Einstellungen für die Einzugsgebiets-Analyse

Für diese Analyse werden Sie einige Einstellungen für die Einzugsgebiets-Analyse hart codieren, die nicht von Benutzern geändert werden sollen. Sie legen weitere Einstellungen basierend auf der Auswahl der Benutzer in den Werkzeugparametern fest.

Weitere Informationen zu den Einstellungen für die Einzugsgebiets-Analyse

In diesem Codeausschnitt sind einige Analyseeinstellungen hart codiert. Reisemodus, Zeitpunkt und standardmäßige Impedanz-Grenzwerte werden auf die aus den Werkzeugparametern abgerufenen Werte festgelegt.

# Hard-code some non-default Service Area settings that we don't want
# the user to change
sa.geometryAtCutoff = arcpy.nax.ServiceAreaPolygonCutoffGeometry.Disks
sa.polygonBufferDistance = 150
sa.polygonBufferDistanceUnits = arcpy.nax.DistanceUnits.Feet

# Set analysis properties chosen by the user and passed in via tool
# parameters
sa.travelMode = travel_mode
sa.timeOfDay = time_of_day
sa.defaultImpedanceCutoffs = cutoffs

Außerdem müssen Sie die Grenzwerteinheiten festlegen, was jedoch zusätzliche Verarbeitung erfordert. Der Werkzeugparameter wird als Zeichenfolge konfiguriert, und Sie müssen den zeichenfolgenbasierten Namen der Einheit in den entsprechenden TimeUnits- oder DistanceUnits-Enumerationswert konvertieren.

In diesem Codeausschnitt werden die Zeit- oder Entfernungseinheiten abhängig von dem vom Werkzeugparameter übergebenen Wert festgelegt. Dabei werden zwei Funktionen verwendet, um den Wert von einem Zeichenfolgenwert in den entsprechenden Enumerationswert zu konvertieren. In diesem Beispielwerkzeug unterstützen Sie nur eine begrenzte Liste möglicher Zeit- und Entfernungseinheiten. Der Werkzeugparameter wird weiter unten in diesem Lernprogramm erläutert.

# Do special handling of cutoff units to convert them to the correct
# arcpy.nax enum
if cutoff_units in ["Hours", "Minutes"]:
    sa.timeUnits = convert_time_units_to_nax(cutoff_units)
elif cutoff_units in ["Kilometers", "Meters", "Miles", "Yards", "Feet"]:
    sa.distanceUnits = convert_distance_units_to_nax(cutoff_units)

In diesem Codeausschnitt werden zwei Funktionen definiert, um zeichenfolgenbasierte Namen von Einheiten in den richtigen Enumerationswert zu konvertieren. Es sind nicht alle möglichen Werte der Enumerationen TimeUnits und DistanceUnits enthalten, da Sie in diesem Beispiel die den Benutzern angezeigten Auswahlmöglichkeiten für Einheiten begrenzen. Die Funktionen lösen einen Fehler aus, wenn eine ungültige Einheit übergeben wird.

def convert_time_units_to_nax(time_units_str):
    """Convert string-based time units to the correct arcpy.nax enum."""
    if time_units_str == "Hours":
        return arcpy.nax.TimeUnits.Hours
    if time_units_str == "Minutes":
        return arcpy.nax.TimeUnits.Minutes
    arcpy.AddError(f"Invalid time units: {time_units_str}")
    raise CustomError


def convert_distance_units_to_nax(dist_units_str):
    """Convert string-based distance units to the correct arcpy.nax enum."""
    if dist_units_str == "Kilometers":
        return arcpy.nax.DistanceUnits.Kilometers
    if dist_units_str == "Meters":
        return arcpy.nax.DistanceUnits.Meters
    if dist_units_str == "Miles":
        return arcpy.nax.DistanceUnits.Miles
    if dist_units_str == "Yards":
        return arcpy.nax.DistanceUnits.Yards
    if dist_units_str == "Feet":
        return arcpy.nax.DistanceUnits.Feet
    arcpy.AddError(f"Invalid distance units: {dist_units_str}")
    raise CustomError

Laden der Einrichtungen für die Eingabe

Verwenden Sie als Nächstes die load-Methode, um die Einrichtungen der Benutzer zu der Einzugsgebiets-Analyse hinzuzufügen.

Weitere Informationen zu Möglichkeiten zum Festlegen von Analyse-Eingaben

In diesem Codeausschnitt werden die Einrichtungen für die Eingabe mit der load-Methode zu der Einzugsgebiets-Analyse hinzugefügt. Der Enumerationswert von ServiceAreaInputDataType.Facilities wird als Parameter der load-Methode verwendet, um anzugeben, dass die Eingaben als Einrichtungen hinzugefügt werden sollen.

# Load the input facilities
sa.load(arcpy.nax.ServiceAreaInputDataType.Facilities, input_facilities)

Berechnen der Einzugsgebiets-Analyse und Behandeln von Berechnungsfehlern

Nachdem die Einstellungen für das Einzugsgebiet konfiguriert und die Eingabedaten geladen wurden, können Sie jetzt die Analyse berechnen und das Ergebnis abrufen. Beim Berechnen der Analyse mit der Solve-Methode wird eine Instanz eines ServiceAreaResult-Objekts erstellt, das Eigenschaften und Methoden für die Arbeit mit den Ausgaben der Analyse enthält.

In diesem Codeausschnitt wird die Einzugsgebiets-Analyse mit der solve-Methode berechnet. Die Variable result kann für die Arbeit mit den Analyseausgaben verwendet werden.

# Solve the analysis
result = sa.solve()

Manchmal schlägt eine Analyse fehl, oder sie wird zwar erfolgreich ausgeführt, aber es werden Warnmeldungen zu möglichen Problemen an die Benutzer zurückgegeben. Sie möchten in Ihrem Werkzeug Solver-Fehler und -Warnungen an die Benutzer zurückgeben. Wenn die Berechnung fehlschlägt, soll die Ausführung des Werkzeugs beendet werden.

In diesem Codeausschnitt wird die ServiceAreaResult-Methode des solverMessages-Objekts verwendet, um mithilfe des MessageSeverity.Warning-Enumerationswertes Warnmeldungen zurückzugeben. Die einzelnen Warnmeldungen werden mit der AddWarning-Funktion den Warnmeldungen des Werkzeugs hinzugefügt.

# Print warning messages if there are any
for warning in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
    arcpy.AddWarning(warning[1])

In diesem Codeausschnitt überprüfen Sie mit der ServiceAreaResult-Eigenschaft des solveSucceeded-Objekts, ob die Einzugsgebiets-Analyse erfolgreich abgeschlossen wurde. Wenn dies nicht der Fall ist, werden die Fehlermeldungen mit der solverMessages-Methode abgerufen und mit der AddError-Funktion den Fehlern des Werkzeugs hinzugefügt. Zusätzlich wird ein Fehler ausgelöst, um die Ausführung des Werkzeugs zu beenden. Die Fehlerbehandlung wird weiter unten ausführlicher erläutert.

# Handle failed solves
if not result.solveSucceeded:
    arcpy.AddError("The Service Area solve failed.")
    # Print error messages and stop the tool from running further
    for error in result.solverMessages(arcpy.nax.MessageSeverity.Error):
        arcpy.AddError(error[1])
    # Stop tool run by raising an error
    raise CustomError

Schreiben der ausgegebenen Einzugsgebiets-Polygone in eine Feature-Class

Schließlich schreiben Sie mit der export-Methode die Ausgabe der Einzugsgebiets-Analyse in die vom Benutzer festgelegte Feature-Class. Außerdem zählen Sie mit der Count-method die Polygone und schreiben diese Informationen als Meldung.

Weitere Möglichkeiten zum Zugreifen auf und Arbeiten mit den Ausgaben einer Analyse

In diesem Codeausschnitt wird die Anzahl der Polygone in der Ausgabe mit der AddMessage-Funktion als Meldung geschrieben, und die Einzugsgebiets-Polygone werden in eine Feature-Class exportiert. Der ServiceAreaOutputDataType.Polygons-Enumerationswert wird anstelle eines der anderen Analyse-Ausgabetypen zum Arbeiten mit den Ausgabepolygonen verwendet.

# Add a message with the total number of polygons that were generated
# in the analysis
num_polygons = result.count(
    arcpy.nax.ServiceAreaOutputDataType.Polygons)
arcpy.AddMessage(f"Number of polygons generated: {num_polygons}.")

# Export the Service Area polygons to the output feature class
result.export(
    arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)

Behandeln von Fehlern

Bei Auftreten eines bekannten Fehlers soll die Ausführung des Werkzeugs beendet werden, und es soll eine hilfreiche Fehlermeldung erstellt werden. Dazu lösen Sie eine benutzerdefinierte Ausnahme aus und umschließen den Ausführungscode des Werkzeugs mit einem try/except-Block.

In diesem Codeausschnitt wird eine benutzerdefinierte Ausnahme definiert. Sie bewirkt keine Aktion, dient aber dazu, bei Auftreten eines bekannten Problems die Ausführung des Werkzeugs zu beenden.

class CustomError(Exception):
    pass

Der Ausführungscode des Werkzeugs wird mit einem try/except-Block umschlossen. Wenn ein benutzerdefinierter Fehler (CustomError) erkannt wird, bewirkt der Code keine Aktion, da die Fehlermeldung bereits den Fehlern des Werkzeugs hinzugefügt wurde. Wenn ein unbekannter Fehler auftritt, werden mit dem Code die Traceback-Informationen abgerufen und als Werkzeugfehler hinzugefügt, um das Debugging zu erleichtern.

try:

    [...]

except CustomError:
    # We caught a known error and already added the message. Do nothing.
    pass

except Exception:
    # An unknown error occurred. Add the traceback as an error message.
    arcpy.AddError(
        "An unknown error occurred when generating Service Areas.")
    import traceback
    arcpy.AddError(traceback.format_exc())

Die Bausteine zusammenfügen

Der folgende Codeausschnitt enthält das vollständige Python-Skript mit allen oben erläuterten Komponenten. Sie können diesen Code kopieren und in die ServiceAreaTutorialScriptTool.py-Datei einfügen.

import arcpy


class CustomError(Exception):
    pass


def convert_time_units_to_nax(time_units_str):
    """Convert string-based time units to the correct arcpy.nax enum."""
    if time_units_str == "Hours":
        return arcpy.nax.TimeUnits.Hours
    if time_units_str == "Minutes":
        return arcpy.nax.TimeUnits.Minutes
    arcpy.AddError(f"Invalid time units: {time_units_str}")
    raise CustomError


def convert_distance_units_to_nax(dist_units_str):
    """Convert string-based distance units to the correct arcpy.nax enum."""
    if dist_units_str == "Kilometers":
        return arcpy.nax.DistanceUnits.Kilometers
    if dist_units_str == "Meters":
        return arcpy.nax.DistanceUnits.Meters
    if dist_units_str == "Miles":
        return arcpy.nax.DistanceUnits.Miles
    if dist_units_str == "Yards":
        return arcpy.nax.DistanceUnits.Yards
    if dist_units_str == "Feet":
        return arcpy.nax.DistanceUnits.Feet
    arcpy.AddError(f"Invalid distance units: {dist_units_str}")
    raise CustomError


def generate_service_areas():
    """Generate Service Area polygons."""
    try:
        input_facilities = arcpy.GetParameterAsText(0)
        output_polygons = arcpy.GetParameterAsText(1)
        network = arcpy.GetParameterAsText(2)
        travel_mode = arcpy.GetParameter(3)
        cutoffs = arcpy.GetParameter(4)
        cutoff_units = arcpy.GetParameterAsText(5)
        time_of_day = arcpy.GetParameter(6)

        # Check out the Network Analyst extension license if the input network
        # is a local network dataset and not a service.
        if not network.startswith("http"):
            if arcpy.CheckExtension("network") == "Available":
                arcpy.CheckOutExtension("network")
            else:
                # Throw an error if the license cannot be checked out.
                arcpy.AddError("The Network Analyst license is unavailable.")
                raise CustomError

        # Instantiate the ServiceArea solver object
        sa = arcpy.nax.ServiceArea(network)

        # Hard-code some non-default Service Area settings that we don't want
        # the user to change
        sa.geometryAtCutoff = arcpy.nax.ServiceAreaPolygonCutoffGeometry.Disks
        sa.polygonBufferDistance = 150
        sa.polygonBufferDistanceUnits = arcpy.nax.DistanceUnits.Feet

        # Set analysis properties chosen by the user and passed in via tool
        # parameters
        sa.travelMode = travel_mode
        sa.timeOfDay = time_of_day
        sa.defaultImpedanceCutoffs = cutoffs
        # Do special handling of cutoff units to convert them to the correct
        # arcpy.nax enum
        if cutoff_units in ["Hours", "Minutes"]:
            sa.timeUnits = convert_time_units_to_nax(cutoff_units)
        elif cutoff_units in ["Kilometers", "Meters", "Miles", "Yards", "Feet"]:
            sa.distanceUnits = convert_distance_units_to_nax(cutoff_units)

        # Load the input facilities
        sa.load(arcpy.nax.ServiceAreaInputDataType.Facilities, input_facilities)

        # Solve the analysis
        result = sa.solve()

        # Print warning messages if there are any
        for warning in result.solverMessages(arcpy.nax.MessageSeverity.Warning):
            arcpy.AddWarning(warning[1])

        # Handle failed solves
        if not result.solveSucceeded:
            arcpy.AddError("The Service Area solve failed.")
            # Print error messages and stop the tool from running further
            for error in result.solverMessages(arcpy.nax.MessageSeverity.Error):
                arcpy.AddError(error[1])
            # Stop tool run by raising an error
            raise CustomError

        # Add a message with the total number of polygons that were generated
        # in the analysis
        num_polygons = result.count(
            arcpy.nax.ServiceAreaOutputDataType.Polygons)
        arcpy.AddMessage(f"Number of polygons generated: {num_polygons}.")

        # Export the Service Area polygons to the output feature class
        result.export(
            arcpy.nax.ServiceAreaOutputDataType.Polygons, output_polygons)

    except CustomError:
        # We caught a known error and already added the message. Do nothing.
        pass

    except Exception:
        # An unknown error occurred. Add the traceback as an error message.
        arcpy.AddError(
            "An unknown error occurred when generating Service Areas.")
        import traceback
        arcpy.AddError(traceback.format_exc())


if __name__ == "__main__":
    generate_service_areas()

Konfigurieren des Skriptwerkzeugs für die Ausführung der Python-Skriptdatei

Sie haben weiter oben das Skriptwerkzeug erstellt und seine Parameter definiert. Dann haben Sie ein Python-Skript geschrieben, um die Analyse auszuführen. Jetzt müssen Sie das Werkzeug für die Ausführung des Python-Skriptes konfigurieren. Wenn Sie das Werkzeug ausführen, wird der Code im Python-Skript ausgeführt. Das Python-Skript ruft die Eingaben ab, die ihm von den Parametern des Werkzeugs übergeben wurden, und führt die Analyse durch.

  1. Öffnen Sie das Dialogfeld mit den Eigenschaften des Skriptwerkzeugs, indem Sie mit der rechten Maustaste auf das Skriptwerkzeug klicken und dann auf Eigenschaften klicken.

    Das Dialogfeld Werkzeugeigenschaften wird angezeigt.

  2. Klicken Sie in der Liste der seitlichen Registerkarten auf die Registerkarte Ausführung.
  3. Klicken Sie auf die Schaltfläche Ordner Ordner, und navigieren Sie zum Speicherort Ihrer ServiceAreaTutorialScriptTool.py-Skriptdatei.

    Tipp:
    Wenn die ServiceAreaTutorialScriptTool.py-Datei im Dialogfeld zum Durchsuchen nicht angezeigt wird, klicken Sie oben neben der Adressleiste auf die Schaltfläche Aktualisieren.Schaltfläche zum Aktualisieren des Dialogfeldes zum Durchsuchen

    Der Code auf der Registerkarte Ausführung wird aktualisiert, sodass der Inhalt der Python-Skriptdatei angezeigt wird. Das Werkzeug ist jetzt für die Ausführung des Python-Skriptes konfiguriert.

Anpassen der Werkzeugvalidierung

Als Validierung wird der Prozess bezeichnet, bei dem die Werte in den Parametern eines Werkzeugs vor dessen Ausführung überprüft und aktualisiert werden. Durch die Validierung kann sichergestellt werden, dass die für Parameter eingegebenen Werte dem richtigen Typ oder Wertebereich entsprechen. Darüber hinaus können bei der Validierung Auswahllisten für Parameter aktualisiert oder auch ausgeblendet werden, oder es können Parameter abhängig vom Wert anderer Parameter verfügbar gemacht werden.

Einige Validierungsprozesse sind in bestimmte Parametertypen und -konfigurationen integriert. So haben Sie beispielsweise weiter oben den Parameter Input Facilities mit einem Feature-Typ-Filter konfiguriert, damit nur Point-Feature-Classes akzeptiert werden. Wenn Benutzer eine Eingabe für diesen Parameter auswählen, wird mit der Validierung sichergestellt, dass die Eingabe dem richtigen Typ entspricht. Wenn dies nicht der Fall ist, wird eine Fehlermeldung angezeigt.

Manchmal jedoch muss der Autor eines Skriptwerkzeugs eine erweiterte oder angepasste Validierung implementieren. Dies ist mit der ToolValidator-Klasse möglich. Diese besondere Python-Klasse kann mit benutzerdefiniertem Code aktualisiert werden, um Parameter zu aktualisieren und Überprüfungen auszuführen, die ggf. Fehler- und Warnmeldungen auslösen.

In diesem Lernprogramm programmieren Sie die ToolValidator-Klasse in Ihrem Skriptwerkzeug so, dass ein Fehler ausgelöst wird, wenn ein Wert im Parameter Cutoffs kleiner oder gleich 0 ist. Außerdem soll die Auswahlliste des Parameters Cutoff Units abhängig vom Wert im Parameter Travel Mode mit einer Liste von Zeit- oder Entfernungseinheiten aktualisiert werden.

Der ToolValidator-Code ist getrennt von dem vom Werkzeug ausgeführten Python-Skript, das Sie weiter oben geschrieben haben, und Zugriff und Bearbeitung erfolgen getrennt.

Hinweis:

Sie können auch in einer Python-Toolbox (.pyt) ein benutzerdefiniertes Geoverarbeitungswerkzeug erstellen. In diesem Fall sind der Validierungscode und der Ausführungscode des Werkzeugs im gleichen Python-Skript enthalten.

Weitere Informationen zu den Möglichkeiten für die Skriptwerkzeugvalidierung

Suchen der ToolValidator-Klasse und Öffnen der Klasse zum Bearbeiten

Wenn Sie ein Skriptwerkzeug erstellen, wird automatisch die ToolValidator-Klasse erstellt. Sie können über das Dialogfeld mit den Eigenschaften des Skriptwerkzeugs auf die Klasse zugreifen und sie zum Bearbeiten öffnen.

  1. Öffnen Sie gegebenenfalls das Dialogfeld mit den Eigenschaften des Skriptwerkzeugs, indem Sie mit der rechten Maustaste auf das Skriptwerkzeug klicken und dann auf Eigenschaften klicken.

    Das Dialogfeld Werkzeugeigenschaften wird angezeigt.

  2. Klicken Sie in der Liste der seitlichen Registerkarten auf die Registerkarte Validierung.

    Die ToolValidator-Klasse des Skriptwerkzeugs ist sichtbar. Sie können den Code direkt im Dialogfeld bearbeiten oder auf die Schaltfläche In Skript-Editor öffnen klicken, um den ToolValidator in einer separaten Datei in einer IDE oder einem Texteditor zu öffnen.

    Tipp:

    In welcher IDE bzw. in welchem Texteditor die Datei geöffnet wird, steuern Sie mit der Einstellung Skript-Editor in den Geoverarbeitungsoptionen.

Auslösen eines Fehlers, wenn der Parameterwert Cutoffs kleiner oder gleich 0 ist

Die updateMessages-Methode der ToolValidator-Klasse kann zum Überprüfen von Parameterwerten verwendet werden. Mit ihr werden Fehler- oder Warnmeldungen hinzugefügt. In diesem Abschnitt ändern Sie die updateMessages-Methode so, dass ein Fehler ausgelöst wird, wenn ein Wert im Parameter Cutoffs kleiner oder gleich 0 ist.

  1. Suchen Sie die updateMessages-Methode in der ToolValidator-Klasse.

    Die updateMessages-Methode enthält standardmäßig nur eine return-Anweisung. Mit ihr wird keine benutzerdefinierte Validierung ausgeführt.

  2. Ändern Sie die updateMessages-Methode so, dass der folgende Code verwendet wird:

    Vorsicht:
    Überprüfen Sie nach dem Einfügen des Codes in die ToolValidator-Klasse die Einrückung.

    def updateMessages(self):
        # Customize messages for the parameters.
        # This gets called after standard validation.
    
        # Raise an error if any of the cutoffs are <= 0
        cutoffs_param = self.params[4]
        if cutoffs_param.valueAsText:
            for cutoff in cutoffs_param.values:
                if cutoff <= 0:
                    cutoffs_param.setErrorMessage("Cutoffs must be positive.")
                    break
    
        return

    Mit diesem Codeausschnitt wird dem Parameter Cutoffs eine Fehlermeldung hinzugefügt, wenn einer oder mehrere seiner Werte kleiner oder gleich 0 sind.

    Der Parameter Cutoffs wird mit der Variablen self.params abgerufen, bei der es sich um eine Liste der in die ToolValidator-Klasse integrierten Werkzeugparameter handelt. Der Parameter Cutoffs ist der fünfte Parameter. Daher wird über Index 4 der Liste auf ihn zugegriffen. Der abgerufene Wert ist ein Parameter-Objekt.

    Wenn der Parameter leer ist, müssen die Werte nicht überprüft werden. Mithilfe der valueAsText-Eigenschaft des Parameter-Objekts können Sie schnell ermitteln, ob der Parameter leer ist.

    Da es sich um einen mehrwertigen Parameter handelt, wird die Liste der Werte mit der values-Eigenschaft abgerufen. Der Code durchläuft die aktuellen Werte des Parameters.

    Wenn der Grenzwert kleiner oder gleich 0 ist, wird die Parameter-Methode des setErrorMessage-Objekts verwendet, um eine Fehlermeldung festzulegen. Diese Meldung wird auf der Bedienoberfläche des Werkzeugs zusammen mit dem Parameter angezeigt.

    Wenn ein ungültiger Wert erkannt wird, wird die Iteration mit der break-Anweisung angehalten. Es ist nicht notwendig, die übrigen Werte zu überprüfen, wenn ein ungültiger Wert gefunden wurde.

    Hinweis:
    Auch wenn Sie benutzerdefinierten Validierungscode hinzufügen, wird die grundlegende interne Validierung, die mit den einzelnen Parametern verknüpft ist, ausgeführt. Da Sie zum Beispiel den Parameter Cutoffs mit dem Typ Double definiert haben, wird durch die interne Validierung automatisch überprüft, ob die Eingabe ein gültiger numerischer Wert ist, und gegebenenfalls ein Fehler ausgelöst. Jede benutzerdefinierte Validierung, die Sie für Ihren Parameter hinzufügen, wird zusätzlich zu der automatisch für diesen Parametertyp bereitgestellten internen Validierung ausgeführt.

Füllen des Parameters Cutoff Units mit einer Liste von Zeit- oder Entfernungseinheiten

Ein Reisemodus enthält verschiedene Einstellungen, mit denen gesteuert wird, wie die Reise durch ein Netzwerk modelliert wird. Er bestimmt, welche Variable bei der Suche nach der kürzesten Route durch das Netzwerk optimiert wird. In der Regel ist dies ein Messwert für Zeit oder Entfernung. Sie können jedoch auch Netzwerk-Datasets konfigurieren, um andere Variablentypen zu optimieren, beispielsweise den Energieverbrauch oder die Reisekosten.

Mit dem Parameter Cutoffs können die Benutzer numerische Werte für den Reisekostengrenzwert für das Einzugsgebiet angeben. Mit dem Parameter Cutoff Units können die Benutzer die Maßeinheit angeben, in der diese Werte interpretiert werden sollen.

Sie möchten in Ihrem Werkzeug den Benutzern eine Liste gültiger Einheiten bereitstellen. Wenn jedoch im ausgewählten Reisemodus die Zeit optimiert wird, sollen nur Zeiteinheiten angezeigt werden, und wenn im ausgewählten Reisemodus die Entfernung optimiert wird, sollen nur Entfernungseinheiten angezeigt werden. Falls ausnahmsweise im Reisemodus andere Variablen optimiert werden, sollen weder Zeit- noch Entfernungseinheiten angezeigt werden.

Die updateParameters-Methode der ToolValidator-Klasse kann zum Aktualisieren von Auswahllisten für Parameter verwendet werden. In diesem Abschnitt ändern Sie die updateParameters-Methode, um als Auswahlliste für Cutoff Units eine geeignete vom Wert des Parameters Travel Mode abhängige Einheitenliste festzulegen.

  1. Suchen Sie die updateParameters-Methode in der ToolValidator-Klasse.

    Die updateParameters-Methode enthält standardmäßig nur eine return-Anweisung. Mit ihr werden keine Parameter aktualisiert.

  2. Ändern Sie die updateParameters-Methode so, dass der folgende Code verwendet wird:

    Vorsicht:
    Überprüfen Sie nach dem Einfügen des Codes in die ToolValidator-Klasse die Einrückung.

    def updateParameters(self):
        # Modify parameter values and properties.
        # This gets called each time a parameter is modified, before
        # standard validation.
    
        # Set filter list of units in cutoff units parameter based on what type
        # of travel mode is selected
        travel_mode_param = self.params[3]
        cutoff_units_param = self.params[5]
        if travel_mode_param.valueAsText:
            try:
                tm_object = travel_mode_param.value
                if tm_object.impedance == tm_object.timeAttributeName:
                    # The impedance has units of time, so present time units as
                    # options
                    cutoff_units_param.filter.list = ["Hours", "Minutes"]
                elif tm_object.impedance == tm_object.distanceAttributeName:
                    # The impedance has units of distance, so present distance
                    # units as options
                    cutoff_units_param.filter.list = [
                        "Kilometers", "Meters", "Miles", "Yards", "Feet"]
                else:
                    # The impedance has units that are neither time nor
                    # distance, so present only one option, "Other". The
                    # Service Area cutoffs will be interpreted in the impedance
                    # units.
                    cutoff_units_param.filter.list = ["Other"]
            except Exception:
                pass
    
        return

    In diesem Codeausschnitt wird die Liste der möglichen Werte im Parameter Cutoff Units basierend auf dem aktuellen Wert des Parameters Travel Mode aktualisiert.

    Die Parameter werden mit der Variable self.params abgerufen. Der Parameter Travel Mode befindet sich an Index 3 (der vierte Parameter), und der Parameter Cutoff Units befindet sich an Index 5 (der sechste Parameter).

    Wenn der Parameter Travel Mode leer ist, muss der Parameter Cutoff Units nicht aktualisiert werden. Mithilfe der valueAsText-Eigenschaft des Parameter-Objekts können Sie schnell ermitteln, ob der Parameter leer ist.

    Der Wert des Parameters Travel Mode wird mit der value-Eigenschaft des Parameter-Objekts als TravelMode-Objekt abgerufen.

    Ob im Reisemodus Zeit, Entfernung oder eine andere Maßeinheit optimiert wird, können Sie am einfachsten ermitteln, indem Sie die TravelMode-Eigenschaft des impedance-Objekts mit den Eigenschaften timeAttributeName und distanceAttributeName vergleichen. Mit der impedance-Eigenschaft wird der Name des zu optimierenden Netzwerkattributs zurückgegeben. Reisemodi enthalten außerdem ein standardmäßiges Zeitattribut (timeAttributeName) und ein Entfernungsattribut (distanceAttributeName). Wenn impedance und timeAttributeName übereinstimmen, wird im Reisemodus die Zeit optimiert, und der Parameter Cutoff Units wird so aktualisiert, dass eine Liste mit Zeiteinheiten angezeigt wird. Wenn impedance und distanceAttributeName übereinstimmen, wird im Reisemodus die Entfernung optimiert, und der Parameter Cutoff Units wird so aktualisiert, dass eine Liste mit Entfernungseinheiten angezeigt wird. Wenn für impedance keine Übereinstimmung vorliegt, wird im Reisemodus eine andere Variable optimiert, und die Grenzwerte des Einzugsgebiets werden in diesen Einheiten interpretiert. Der Parameter Cutoff Units wird so aktualisiert, dass nur eine Auswahl angezeigt wird: Other.

    In allen Fällen wird die Auswahlliste durch Festlegen der filter.list-Eigenschaft des Parameter-Objekts für Cutoff Units angegeben.

    Der Codeblock wird mit einem try/except-Block umschlossen. Wenn beim Lesen des Reisemodus Fehler auftreten, bewirkt der Code keine Aktion, und die Auswahlliste wird nicht aktualisiert.

Überprüfen der Werkzeugvalidierung

In diesem Abschnitt speichern und testen Sie den Validierungscode.

  1. Wenn Sie die ToolValidator-Klasse in einer IDE oder einem Texteditor geöffnet haben, speichern und schließen Sie die Datei.
  2. Klicken Sie im Dialogfeld Werkzeugeigenschaften auf OK, um die Änderungen zu übernehmen.
  3. Doppelklicken Sie im Bereich Katalog auf das Werkzeug, um es zu öffnen.

    Das Skriptwerkzeug Service Area Tutorial Script Tool wird im Bereich Geoverarbeitung geöffnet.

  4. Geben Sie im Parameter Cutoffs eine Zahl kleiner oder gleich 0 ein.

    Für den Parameter Cutoffs wird ein Fehlersymbol angezeigt. Wenn Sie auf das Symbol zeigen oder klicken, wird in der QuickInfo Ihre Fehlermeldung angezeigt.

  5. Vergewissern Sie sich, dass die Auswahlliste des Parameters Cutoff Units so aktualisiert wird, dass bei Auswahl eines Wertes im Parameter Travel Mode die richtige Einheitenliste angezeigt wird.
    1. Wählen Sie für den Parameter Network einen Wert aus.

      Tipp:
      Wenn Sie die mit den bereitgestellten Lernprogrammdaten arbeiten, verwenden Sie für den Parameter Network das Netzwerk-Dataset SanFrancisco.gdb/Transportation/Streets_ND. Sie können den Katalogpfad zum Netzwerk-Dataset verwenden, oder Sie können es zuerst der Karte hinzufügen und die entsprechende Layer-Repräsentation als Eingabe für das Werkzeug verwenden.

      Wenn der Parameter Network leer ist, enthält der Parameter Travel Mode keine Auswahlliste. Wenn für den Parameter Travel Mode ein Wert eingegeben wird, wird die Auswahlliste des Parameters Travel Mode automatisch aktualisiert und enthält nun die Liste der verfügbaren Reisemodi, die mit dem Wert Network verknüpft sind.

    2. Wählen Sie für den Parameter Travel Mode einen Wert aus.

      Wenn der Parameter Travel Mode leer ist, enthält der Parameter Cutoff Units keine Auswahlliste. Wenn für den Parameter Travel Mode ein Wert eingegeben wird, wird die Auswahlliste des Parameters Cutoff Units automatisch so aktualisiert, dass eine Liste mit Zeit- oder Entfernungseinheiten (oder die einzige Option für Other) angezeigt wird.

Ausführen des Werkzeugs

Sie haben das Skriptwerkzeug erstellt und konfiguriert, den Code des Werkzeugs geschrieben und die Validierung des Werkzeugs angepasst. Das Werkzeug kann jetzt ausgeführt und wie jedes andere Geoverarbeitungswerkzeug verwendet werden. Sie können das Werkzeug nicht nur über den Bereich Geoverarbeitung ausführen, sondern es auch einem Modell hinzufügen, über ein Python-Skript aufrufen und als Web-Werkzeug freigeben.

  1. Öffnen Sie das Werkzeug gegebenenfalls, indem Sie im Bereich Katalog darauf doppelklicken.
  2. Wählen Sie gültige Optionen für die einzelnen Parameter des Werkzeugs aus.

    Stellen Sie sicher, dass sich die Punkte, die Sie für den Parameter Input Facilities verwenden, im gleichen geographischen Bereich wie das für den Parameter Network verwendete Netzwerk befinden.

    Tipp:
    Wenn Sie die bereitgestellten Lernprogrammdaten verwenden, testen Sie das Werkzeug mithilfe der Datasets in der Geodatabase SanFrancisco.gdb. Die Point-Feature-Class für Feuerwachen, SanFrancisco.gdb/Analysis/FireStations, kann für den Parameter Input Facilities verwendet werden, und das Netzwerk-Dataset, SanFrancisco.gdb/Transportation/Streets_ND, kann für den Parameter Network verwendet werden. Sie können die Katalogpfade zu den Daten verwenden, oder Sie können die Daten zuerst der Karte hinzufügen und die Layer als Eingaben für das Werkzeug verwenden. Ein guter Grenzwert für die Modellierung der Reaktionszeit von Feuerwachen ist zwei bis vier Minuten.

  3. Klicken Sie im unteren Bereich des Werkzeugs auf die Schaltfläche Ausführen.

    Das Werkzeug wird erfolgreich ausgeführt, und der Karte wird ein Polygon-Layer hinzugefügt.

    Hinweis:
    Möglicherweise werden Warnmeldungen ausgelöst.