Ein Skript überprüfen und testen
Python-Skripte können verwendet werden, um Tasks in ArcGIS Pro zu automatisieren. Sie können Skripte, die Sie erstellt haben, für andere als Python .py-Dateien freigeben. Die Verwendung eines Skripts, das von einem anderen Benutzer geschrieben wurde, erfordert jedoch einige Kenntnisse von Python, und sei es nur, um die Namen der zu verarbeitenden Datensätze zu ändern. Um ein Python-Skript in einfach zu verwendener Form freizugeben, können Sie ein Python-Skriptwerkzeug erstellen.
Mit einem Python-Skriptwerkzeug können Sie in dem Python-Skript eine benutzerfreundliche Bedienoberfläche zur Verfügung stellen, die wie die Standard-Geoverarbeitungwerkzeuge aussieht. Sie können Ihr Skriptwerkzeug so konzipieren, dass es sich wie ein Standard-Geoverarbeitungwerkzeug verhält, indem Sie Code zur Validierung von Benutzereingaben und zur Rückmeldung an den Benutzer hinzufügen. Sie können auch eine integrierte Support-Dokumentation einbinden, um die Verwendung des Werkzeugs und die Konfiguration seiner Parameter zu erläutern.
Die Erstellung von Skriptwerkzeugen erleichtert es, die Funktionalität eines Python-Skripts mit anderen Benutzern zu teilen. Python-Skripte können in eine benutzerdefinierte Toolbox-Datei (.atbx) eingebettet werden, was die Freigabe vereinfacht.
Ein Projekt öffnen und Datasets überprüfen
Zunächst laden Sie die Lernprogrammdaten herunter, öffnen ein bestehendes Projekt und überprüfen die Daten, die mit dem Werkzeug verarbeitet werden sollen.
- Laden Sie die Datei PythonTool.zip herunter, und navigieren Sie zu der Datei auf Ihrem Computer.
Hinweis:
In den meisten Webbrowsern werden heruntergeladene Dateien standardmäßig im Ordner Downloads gespeichert. - Klicken Sie mit der rechten Maustaste auf den Ordner PythonTool.zip, und extrahieren Sie den Inhalt in den Ordner C:\Tutorials\.
Hinweis:
Wenn dieser Ordner noch nicht auf Ihrem Computer verfügbar ist, können Sie ihn erstellen und die Zip-Datei entpacken. Sie können den ZIP-Ordner auch an einen anderen Speicherort extrahieren, aber die Anleitungen und das Skript verwenden den Pfad C:\Tutorials. Wenn Sie den Ordner PythonTool an einen anderen Speicherort extrahieren, müssen Sie das Skript aktualisieren, damit es auf Ihren Ordnerpfad verweist. - Starten Sie ArcGIS Pro, und melden Sie sich bei ArcGIS Online an.
Hinweis:
Wenn Sie über kein Organisationskonto verfügen, informieren Sie sich über die Optionen für den Zugriff auf die Software.
- Klicken Sie in ArcGIS Pro auf Ein anderes Projekt öffnen.
- Navigieren Sie im Fenster Projekt öffnen zu dem Ordner PythonTool, klicken Sie auf Python Tool.aprx und dann auf OK.
Das Projekt wird geöffnet.
Auf der Karte werden mehrere Feature-Classes für das Gebiet Washington, D.C. angezeigt.
- Wenn der Bereich Katalog nicht bereits sichtbar ist, klicken Sie auf dem Menüband auf der Registerkarte Anzeigen auf den Bereich "Katalog".
- Blenden Sie im Bereich Katalog den Bereich Ordner und dann PythonTool ein.
- Blenden Sie die Geodatabase DC.gdb ein.
Die Geodatabase enthält acht Feature-Classes. Einige davon sind Layer auf der Karte.
Der Ordner PythonTool enthält auch ein Shapefile namens neighborhood.shp, das sich ebenfalls auf der Karte befindet.
Angenommen, Sie arbeiten in einem städtischen Büro und erhalten regelmäßig Anfragen für Datenextrakte für bestimmte Stadtteile in der Stadt.
Um diesen Task abzuschließen, müssen Sie alle Feature-Classes in der Geodatabase zu einer Nachbarschaft zuschneiden und die zugeschnittenen Feature-Classes in einer neuen Geodatabase speichern. Diese neue Geodatabase sollte in ein ZIP-Archiv komprimiert werden, damit Sie sie einfach freigeben oder für Sicherungszwecke verwenden können.
Dies ist ein relativ üblicher Task an vielen GIS-Arbeitsplätzen.
Sie können diese Tasks in ArcGIS Pro ausführen, indem Sie das Werkzeug File-Geodatabase erstellen verwenden, um eine neue Geodatabase zu erstellen und dann das Werkzeug Ausschneiden mehrmals verwenden – jeweils einmal für jede Feature-Class. Sie könnnen dann das ZIP-Archiv im File Explorer erstellen oder ein Komprimierungsprogramm verwenden. Dieser Prozess kann mühsam und zeitaufwändig sein, vor allem wenn viele Feature-Classes zu bearbeiten sind.
Es empfiehlt sich, diesen Task zu automatisieren, da er häufig auszuführen ist.
Ein Skript zur Automatisierung dieses Tasks ist dem Projekt beigefügt. Sie werden dieses eigenständige Skript überprüfen und testen und dann ein Python-Skriptwerkzeug auf der Grundlage dieses Skripts erstellen.
Ein Python-Skript überprüfen und testen
Zunächst öffnen Sie das Skript und überprüfen seinen Inhalt.
- Navigieren Sie im File Explorer zu dem Ordner C:\Tutorials\PythonTool.
- Klicken Sie mit der rechten Maustaste auf die Python-Skriptdatei clip_zip.py, und klicken Sie auf Edit with IDLE (ArcGIS Pro).
Hinweis:
Wenn auch ArcGIS Desktop 10.x (ArcMap) installiert ist, enthält das Kontextmenü zudem die Verknüpfung Edit with IDLE. Verwenden Sie diese Verknüpfung nicht. Damit wird nicht die richtige Version von Python geöffnet.Hinweis:
Wenn Sie Windows 11 verwenden und die Option Edit with IDLE (ArcGIS Pro) nicht angezeigt wird, klicken Sie auf Weitere Optionen, und klicken Sie auf Edit with IDLE (ArcGIS Pro).Das Skript wird in IDLE, dem Standard-Editor für Python, geöffnet.
Sie überprüfen dieses Skript, um seine Funktionsweise zu verstehen und es zu testen.
Das Skript beginnt mit den Importen:
import arcpy import os import zipfile
Diese Zeilen importieren Module, die das Skript verwenden wird.
ArcPy wird benötigt, um die Geoverarbeitungswerkzeuge und zugehörige Tasks auszuführen, das os-Modul wird für die Pfadbearbeitung und das zipfile-Modul für die Erstellung eines ZIP-Archivs benötigt.
Im nächsten Teil des Skripts werden der Workspace und die Pfade für die Eingabe- und Ausgabe-Datasets eingerichtet. Ohne Kommentare sieht der Code folgendermaßen aus:
arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb" clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp" gdb = "C:/Tutorials/PythonTool/Clip.gdb" gdb_path, new_gdb = os.path.split(gdb) gdb = "C:/Tutorials/PythonTool/Clip.zip" arcpy.env.overwriteOutput = True
Der Workspace wird auf die Geodatabase DC.gdb festgelegt, die die Feature-Classes enthält, die ausgeschnitten werden müssen. Die Feature-Class neighborhood.shp wird als Clip-Features verwendet. Die Geodatabase Clip.gdb wird von dem Skript erstellt und enthält die Ausgabe aus dem Werkzeug Ausschneiden. Der vollständige Pfad der Geodatabase wird mit os.path.split() in zwei Teile geteilt: den Ordner C:\Tutorials\PythonTool und den Geodatabase-Namen Clip.gdb. Diese werden zu einem späteren Zeitpunkt als Variablen im Skript benötigt. Das ZIP-Archiv Clip.zip enthält alle Inhalte der Geodatabase Clip.gdb.
Alle Datasets befinden sich in demselben Ordner, aber dies ist für die Ausführung des Skripts nicht zwingend erforderlich. Die neue Geodatabase kann sich beispielsweise in einem separaten Ordner befinden.
Als nächster Schritt im Skript erfolgt die Erstellung der neuen Geodatabase. In einer Meldung wird bestätigt, dass die neue Geodatabase erstellt wurde.
arcpy.CreateFileGDB_management(gdb_path, new_gdb) print(f"Output geodatabase {gdb} created")
Im nächsten Abschnitt wird das Werkzeug Ausschneiden ausgeführt.
inputs = arcpy.ListFeatureClasses() for fc in inputs: fc_name = arcpy.da.Describe(fc)["baseName"] new_fc = os.path.join(gdb, fc_name) arcpy.analysis.Clip(fc, clip_fc, new_fc) print(f"Output feature class {new_fc} created")
Die ListFeatureClasses()-Funktion gibt alle Feature-Classes im Workspace zurück, der von der Geodatabase DC.gdb gebildet wird. In der jetzt folgenden for-Schleife wird der Basisname der Feature-Class abgerufen. Obwohl dies in diesem Beispiel nicht unbedingt notwendig ist, macht es das Skript stabiler, weil jede Dateierweiterung – beispielsweise .shp – entfernt wird, wenn Shapefiles Eingaben sind. Der vollständige Pfad der Ausgabe-Feature-Class wird mit os.path.join() erstellt. Dies ist erforderlich, weil die Ausgabe in der Geodatabase Clip.gdb und nicht im Workspace enthalten sein soll. Das Werkzeug Ausschneiden wird ausgeführt und in einer Meldung wird bestätigt, dass die neue Feature-Class erstellt wurde. Diese Schritte werden für jede Feature-Class in der Liste wiederholt.
Im letzten Abschnitt wird das ZIP-Archiv erstellt.
with zipfile.ZipFile(out_zip, "w") as myzip: for f in os.listdir(gdb): if not f.endswith(".lock"): file_name = os.path.join(gdb, f) arc_name = os.path.join(new_gdb, f) myzip.write(file_name, arc_name)
Mit zipfile.ZipFile() wird ein neues leeres ZIP-Archiv erstellt. Hier wird eine with-Anweisung verwendet, um die Datei zu erstellen und zu öffnen, während gleichzeitig sichergestellt wird, dass die Datei nach Abschluss der Verarbeitung geschlossen wird. Die Inhalte der Geodatabase werden mit os.listdir() festgelegt. Der Befehl generiert eine Liste aller Dateien im Geodatabase-Ordner. Alle Dateien mit der Erweiterung .lock werden übersprungen. Die übrigen Dateien werden zum ZIP-Archiv hinzugefügt. Die Variable file_name repräsentiert den vollständigen Pfad jeder Datei in der ursprünglichen Geodatabase an. Die Variable arc_name repräsentiert jede Datei, die in das ZIP-Archiv geschrieben wird. Es wird aber nur der Name der Geodatabase und der Dateiname berücksichtigt. So wird die manuelle Erstellung eines ZIP-Archivs in File Explorer nachgestellt.
Nachdem Sie das Skript überprüft haben, können Sie es nun testen.
- Betrachten Sie in IDLE die Pfade, die am Anfang des Skripts verwendet wurden.
Wenn Sie den Ordner des Lernprogramms an einen anderen Ort als C:/Tutorials/PythonTool/ kopiert haben, müssen Sie im File Explorer zu dem Pfad mit den Daten wechseln.
- Bearbeiten Sie die vier Pfade in diesem Abschnitt:
arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb" clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp" gdb = "C:/Tutorials/PythonTool/Clip.gdb" gdb_path, new_gdb = os.path.split(gdb) gdb = "C:/Tutorials/PythonTool/Clip.zip" arcpy.env.overwriteOutput = True
Hinweis:
Beachten Sie, dass die Pfade im Skript den Schrägstrich // als Pfadtrennzeichen verwenden. Wenn Sie einen Pfad aus dem File Explorer kopieren, wird das standardmäßige Windows-Pfadtrennzeichen \ verwendet. Sie müssen alle umgekehrten Schrägstriche im Skript in Schrägstriche ändern.Die vollständigen, hart codierten Pfade befinden sich nur im oberen Teil des Skripts, wo sie den Variablen zugewiesen werden. Der übrige Teil des Skripts verwendet Variablen. Die vollständigen Pfade und Dateinamen werden in den Teilen, die auf diesen oberen Abschnitt folgen, nicht wiederholt. Diese Strategie macht es einfacher zu erkennen, was möglicherweise geändert werden muss, und sie wird hilfreich sein, wenn das Skript später in diesem Lernprogramm angepasst wird, um es als Python-Skriptwerkzeug zu verwenden.
- Klicken Sie in IDLE auf File und auf Save, um die Änderungen an dem Skript zu speichern.
- Klicken Sie in IDLE auf Run und dann auf Run Module, um das Skript auszuführen.
Das Skript wird ausgeführt.
Im Fenster der IDLE-Shell wird angezeigt und das Skript gibt die Fortschrittsmeldungen aus, während die Daten verarbeitet werden.
Hinweis:
Sie erhalten Fehlermeldungen, wenn Sie die Pfade nicht korrekt angepasst haben. Wenn zum Beispiel der Workspace falsch festgelegt ist, ist die Liste mit den Eingaben leer und das Skript gibt den folgenden Fehler zurück:TypeError: ‘NoneType’ object is not iterable
Wenn der Pfad für die Geodatabase Clip.gdb nicht korrekt angegeben wurde, gibt das Skript folgenden Fehler zurück:
ERROR 000732: File GDB Location: Dataset … does not exist or is not supported
Diese Fehler verdeutlichen, wie schwierig die Freigabe von Skripten ist. Die Erstellung eines Skriptwerkzeugs ist eine gute Methode, Fehler dieser Art zu vermeiden.
Wenn das Skript korrekt ausgeführt wird, bestätigen die Meldungen, dass die Geodatabase und die ausgeschnittenen Feature-Classes erstellt wurden. Sie überprüfen dies mit ArcGIS Pro und dem File Explorer.
- Klicken Sie in ArcGIS Pro im Bereich Katalog mit der rechten Maustaste auf den Ordner PythonTool, und klicken Sie auf Aktualisieren.
- Überprüfen Sie, dass im Bereich Katalog, im Ordner PythonTool die Geodatabase Clip.gdb erstellt wurde.
- Blenden Sie die Geodatabase Clip.gdb ein.
- Klicken Sie in der Geodatabase Clip.gdb mit der rechten Maustaste auf bike_racks, und klicken Sie auf Zu aktueller Karte hinzufügen.
Der neue ausgeschnittene Layer bike_racks wird zur Karte hinzugefügt.
- Navigieren Sie im File Explorer zu dem Ordner C:\Tutorials\PythonTool.
Die Datei "Clip.zip" wird zum Ordner hinzugefügt.
Das eigenständige Skript funktioniert wie vorgesehen. Wenn Sie das Skript für andere Datasets verwenden möchten, können Sie das Skript öffnen und die Pfade ändern. Diese Vorgehensweise ist nicht sehr benutzerfreundlich für andere Benutzer, die nicht mit der Python-Skripterstellung vertraut sind. Außerdem können bei der Änderung von Pfaden im Skript leicht Fehler gemacht werden. Im nächsten Abschnitt entwickeln Sie ein Python-Skriptwerkzeug mit einer benutzerfreundlichen Bedienoberfläche.
Ein Werkzeug erstellen und Parameter hinzufügen
Der nächste Schritt besteht darin, ein Skriptwerkzeug zu erstellen und dessen Parameter zu konfigurieren. Dadurch wird die Bedienoberfläche des Werkzeugs eingerichtet.
Eine Toolbox und ein Skriptwerkzeug erstellen
Python-Skriptwerkzeuge werden in ArcGIS Pro erstellt. Sie werden in einer benutzerdefinierten Toolbox gespeichert. Sie erstellen nun eine benutzerdefinierte Toolbox in Ihrem Projekt, und fügen ihr ein Skriptwerkzeug hinzu.
- Klicken Sie in ArcGIS Pro im Bereich Katalog mit der rechten Maustaste auf den Ordner PythonTool, klicken Sie dann auf Neu und zuletzt auf Toolbox (.atbx).
Die Toolbox wird erstellt.
- Geben Sie als Toolbox-Namen Clip_and_ZIP ein, und drücken Sie die Eingabetaste.
Der Toolbox-Name lautet Clip_and_ZIP.
Hinweis:
In älteren ArcGIS Pro-Versionen wurde das Format .tbx verwendet. Ältere Toolboxen, die in diesem Format erstellt wurden, können zwar weiterhin verwendet werden, doch sollten Sie ab ArcGIS Pro 3.0 das Format .atbx zur Erstellung von Toolboxen verwenden. - Klicken Sie mit der rechten Maustaste auf die Toolbox Clip_and_ZIP, zeigen Sie auf Neu, und klicken Sie auf Skript.
Das Fenster Neues Skript wird angezeigt.
In diesem Fenster können Sie die allgemeinen Eigenschaften des Werkzeugs festlegen, die Werkzeugparameter konfigurieren, den Ausführungscode eingeben und den Validierungscode hinzufügen. Im weiteren Verlauf dieses Lernprogramms führen Sie alle diese Schritte aus.
Vorerst geben Sie den Namen, die Beschriftung und die Beschreibung für das Skriptwerkzeug an.
- Geben Sie im Feld Name den Namen ClipandZIP ein.
Bei dem Werkzeugnamen handelt es sich um den internen, eindeutig identifizierenden Namen, der vom Werkzeug verwendet wird. Der Name darf nur Buchstaben und Zahlen enthalten. Leerzeichen und Sonderzeichen sind nicht zulässig.
- Geben Sie Clip and ZIP in das Feld Beschriftung ein.
Bei der Werkzeugbeschriftung handelt es sich um den normal lesbaren Werkzeugnamen, der für das Werkzeug in der Toolbox und im Werkzeug-Dialogfeld angezeigt wird. Die Beschriftung darf Leerzeichen und Sonderzeichen enthalten.
Bei dem nächsten Feld, Toolbox, handelt es sich um den Speicherort des Skriptwerkzeugs. Die angezeigten Werte für den Pfad und Namen der Toolbox richten sich nach dem Speicherort der .atbx-Datei und können nicht im Fenster geändert werden. Beachten Sie, dass das Skriptwerkzeug keine separate Datei ist, sondern Teil der .atbx-Datei.
- Geben Sie in das Feld Beschreibung die folgende Beschreibung ein: This script tool allows you to select multiple feature layers or feature classes and clip them using one or more polygon features. The results are stored in a new geodatabase and a ZIP archive of this new geodatabase is created for easy sharing or backup.
- Klicken Sie auf OK.
Das Skriptwerkzeug wird mit den angegebenen allgemeinen Eigenschaften erstellt.
- Doppelklicken Sie im Bereich Katalog in der Toolbox Clip_and_ZIP auf das Werkzeug Clip and ZIP.
Das Skriptwerkzeug wird im Bereich Geoverarbeitung geöffnet. Es weist in Ansätzen die Struktur eines Geoverarbeitungswerkzeugs auf, ist aber noch weitgehend leer.
- Schließen Sie das Werkzeug.
Der nächste Schritt besteht in der Konfiguration der Werkzeugparameter.
Die Werkzeugeigenschaften untersuchen
Die sorgfältige Konfiguration der Werkzeugparameter ist ein wichtiger Teil der Erstellung eines Python-Skriptwerkzeugs. Die Werkzeugparameter definieren die Bedienoberfläche des Werkzeugs, in die der Benutzer des Werkzeugs die Daten und andere Werte eingeben kann, welche dann vom Skript verarbeitet werden.
- Klicken Sie mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie dann auf Eigenschaften.
Das Fenster Werkzeugeigenschaften: Clip and ZIP wird geöffnet. Auf der Registerkarte Allgemein finden Sie Ihre zuvor gemachten Einträge.
- Klicken Sie auf die Registerkarte Parameter.
Hier konfigurieren Sie die Werkzeugparameter. Die Werkzeugparameter sind in einer Tabelle organisiert, wobei die Zeilen jeweils einen Parameter und die Spalten die Eigenschaften der einzelnen Parameter darstellen.
Anhand dieser Tabelle erstellen Sie die folgenden Parameter:
- Input feature layers: Hier kann ein Benutzer beliebige Feature-Layer der aktiven Karte auswählen oder zu beliebigen Feature-Classes auf der Festplatte navigieren.
- Clip Polygons: Ein Benutzer kann einen Polygon-Feature-Layer auswählen, zu einer Polygon-Feature-Class auf der Festplatte navigieren oder ein aus Polygonen bestehendes Feature-Set in der aktiven Karte erstellen.
- Output geodatabase: Ein Benutzer kann den Pfad und den Dateinamen einer neuen Geodatabase zum Speichern der Ergebnisse angeben
- Output ZIP archive: Ein Benutzer kann den Pfad und den Dateinamen des ZIP-Archivs angeben, das mit dem Inhalt der Geodatabase erstellt werden soll.
Den Parameter "Input feature layer" hinzufügen
Zuerst fügen Sie den Parameter "Input feature layer" hinzu.
- Geben Sie in der Spalte Beschriftung den Text Input feature layers ein, und drücken Sie die Eingabetaste.
Die Parameterbeschriftung ist die für den Menschen lesbare Beschriftung des Parameters, die im Werkzeugbereich angezeigt wird.
Der Parametername wird automatisch auf Basis der Beschriftung ausgefüllt, wobei Leerzeichen durch Unterstriche ersetzt werden. Der Parametername wird intern vom Skriptwerkzeug verwendet und kann bei der Einstellung der Werkzeugparameter in einem Python-Skript verwendet werden.
- Klicken Sie in der Spalte Datentyp auf die Schaltfläche Datentyp ändern.
Das Fenster Datentyp des Parameters wird geöffnet.
Der Standardwert lautet Zeichenfolge, aber Sie ändern ihn in Feature-Layer.
- Klicken Sie auf die Dropdown-Listet mit den Datentypen, scrollen Sie zum Abschnitt F der Liste, und klicken Sie auf Feature-Layer.
Die Festlegung des Datentyps auf Feature-Layer ermöglicht es dem Benutzer, Feature-Layer in der aktiven Karte über eine Dropdown-Liste im Werkzeug auszuwählen oder zu Feature-Classes auf der Festplatte zu navigieren.
Das Werkzeug soll mehrere Eingabe-Feature-Layer akzeptieren.
- Aktivieren Sie die Option Mehrere Werte.
Wenn die Option Mehrere Werte aktiviert ist, können Benutzer eine oder mehrere Eingaben für diesen Parameter des Werkzeugs auswählen. Dies kann eine Kombination aus Feature-Layern und Feature-Classes sein.
- Klicken Sie auf OK, um das Fenster Datentyp des Parameters zu schließen.
- Übernehmen Sie für Typ den StandardwertErforderlich.
Wird ein Parameter als Erforderlich festgelegt, kann das Werkzeug nicht ausgeführt werden, ohne dass dieser Parameter festgelegt wurde.
- Übernehmen Sie für Richtung den Standardwert Eingabe.
Wenn Sie die Richtung des Parameters auf Eingabe festlegen, bedeutet dies, dass es sich um einen der Eingabe-Layer oder Eingabewerte handelt, die das Werkerzeug verarbeiten wird. Darüber hinaus ermöglicht diese Einstellung, dass das Werkzeug in ModelBuilder verwendet werden kann, wo Feature-Layer als Eingaben mit dem Werkzeug verbunden werden können.
Damit ist die Erstellung des ersten Parameters abgeschlossen. Sie können sofort überprüfen, wie das Skriptwerkzeug mit diesem ersten Parameter aussieht.
- Klicken Sie im Fenster Werkzeugeigenschaften: Clip and ZIP auf OK.
- Doppelklicken Sie im Bereich Katalog in der Toolbox Clip_and_ZIP auf das Werkzeug Clip and ZIP.
Das Skriptwerkzeug wird im Bereich Geoverarbeitung geöffnet. Der erste Parameter wird jetzt angezeigt. Es gibt eine Dropdown-Liste zur Auswahl von Feature-Layern aus der aktiven Karte und eine Schaltfläche "Durchsuchen", mit der Benutzer zu Feature-Classes auf der Festplatte navigieren können. Das rote Sternchen vor der Parameterbeschriftung zeigt an, dass es sich um einen erforderlichen Parameter handelt.
An dieser Stelle konfigurieren Sie die Werkzeugparameter und sehen sich die Bedienoberfläche des Werkzeugs an, um zu prüfen, ob die Parameter korrekt angezeigt werden. Sie können noch nicht testen, ob das Werkzeug korrekt ausgeführt wird und funktioniert, da der Python-Code noch nicht hinzugefügt wurde.
Hinweis:
Wenn Sie mindestens einen Eingabe-Feature-Layer auswählen und das Werkzeug ausführen, erhalten Sie eine Fehlermeldung. - Schließen Sie das Werkzeug.
Den Parameter "Clip Polygons" hinzufügen
Als Nächstes konfigurieren Sie den Parameter für die Clip-Polygone.
- Klicken Sie mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie dann auf Eigenschaften.
- Klicken Sie auf der Registerkarte Parameter in die zweite Zeile der Tabelle, klicken Sie in die Spalte Beschriftung, geben Sie Clip Polygons ein, und drücken Sie die Eingabetaste.
Der Name des Parameters wird aktualisiert und lautet Clip_Polygons.
- Klicken Sie in der Spalte Datentyp auf die Schaltfläche Datentyp ändern.
- Klicken Sie für Datentyp auf die Dropdown-Liste und dann auf Feature-Set.
Ein Feature-Set ist die weniger komplexe Variante einer Feature-Class. Im Kontext eines Geoverarbeitungswerkzeugs ermöglicht ein Feature-Set interaktive Eingaben in das Werkzeug. Ein Benutzer kann Features erstellen, indem er auf der Karte zeichnet. Diese Vorgehensweise ist vergleichbar mit dem Erstellen von Features während der Bearbeitung indem Sie den BereichFeatures erstellen verwenden. Der Benutzer kann auch Feature-Layer aus der aktiven Karte auswählen oder zu Feature-Classes auf der Festplatte navigieren.
- Klicken Sie auf OK, um das Fenster Datentyp des Parameters zu schließen.
- Übernehmen Sie für Typ den StandardwertErforderlich.
- Übernehmen Sie für Richtung den Standardwert Eingabe.
Als Nächstes richten Sie einen Filter für den Werkzeugparameter Clip Polygons ein, der nur Polygon-Features als Eingabe akzeptiert.
- Scrollen Sie nach rechts und klicken Sie in die Spalte Filter.
- Klicken Sie auf die Dropdown-Liste Filter, und wählen Sie Feature-Typ aus.
Das Fenster Feature-Typ-Filter wird angezeigt.
- Aktivieren Sie die Option Polygon.
Wenn nun jemand das Werkzeug ausführt, können nur Polygone für die Eingabe der Geometrie zum Ausschneiden verwendet werden.
-
Klicken Sie im Fenster Feature-Typ-Filter auf OK.
Sie haben den Parameter Clip Polygons konfiguriert.
Den Parameter "Output geodatabase" hinzufügen
Als Nächstes konfigurieren Sie den Parameter für die Ausgabe-Geodatabase.
- Klicken Sie auf der Registerkarte Parameter in die dritte Zeile der Tabelle, klicken Sie in die Spalte Beschriftung, geben Sie Output geodatabase ein, und drücken Sie die Eingabetaste.
- Klicken Sie in der Spalte Datentyp auf die Schaltfläche Datentyp ändern.
- Klicken Sie für Datentyp auf die Dropdown-Liste, klicken Sie auf Workspace und dann auf OK.
- Übernehmen Sie für Typ den StandardwertErforderlich.
- Klicken Sie in die Spalte Richtung und in die Dropdown-Liste, und wählen Sie Ausgabe aus.
Wenn die Option Richtung auf Ausgabe festgelegt wird, handelt es sich hier um eine der Ausgaben, die das Werkzeug generiert. Darüber hinaus ermöglicht diese Einstellung, dass das Werkzeug in ModelBuilder verwendet werden kann, wo Ausgabeelemente für das Werkzeug generiert werden.
- Klicken Sie in die Spalte für Filter.
- Klicken Sie auf die Dropdown-Liste Filter, und wählen Sie Workspace aus.
- Aktivieren Sie im Fenster Workspace-Filter die Option Lokale Datenbank.
Wenn Sie den Filter auf Lokale Datenbank festlegen, kann ein Benutzer nur eine Datei-Geodatabase als Ausgabe angeben. Die Angabe einer Enterprise-Geodatabase oder eines Ordners ist in diesem Fall nicht möglich.
- Klicken Sie auf OK.
Sie haben den Parameter Output geodatabase konfiguriert.
Den Parameter "Output ZIP archive" hinzufügen
Als Nächstes konfigurieren Sie den Parameter für das Ausgabe-ZIP-Archiv.
- Klicken Sie auf der Registerkarte Parameter in die vierte Zeile der Tabelle, klicken Sie in die Spalte Beschriftung, geben Sie Output ZIP archive ein, und drücken Sie die Eingabetaste.
- Klicken Sie in der Spalte Datentyp auf die Schaltfläche Datentyp ändern.
- Klicken Sie für Datentyp auf die Dropdown-Liste, klicken Sie auf Datei und dann auf OK.
Bei einem ZIP-Archiv handelt es sich um eine Datei, dies ist deshalb er korrekte Datentyp.
- Klicken Sie in die Spalte Richtung und in die Dropdown-Liste, und wählen Sie Ausgabe aus.
- Klicken Sie auf die Dropdown-Liste Filter, und wählen Sie Datei aus.
- Geben Sie im Fenster Dateifilter im Feld Erweiterungen zip ein.
Die Dateierweiterung sollte nur aus den Buchstaben der Erweiterung bestehen, ohne den Punkt als Trennzeichen für die Dateierweiterung. Geben Sie nicht .zip ein.
Die Groß-/Kleinschreibung wird für Dateierweiterungen nicht beachtet.
- Klicken Sie auf OK.
Sie haben alle Parameter für das Werkzeug hinzugefügt.
- Klicken Sie im Fenster Werkzeugeigenschaften: Clip and ZIP auf OK.
Als Nächstes testen Sie die konfigurierten Parameter.
Die Parameter testen
Sobald Sie alle Werkzeugparameter erstellt haben, können Sie den Werkzeug-Bereich testen, um sicherzustellen, dass die Einstellungen für jeden Parameter wie vorgesehen funktionieren.
- Doppelklicken Sie im Bereich Katalog in der Toolbox Clip_and_ZIP auf das Werkzeug Clip and ZIP.
Das Werkzeug Clip and ZIP wird geöffnet. Alle Parameter, die Sie in den vorherigen Schritten konfiguriert haben, erscheinen nun im Bereich des Werkzeugs.
- Klicken Sie im Werkzeug Clip and ZIP auf die Dropdown-Liste Input feature layers, und klicken Sie auf bike_racks.
Unter dem Feld für bike_racks wird ein weiteres Feld Input feature layers angezeigt, weil dieser Werkzeugparameter mehrere Werte zulässt.
- Klicken Sie auf die Schaltfläche "Durchsuchen" neben dem Feld Input feature layers, blenden Sie die Geodatabase DC.gdb ein, klicken Sie auf bike_routes und dann auf OK.
Die Feature-Class "bike_routes" befand sich nicht auf der Karte, aber Sie haben Sie dem Werkzeug Clip_and_ZIP hinzugefügt.
Dies bestätigt, dass ein Benutzer mehrere Eingaben auswählen kann, einschließlich Feature-Layer der aktiven Karte und Feature-Classes auf der Festplatte.
- Klicken Sie auf das Skizzenwerkzeug Clip-Polygone.
Die Feature-Set-Eingabe für das Skizzenwerkzeug ist auf Polygon-Features beschränkt.
Dadurch wird verhindert, dass jemand versucht, mit Punkt- oder Linien-Features zu auszuschneiden, was einen Fehler verursachen würde.
Nun testen Sie die Ausgaben.
- Geben Sie im Feld Output geodatabase den Pfad C:\Tutorials\PythonTool\Clip ein, und klicken Sie dann in das Textfeld Output ZIP archive.
Durch die Eingabe einer Pfadangabe zu einem Ordner wird ein Fehlersymbol im Parameter Output geodatabase angezeigt.
- Zeigen Sie auf das Fehlersymbol.
Es wird eine Fehlermeldung angezeigt, die besagt, dass an dem von Ihnen angegebenen Ort keine Geodatabase vorhanden ist oder dass es sich um den falschen Workspace-Typ handelt.
Wenn Sie darüber hinaus die falsche Dateierweiterung eingeben, z. B. .fdb, wird diese automatisch in .gdb geändert.
Eine ähnliche Überprüfung wird für den letzten Parameter durchgeführt.
- Geben Sie im Feld Output ZIP archive den Pfad C:\Tutorials\PythonTool\Clip ein, und klicken Sie dann in das Textfeld Output geodatabase.
Das Werkzeug fügt die Dateierweiterung .zip zu Clip hinzu.
- Geben Sie im Feld Output ZIP archive den Pfad C:\Tutorials\PythonTool\Clip.zipped ein, und klicken Sie dann in das Feld Output geodatabase.
Wenn Sie einen Pfad mit einer falschen Dateierweiterung eingeben, wird ein Fehlersymbol im Parameter Output ZIP archive angezeigt.
- Zeigen Sie auf das Fehlersymbol.
Wenn Sie auf das Symbol zeigen, wird eine Fehlermeldung angezeigt, die darauf hinweist, dass dies der falsche Dateityp ist.
- Schließen Sie das Werkzeug.
Ihre Tests zeigen, dass die von Ihnen konfigurierten Filter sowie die anderen Parametereinstellungen funktionieren. Sorgfalt beim Entwurf der Parameter führt zu einem stabileren Werkzeug, da verhindert wird, dass Benutzer das Werkzeug mit ungültigen Werten ausführen.
Sie haben die Parameter getestet, aber das Werkzeug ist noch nicht einsatzbereit, da der Code noch nicht hinzugefügt wurde. Das werden wir gleich anschließend tun.
Den Ausführungscode bearbeiten
Der Ausführungscode eines Python-Skriptwerkzeugs besteht aus dem Python-Code, der ausgeführt wird, wenn ein Benutzer im Bereich Geoverarbeitung auf Ausführen klickt. Sie verwenden das eigenständige Skript, das Sie zuvor überprüft haben, müssen aber einige Änderungen vornehmen, damit das Skript die von einem Benutzer im Bereich "Werkzeug" eingegebenen Parameter verarbeiten kann.
- Klicken Sie mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie dann auf Eigenschaften.
- Klicken Sie auf die Registerkarte Ausführung.
Die Registerkarte zeigt eine Python-Code-Vorlage für ein Skriptwerkzeug an.
Der Code beginnt mit einem mehrzeiligen Kommentar als Platzhalter für die Dokumentation des Skripts. In Python markieren drei Anführungszeichen den Beginn eines mehrzeiligen Kommentars und drei Fragezeichen markieren das Ende eines Kommentars. Text, den Sie innerhalb des Kommentars platzieren, wird nicht von Python ausgeführt.
Nach dem Kommentar lautet die erste Codezeile import arcpy. Die meisten Skripte in Geoverarbeitungswerkzeugen verwenden ArcPy. Deshalb ist dieses Paket in der Vorlage enthalten.
Jetzt wird eine Funktion definiert, die script_tool() benannt wird. Eine Funktion wird mit dem Schlüsselwort def erstellt, auf das der Name und die Argumente der Funktion folgen. Sie ändern den Namen der Vorlagenfunktion so, dass er auf Ihr Werkzeug abgestimmt ist.
Die Vorlagenfunktion gibt zwei Parameter an, aber Ihr Werkzeug benötigt mehr Parameter; auch diese Erfordernis werden Sie berücksichtigen.
Der Ausführungscode für das Skriptwerkzeug wird in diese Funktion eingefügt.
Am Ende des Vorlagenblocks der Funktion steht eine return-Anweisung. Dadurch wird die Funktion beendet und es werden die Ergebnisse zurückgegeben.
Der letzte Abschnitt des Codes beginnt mit if __name__ == '__main__':. Dies ist eine Bedingungsanweisung, und der folgende eingerückte Code-Block wird nur ausgeführt, wenn die Bedingungsauswertung True ergibt. Die Variable __name__, mit zwei Unterstrichen auf jeder Seite, weist für jedes Skript den Wert '__main__' auf.
Wenn Sie den Code als Skript ausführen, was der Fall ist, wenn Sie ein Skriptwerkzeug ausführen, wird der eingerückte Code-Block ausgeführt. Bei einem importierten Modul wird die Variable jedoch auf den Namen des Moduls gesetzt. In diesem Fall wird der eingerückte Code-Block nicht ausgeführt. Diese Codestruktur macht es möglich, zwischen der Ausführung des Codes als Skript und dem Import in ein anderes Skript als Modul zu unterscheiden. Dieses Szenario ist hier nicht gegeben. Für die Erstellung des Skriptwerkzeugs reicht es aus zu wissen, dass der eingerückte Code-Block ausgeführt wird, wenn das Skriptwerkzeug ausgeführt wird. Der Code-Block erhält über die ArcPy-Funktion GetParameterAsText() Parameter und anschließend wird die Funktion ScriptTool() mit den Parametern aufgerufen.
Die Vorlage verwendet zwei Parameter, die "param0" und "param1" benannt sind. Dies sind temporäre Platzhalter; Sie werden die Parameter so bearbeiten, dass sie auf Ihr Skript abgestimmt sind.
Hinweis:
In den nächsten Schritten beginnen Sie damit, den Ausführungscode zu ändern. Es ist wichtig zu verstehen, wo der Code gespeichert ist. Standardmäßig ist der Python-Code eingebettet. Das bedeutet, er ist ein Bestandteil der Toolbox-Datei .atbx und wird nicht separat gespeichert. Sie können den Code jedoch zur leichteren Bearbeitung in eine .py-Datei exportieren und ihn später einbetten. Sie werden diesen Workflow praktizieren, wenn Sie den Code schrittweise ändern.Als Nächstes ändern Sie den Namen der Funktion, script_tool() in einen aussagekräftigeren Namen. Zu Beginn bearbeiten Sie den eingebetteten Code direkt im Dialogfeld für die Werkzeugeigenschaften.
- Bearbeiten Sie auf der Registerkarte Ausführung im Code-Feld die Zeile def script_tool(param0, param1): so, dass sie def ClipZip(param0, param1): lautet.
Nehmen Sie die Änderung hier vor:
Das sollte wie folgt aussehen:
Wenn Sie den Code im Dialogfeld der Werkzeugeigenschaften ändern, werden die geänderten Codezeilen mit einer gelben Markierung versehen.
- Bearbeiten Sie im Code-Feld die Zeile script_tool(param0, param1) so, dass sie ClipZip(param0, param1) lautet.
Jetzt haben Sie den Funktionsnamen an beiden Stellen, an denen er in der Vorlage des Skriptwerkzeugs erscheint, aktualisiert.
Während die Bearbeitung von Code auf diese Weise bequem und schnell ist, bietet das Code-Feld im Vergleich zu einem typischen Python-Editor jedoch nur begrenzte Funktionalität. Als Nächstes lernen Sie zwei Ansätze zur Bearbeitung des Ausführungscodes in einem Python-Editor kennen.
- Klicken Sie auf der Registerkarte Ausführung im Code-Feld auf OK.
Änderungen am eingebetteten Code werden automatisch gespeichert und die gelben Markierungen werden entfernt, wenn Sie das Dialogfeld für die Werkzeugeigenschaften schließen.
- Klicken Sie mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie dann auf Eigenschaften.
- Klicken Sie unten im Code-Feld auf die Schaltfläche In Skript-Editor öffnen.
Im standardmäßigen Python-Editor wird eine temporäre Skriptdatei geöffnet. Wenn Sie keinen anderen Editor konfiguriert haben, wird das Skript in IDLE geöffnet.
Die Änderungen, die Sie im Skriptfeld vorgenommen haben, sind im Skript enthalten.
Hinweis:
Sie können den Python-Editor auf der Registerkarte Projekt konfigurieren. Klicken Sie auf die Registerkarte Projekt, klicken Sie auf Optionen und dann im linken Bereich auf Geoverarbeitung. Die Option Skript-Editor ist standardmäßig leer, d. h. IDLE wird verwendet. Sie können zu Ihrem bevorzugten Editor wechseln, indem Sie den Pfad angeben. Für die Zwecke dieses Lernprogramms ist IDLE jedoch ausreichend.Der Pfad lautet in etwa C:\Users\UserName\AppData\Local\Temp\1\ArcGISProTemp19512\.
Der Dateiname besteht aus den Buchstaben tmp gefolgt von einem alphanumerischen Code und der Dateierweiterung .py. Wenn Sie Änderungen an dem Code vornehmen und die Datei .py speichern, werden diese Änderungen dem Block hinzugefügt, in dem der Ausführungscode enthalten ist. Sie werden diesen Workflow durchführen.
- Fügen Sie in IDLE eine neue Codezeile unter import arcpy ein, und fügen Sie folgenden Code hinzu:
import os import zipfile
Diese beiden Module werden im ursprünglichen eigenständigen Skript verwendet. Sie können den Code aus dem Skript kopieren und einfügen oder ihn eingeben.
- Klicken Sie in IDLE auf File und dann auf Save.
- Schließen Sie IDLE.
Der Code, den Sie in IDLE hinzugefügt haben, befindet sich nun im Code-Feld.
Als Nächstes bearbeiten Sie die Parameter für das Skript in einer eigenständigen Skriptdatei.
Das Skript in einer separaten Datei speichern
Der Code, mit dem Sie bisher gearbeitet haben, war in die Toolbox eingebettet. Sie können den Code auch in eine .py-Datei exportieren, um ihn in Ihrem bevorzugten Python-Editor zu bearbeiten.
- Klicken Sie auf der Registerkarte Ausführung über dem Skriptfeld auf den grünen Pfeil der Schaltfläche Skript in Datei exportieren.
- Überprüfen Sie im Fenster Skript exportieren dass der Ordner PythonTool als Speicherort angegeben wurde und geben Sie für Name clip_zip_tool.py ein.
Das ursprüngliche Skript mit dem Großteil des Codes, den Sie übertragen und aktualisieren müssen, heißt clip_zip.py. Achten Sie also darauf, einen anderen Namen zu verwenden, damit Sie die Originaldatei nicht überschreiben.
- Klicken Sie auf Speichern.
Nachdem Sie den Code aus dem Skriptfeld in eine externe Python-Skriptdatei exportiert haben, ist der Code nicht mehr in der Toolbox gespeichert.
Im oberen Teil des Feldes wird der Pfad zur Skriptdatei angezeigt.
Der Vorteil einer separaten .py-Datei besteht darin, dass Sie nun leichter mit dem Code in Ihrem bevorzugten Editor arbeiten können. In diesem Lernprogramm werden Sie aber weiter mit IDLE arbeiten.
Der im Fenster mit den Werkzeugeigenschaften angezeigte Code ist nicht mehr der eingebettete Code, sondern der Code in der .py-Datei. Sie können den Code jedoch weiterhin direkt im Fenster mit den Werkzeugeigenschaften bearbeiten, und die .py-Datei wird automatisch gespeichert, wenn Sie das Fenster mit den Werkzeugeigenschaften schließen.
Im weiteren Verlauf dieses Lernprogramms werden Sie die .py-Datei fast immer in IDLE öffnen, anstatt sie im Fenster mit den Werkzeugeigenschaften zu bearbeiten.
- Klicken Sie unten im Code-Feld auf die Schaltfläche In Skript-Editor öffnen.
Die .py-Datei wird in IDLE geöffnet.
Der Dateiname und der Pfad sind nicht mehr temporär.
Hinweis:
Der Code der .py-Skriptdatei kann im Code-Feld auf der Registerkarte Ausführung und in IDLE gleichzeitig bearbeitet werden. Dies ist jedoch nicht die empfohlene Vorgehensweise. Sie erhalten eine Warnmeldung und müssen entscheiden, welche Änderungen Sie beibehalten wollen. Um dies zu vermeiden, bearbeiten Sie Ihr Skript jeweils nur in einer Anwendung.Nachdem Sie den Code in eine .py-Datei exportiert haben, schließen Sie das Fenster.
- Klicken Sie im Fenster Eigenschaften auf OK.
Als Nächstes ändern Sie den Code, um ihn an die Parameter des Skriptwerkzeugs anzupassen.
- Ersetzen Sie in IDLE nach der Zeile if __name__ == "__main__": die beiden mit param0 und param1 beginnenden Parameterzeilen durch den folgenden Code:
inputs = arcpy.GetParameter(0) clip_fc = arcpy.GetParameterAsText(1) gdb = arcpy.GetParameterAsText(2) out_zip = arcpy.GetParameterAsText(3)
Der aktualisierte Code sollte wie folgt aussehen:
Hinweis:
Es ist wichtig, dass die Einrückung der neuen Zeilen mit der ursprünglichen Ebene der Einrückung von vier Leerzeichen übereinstimmt.Sie legen vier Parameter für das Skriptwerkzeug fest. Auf diese Weise erhält das Python-Skript diese vier Parameter.
Die Parameter können mit den ArcPy-Funktionen GetParameter() und GetParameterAsText() aus dem Skriptwerkzeug abgerufen werden. Die Bedienoberfläche gibt die Parameter als PythonTupel – ein Sequenzdatentyp, der eine nullbasierte Indizierung verwendet –an das Skript weiter. Der erste Parameter hat einen Index von 0, der zweite Parameter einen Index von 1 usw. Diese Indexwerte werden durch die Zahlen in Klammern am Ende jeder der neuen Zeilen referenziert. Wenn die Reihenfolge dieser Zahlen nicht mit der Reihenfolge der Parameter in der Bedienoberfläche des Werkzeugs übereinstimmt, erhält das Skript die falschen Datenwerte.
Hinweis:
Ab ArcGIS Pro 3.2 können Sie Parameter auch mit ihrem Namen referenzieren. Anstatt "arcpy.GetParameter(0)" zu verwenden, können Sie beispielsweise "arcpy.GetParameter("Input_feature_layers")" verwenden. Auf diese Weise können die Parameter in beliebiger Reihenfolge eingegeben werden, ohne dass Sie den Index der einzelnen Parameter kennen müssen.Der erste Parameter besteht aus einer Python-Liste, die mehrere Namen für Feature-Classes enthalten kann. Die Funktion GetParameter() hält dieses Format bei, so dass diese Funktion für den ersten Parameter verwendet wird. Die anderen Parameter werden mit GetParameterAsText() als Text empfangen.
Jeder Parameterwert wird einer Variablen zugewiesen. Die Variablen werden an die ClipZip-Funktion übergeben. Die Variablennamen wurden so gewählt, dass sie mit dem Code im vorhandenen eigenständigen Skript übereinstimmen.
- Bearbeiten Sie die Zeile ClipZip(param0, param1), um param0, param1 durch die Variablen zu ersetzen, die folgende Parameterwerte enthalten:
ClipZip(inputs, clip_fc, gdb, out_zip)
Die Änderung sollte in etwa so aussehen:
Diese Zeile ruft mit diesen Parametern die Funktion ClipZip() auf.
- Löschen Sie die Zeile arcpy.SetParameterAsText(2, "Result").
Dieses Skriptwerkzeug verwendet diese Zeile aus der Vorlage nicht.
Als Nächstes aktualisieren Sie die Definition der Funktion ClipZip().
- Bearbeiten Sie die Zeile def ClipZip(param0, param1):, um param0, param1 durch die Variablen zu ersetzen, die folgende Parameterwerte enthalten:
def ClipZip(inputs, clip_fc, gdb, out_zip):
Die Änderung sollte in etwa so aussehen:
Damit wird die ClipZip()-Funktion so definiert, dass sie die vier Parameter akzeptiert.
Die Variablen in der Funktionsdefinition müssen nicht dieselben Namen wie auf der Registerkarte "Parameter" verwenden, solange die Reihenfolge der Variablen dieselbe ist. Die Variablennamen in der Funktionsdefinitionszeile müssen mit den Variablen in dem Code-Block übereinstimmen, der die Funktion definiert (der noch hinzugefügt werden muss).
- Klicken Sie in IDLE auf File und dann auf Save.
Die Änderungen, die Sie in IDLE vorgenommen haben, werden in der Skriptdatei gespeichert.
Das Skript sieht in etwa wie folgt aus:
Als Nächstes fügen Sie Code aus dem ursprünglichen Skript zum Code-Block hinzu.
Code aus dem ursprünglichen Skript kopieren
Das ursprüngliche Skript enthält den Code, den Sie in den Code-Block für Ihr Skriptwerkzeug einfügen werden.
- Klicken Sie in IDLE auf File und dann auf Open.
- Klicken Sie im Ordner C:\Tutorials\PythonTool auf clip_zip.py und dann auf Open.
- Klicken Sie in IDLE im Skript clip_zip.py an den Anfang der Zeile # Workspace and datasets, und klicken und ziehen Sie bis zum Ende des Skripts, um den gesamten Code bis auf die import-Zeilen auszuwählen.
- Klicken Sie mit der rechten Maustaste auf den ausgewählten Code, und klicken Sie auf Copy.
- Wechseln Sie in IDLE in das Fenster clip_zip_tool.py.
- Wählen Sie den Kommentar """Script code goes below""" aus.
- Klicken Sie mit der rechten Maustaste auf den ausgewählten Code, und klicken Sie dann auf Paste.
Der Code wird in den Code-Block der Funktion ClipZip eingefügt.
Sie haben die Bearbeitung des ursprünglichen Skripts abgeschlossen. Sie können jetzt das Fenster schließen und sich auf den Code in der Datei clip_zip_tool.py konzentrieren.
- Schließen Sie in IDLE, das Skriptfenster clip_zip.py.
Der gesamte Code-Block, den Sie in das Skript clip_zip_tool.py kopiert haben, muss um vier Leerzeichen eingerückt werden, um Teil der Funktion zu sein.
Sie können diese Einrückung manuell vornehmen, indem Sie vor jeder Zeile vier Leerzeichen eingeben, aber Sie können auch die Zeilen auswählen, die Sie einrücken möchten, und sie alle auf einmal einrücken.
In diesem Fall ist es empfehlenswert, alle Einrückungen auf einmal vorzunehmen, da eingerückte Leerzeichen in Python entscheidend sind. Wenn Sie versehentlich drei oder fünf Leerzeichen in eine Zeile einfügen, wird der Code nicht korrekt ausgeführt. Da der Code aus mehreren Zeilen besteht und eingerückte Abschnitte für Schleifen und Bedingungen enthält, kann das manuelle Hinzufügen der Einrückung zu Fehlern führen.
- Klicken und ziehen Sie in IDLE im Fenster clip_zip_tool.py den Code, den Sie eingefügt haben und der noch nicht um vier Leerzeichen eingerückt ist, damit er mit dem Inhalt des Code-Blocks übereinstimmt.
Die Zeile # Workspace and datasets kann bereits eingerückt sein oder muss noch eingerückt werden. Dies hängt davon ab, ob die Leerzeichen vor dem Kommentar """Script code goes below""" beim Einfügen des Codes ausgewählt wurden.
Achten Sie darauf, dass die Zeile return nicht in Ihrer Auswahl enthalten ist.
- Klicken Sie auf Format und dann auf Indent Region.
Die Codezeilen werden jeweils um vier weitere Leerzeichen eingerückt.
- Stellen Sie sicher, dass der Code-Block der Funktion ClipZip, die Zeilen nach der Zeile def ClipZip und bis zu und einschließlich der Zeile return jeweils um vier Leerzeichen eingerückt werden (oder mehr Leerzeichen für Zeilen in Schleifen und Bedingungsanweisungen)
- Klicken Sie in IDLE auf File und dann auf Save.
Hart codierte Werte entfernen
Mehrere Zeilen des ursprünglichen Skripts legen Variablen auf bestimmte Pfade fest. Solche Pfade werden als hart codierte Pfade bezeichnet. Dies war notwendig, damit das Skript die Daten finden und verarbeiten konnte. Bei einem Skriptwerkzeug hingegen gibt der Benutzer des Werkzeugs die Ein- und Ausgaben über die Steuerelemente der Bedienoberfläche des Werkzeugs an. Sie haben das Skript für die Verwendung von arcpy.GetParameter und arcpy.GetParameterAsText eingerichtet, um diese Informationen aus der Bedienoberfläche des Werkzeugs abzurufen. Der nächste Schritt besteht darin, die hart codierten Zeilen zu entfernen.
- Löschen Sie alle Zeilen, die einen hart codierten Pfad angeben.
Das sind die Zeilen, die mit arcpy.env.workspace = , clip_fc = , gdb = und out_zip = beginnen.
- Löschen Sie die Zeile arcpy.env.overwriteOutput = True.
Es ist nicht erforderlich, diese Zeile beizubehalten, weil die Eigenschaft overwriteOutput über ArcGIS Pro gesteuert wird, wenn der Code als ein Skriptwerkzeug ausgeführt wird.
- Behalten Sie die Codezeile bei, die den Variablen gdb_path und new_gdb Werte zuweist, indem der Wert der Variable gdb geteilt wird.
- Stellen Sie sicher, dass die Zeile um vier Leerzeichen eingerückt ist, sich also auf derselben Ebene befindet, wie der Kommentar # Workspace and datasets.
Sie haben nun alle Codezeilen mit hart codierten Werten gelöscht. Das Skript ruft die Werte aus den Parametern des Skriptwerkzeugs ab.
- Speichern Sie das Skript.
print-Anweisungen in Meldungen ändern
Das ursprüngliche Skript verwendet print-Anweisungen, um den Status an das Fenster IDLE Shell zu übergeben. Dies ist nur möglich, wenn Sie das Skript über den Skript-Editor ausführen. Sie bearbeiten die print-Anweisungen, um arcpy.AddMessage zum Senden dieser Informationen an die Meldungen der Geoverarbeitung zu verwenden.
Es gibt drei print-Anweisungen. Sie werden zwei dieser Anweisungen ändern und eine löschen.
- Bearbeiten Sie die Zeile print(f"Output geodatabase {gdb} created"), um print in arcpy.AddMessage zu ändern.
Die Zeile sollte nun wie folgt lauten:
arcpy.AddMessage(f"Output geodatabase {gdb} created")
Die nächste print-Anweisung im Code druckt die Liste der Eingabe-Feature-Classes. Die Feature-Class-Liste der Variablen inputs wird jetzt über das Skriptwerkzeug festgelegt, so dass die Eingaben für die Festlegung der Zeilen mit arcpy.ListFeatureClasses nicht erforderlich sind. Sie löschen diese print-Anweisung und die Zeile, die die Liste generiert.
- Wählen Sie im Abschnitt # Clip each input feature class die Zeilen inputs = arcpy.ListFeatureClasses() und print(inputs) aus, und löschen Sie diese.
Der Abschnitt sieht in etwa wie folgt aus:
Jetzt bearbeiten Sie die dritte print-Anweisung.
- Bearbeiten Sie die Zeile print(f"Output feature class {new_fc} created"), um print in arcpy.AddMessage zu ändern.
Die Zeile sollte wie folgt lauten:
arcpy.AddMessage(f"Output feature class {new_fc} created")
- Klicken Sie in IDLE auf File und dann auf Save.
Im letzten Abschnitt des Codes, der die ZIP-Datei generiert, sind keine Änderungen erforderlich.
- Schließen Sie IDLE.
Das Skriptwerkzeug testen
Das Skriptwerkzeug kann jetzt getestet werden.
- Blenden Sie in ArcGIS Pro im Bereich Katalog die Geodatabase DC.gdb ein.
- Klicken Sie mit der rechten Maustaste auf bike_routes und klicken Sie auf Zu aktueller Karte hinzufügen.
- Blenden Sie die Toolbox Clip_and_ZIP.atbx ein, und doppelklicken Sie auf das Werkzeug Clip and ZIP.
Das Werkzeug Clip and ZIP wird geöffnet.
- Klicken Sie für den Parameter Input feature layers auf die Pfeil-Schaltfläche Viele hinzufügen.
- Aktivieren Sie im Feld Viele hinzufügen bike_racks, bike_routes und bus_lines, und klicken Sie auf Hinzufügen.
- Wählen Sie für den Parameter Clip Polygons den Layer Nachbarschaft aus.
- Geben Sie für den Parameter Output geodatabase C:\Tutorials\PythonTool\Clip.gdb ein.
- Geben Sie für den Parameter Output ZIP archive C:\Tutorials\PythonTool\Clip.zip ein.
- Klicken Sie auf Ausführen.
Das Werkzeug wird ausgeführt. Nach Beendigung des Vorgangs wird unten im Werkzeug ein grünes Banner angezeigt, das den Abschluss des Vorgangs anzeigt.
- Klicken Sie auf dem Banner auf Details anzeigen.
Im Abschnitt Meldungen des Werkzeugs werden die Meldungen angezeigt, die vom Werkzeug basierend auf dem Code generiert wurden, den Sie von print-Anweisungen in arcpy.AddMessage geändert haben.
- Schließen Sie das Fenster mit den Details.
- Klicken Sie auf die Registerkarte Katalog.
Die Geodatabase Clip.gdb wurde zum Projektordner hinzugefügt.
Das ZIP-Archiv wird nicht im Bereich Katalog angezeigt, aber Sie können im Windows File Explorer überprüfen, dass es erstellt wurde.
Sie haben ein funktionsfähiges Python-Skriptwerkzeug erstellt. Das Werkzeug verfügt über Ein- und Ausgabeparameter und umfasst einige Basisfilter für diese Parameter zur Vermeidung einiger häufig auftretender Probleme.
Im nächsten Abschnitt erfahren Sie, wie Sie Validierungcode zum Skriptwerkzeug hinzufügen können, um eine höhere Stabilität des Werkzeugs zu erzielen.
Das Werkzeug durch Validierung verbessern
Skriptwerkzeuge werden für die Verarbeitung von Benutzereingaben entwickelt. Die Validierung dient dazu, sicherzustellen, dass die Benutzereingaben sinnvoll sind und nicht zu Fehlern führen. Der erste Schritt der Validierung ist die sorgfältige Festlegung der Werkzeugparameter. Der Parameter Clip Polygons verfügt beispielsweise über einen Filter, der sicherstellt, dass nur Polygon-Feature-Classes ausgewählt werden. In diesem Abschnitt werden Sie andere Validierungsstrategien erkunden.
Prüfung auf leere Feature-Classes hinzufügen
Betrachten Sie ein Szenario, in dem eine der Ausgabe-Feature-Classes leer ist. Dies geschieht, wenn keines der Features einer Eingabe-Feature-Class innerhalb der Grenzen des Clip-Polygons liegt. In diesem Fall wäre es hilfreich, eine Meldung auszugeben, dass die Ausgabe leer ist.
- Klicken Sie im Bereich Katalog mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie auf Eigenschaften.
- Klicken Sie auf die Registerkarte Ausführung.
- Wählen Sie im Abschnitt # Clip each input feature class die Zeile arcpy.AddMessage(f"Output feature class {new_fc} created") aus.
- Ersetzen Sie die Zeile durch folgenden Code:
count = int(arcpy.management.GetCount(new_fc)[0]) if count > 0: arcpy.AddMessage(f"Output feature class {new_fc} created") else: arcpy.AddWarning(f"Output feature class {new_fc} created but does not contain any features.")
- Überprüfen Sie dass die Einrückung des Codes mit der Einrückung in der folgenden Abbildung übereinstimmt.
Der neue Code beginnt mit der Zeile count = int(arcpy.management.GetCount(new_fc)[0]), die die Anzahl der Features in der Ausgabe-Feature-Class abruft. Diese Zeile muss gleich weit eingerückt werden wie die Zeile darüber, die mit arcpy.analysis.Clip beginnt.
Die nächste Zeile enthält eine bedingte if-Anweisung, mit der überprüft wird, ob sich in der neuen Feature-Class Features befinden. Wenn Features vorhanden sind, wird der bedingte Block ausgeführt und die ursprüngliche Nachricht hinzugefügt. Wenn keine Features vorhanden sind, wird der Block else ausgeführt und arcpy.AddWarning wird verwendet, um eine Warnmeldung hinzuzufügen, die darauf hinweist, dass die Feature-Class erstellt wurde, aber leer ist. Die zwei bedingten Zeilen nach if und else sollten in Relation zu den vorangehenden Zeilen um vier Leerzeichen eingerückt sein.
- Klicken Sie auf OK, um das Fenster Eigenschaften des Werkzeugs zu schließen und die Änderungen zu speichern.
- Doppelklicken Sie auf das Werkzeug Clip and ZIP.
- Klicken Sie im Bereich Input feature layers auf "Durchsuchen", und klicken Sie in der Geodatabase DC.gdb auf die Feature-Class points_outside und dann auf OK.
Diese Feature-Class enthält Punkt-Features, die alle außerhalb des Polygons des Nachbarschafts-Shapefiles liegen. Sie verwenden diese Feature-Class, um das Werkzeug zu testen.
- Wählen Sie für den zweiten der Input feature layers den Layer bike_routes aus der Karte aus.
- Wählen Sie für den Parameter Clip Polygons den Feature-Layer Nachbarschaft aus.
- Geben Sie für den Parameter Output geodatabase folgenden Pfad ein: C:\Tutorials\PythonTool\Clip_empty.gdb.
- Geben Sie für den Parameter Output ZIP archive folgenden Pfad ein: C:\Tutorials\PythonTool\Clip_empty.zip.
- Klicken Sie auf Ausführen.
Das Werkzeug wird ausgeführt. Nach Beendigung des Vorgangs wird unten im Werkzeug ein gelbes Banner angezeigt, das den Abschluss des Vorgangs anzeigt, allerdings mit Warnungen.
- Klicken Sie auf dem Banner auf Details anzeigen.
Im Abschnitt Meldungen des Werkzeugs werden die Meldungen angezeigt, die basierend auf dem aktualisierten Code generiert wurden. Eine Warnmeldung gibt an, dass die Feature-Class points_outside erstellt wurde, aber keine Features enthält.
Die anderen Werkzeug-Meldungen sind erwartungsgemäß ebenfalls vorhanden.
- Schließen Sie die Meldungen des Werkzeugs Clip and ZIP sowie das Werkzeug Clip and ZIP selbst.
Diese Art der Validierung erfolgt nach Ausführung des Werkzeugs und Erstellung der Ausgaben. Es ist auch möglich, die Validierung vor der Ausführung des Werkzeugs zu verwenden.
Validierung zur Prüfung auf leere Eingaben verwenden
Betrachten Sie ein Szenario, in dem die von einem Benutzer ausgewählten Clip-Polygone aus einer leeren Feature-Class bestehen. Dies generiert keinen Fehler, da die Eingaben gültig sind. Die Ergebnisse werden jedoch nicht aussagekräftig sein, da alle neu erstellten Feature-Classes leer sein werden. Wenn es eine Möglichkeit gibt, im Voraus zu wissen, dass die Ergebnisse nicht aussagekräftig sein werden, sollte das Werkzeug im Idealfall nicht ausgeführt werden.
Sie ändern die Eigenschaften des Skriptwerkzeugs und fügen eine Abfrage für leere Eingaben hinzu. Diese Art der Validierung wird der Skriptdatei nicht hinzugefügt, sondern verwendet eine andere Art der Validierung.
- Klicken Sie im Bereich Katalog mit der rechten Maustaste auf das Werkzeug Clip and ZIP, und klicken Sie auf Eigenschaften.
- Klicken Sie auf die Registerkarte Validierung.
Die Registerkarte Validierung zeigt ein Code-Feld an, aber hierbei handelt es sich nicht um eine Skriptdatei. Der Code befindet sich in diesem Fall in den Werkzeugeigenschaften und wird nicht als separate .py-Datei gespeichert. Die Registerkarte Validierung enthält Vorlagen-Code, den Sie als Ausgangspunkt verwenden können.
Der Vorlagen-Code zeigt eine Klasse an, die ToolValidator bennannt ist. Die Klasse umfasst mehrere Methoden, die für verschiedene Arten der Validierung verwendet werden. Der größte Teil der Validierung erfolgt vor der Ausführung des Werkzeugs.
Sie können den Code direkt im Code-Feld ändern, oder Sie können den Code als eigene Skriptdatei verwenden, indem Sie auf In Skript-Editor öffnen klicken.
- Klicken Sie auf In Skript-Editor öffnen.
- Wählen Sie im Abschnitt def updateMessages die beiden Kommentarzeilen aus.
- Wählen Sie die drei Zeilen im Code-Block def updateMessages aus.
- Ersetzen Sie die Kommentare und die return-Anweisung, indem Sie den folgenden Code kopieren und einfügen:
# When the clip polgyon feature set, feature layer or # feature class does not contain any features, a warning # message appears in the tool dialog since this would result # in empty feature classes in the new geodatabase. if self.params[1].value: count = int(arcpy.management.GetCount(self.params[1].value)[0]) if count < 1: self.params[1].setWarningMessage("No clip features. This results in empty outputs.") return
Der Code wird in die Methodendefinition eingefügt. Es gibt jedoch ein Problem. Die erste Zeile der Kommentare ist korrekt eingerückt, aber die nachfolgenden Zeilen müssen alle zusätzlich um vier Leerzeichen eingerückt werden.
- Wählen Sie die Zeilen aus, die eingerückt werden müssen.
- Klicken Sie auf Format und dann auf Indent Region.
- Überprüfen Sie, dass die Einrückung nun korrekt ist.
- Klicken Sie in IDLE auf File und dann auf Save.
- Schließen Sie IDLE.
In ArcGIS Pro wird eine Warnung angezeigt, in der darauf hingewiesen wird, dass Änderungen vorgenommen wurden.
- Klicken Sie auf Ja.
- Klicken Sie auf OK, um das Fenster "Eigenschaften" des Werkzeugs zu schließen.
- Doppelklicken Sie auf das Werkzeug Clip and ZIP.
- Fügen Sie für die Input feature layers die Layer bike_racks und bike_routes hinzu.
- Klicken Sie für den Parameter Clip Polygons auf "Durchsuchen", und klicken Sie in der Geodatabase DC.gdb auf die Feature-Class polygon_empty und dann auf OK.
Die Feature-Class polygon_empty ist eine Polygon-Feature-Class, die keine Features enthält.
Neben dem Eingabefeld Clip Polygons wird ein Warnsymbol angezeigt.
- Zeigen Sie auf das Warnsymbol.
Der von Ihnen hinzugefügte Werkzeug-Validierungscode erkennt, dass die Polygon-Feature-Class leer ist, und gibt eine Warnmeldung aus.
Eine Warnmeldung bedeutet, dass Benutzer das Werkzeug noch ausführen, aber bereits wissen, welche Ergebnisse zurückgegeben werden. Alternativ können Sie setErrorMessage anstelle von setWarningMessage verwenden. In diesem Fall wird eine Fehlermeldung angezeigt, die die Ausführung des Werkzeugs verhindert. Bei der Entwikcklung des Werkzeugs müssen Sie sorgfältig abwägen, welche Meldungsart am sinnvollsten ist.
Hinweis:
Der hier verwendete Validierungscode beinhaltet das Werkzeug Anzahl erhalten. Dieses Werkzeug wird ausgeführt, wenn ein Wert für den Parameter ausgewählt wurde. Im Allgemeinen sollten Sie keine Geoverarbeitungswerkzeuge im Validierungscode verwenden, da dies sehr zeitintensiv sein und unvorhergesehene Probleme verursachen kann. Das Werkzeug Anzahl erhalten ist eine Ausnahme, da es ein sehr einfaches Werkzeug ist, das auch bei sehr großen Datensätzen schnell ausgeführt werden kann.
Standardwerte hinzufügen
Eine andere Art der Werkzeugvalidierung besteht darin, die Werkzeugparameter mit Standardwerten zu füllen. Dieses Verfahren wird in vielen Geoverarbeitungswerkzeugen verwendet. Wenn Sie beispielsweise das Werkzeug Ausschneiden ausführen, wird für die Ausgabe-Feature-Class standardmäßig der Name der Eingabe-Feature-Class gefolgt von _Clip verwendet. Für das Werkzeug Clip and ZIP gibt es keine Standardeinstellungen für die Parameter Output geodatabase und Output ZIP archive. Sie können diese Standardwerte zum Validierungscode hinzufügen.
- Schließen Sie das Werkzeug Clip and ZIP.
- Öffnen Sie das Fenster Eigenschaften für das Werkzeug, und klicken Sie auf die Registerkarte Validierung.
- Klicken Sie auf In Skript-Editor öffnen.
- Wählen Sie in IDLE die drei Zeilen im Code-Block def updateParameters aus.
- Ersetzen Sie die Zeilen durch den folgenden Code:
# The output geodatabase and ZIP archive are given default # names of Clip.gdb and Clip.zip, respectively, inside the # workspace of the project. Users can specify a different # file name and folder. if self.params[0].value and self.params[1].value: folder = os.path.split(arcpy.env.workspace)[0] self.params[2].value = os.path.join(folder, "Clip.gdb") self.params[3].value = os.path.join(folder, "Clip.zip") return
- Untersuchen Sie den eingefügten Code.
Die erste Zeile ist korrekt eingerückt, aber die anderen Zeilen müssen alle zusätzlich um vier weitere Leerzeichen eingerückt werden.
- Wählen Sie die einzurückenden Zeilen aus, und klicken Sie dann auf Format und Indent Region.
Das Problem mit der Einrückung wurde gelöst.
- Klicken Sie in IDLE auf File und dann auf Save.
- Schließen Sie IDLE.
- Klicken Sie in der Warnmeldung in ArcGIS Pro auf Ja.
- Klicken Sie auf OK, um das Fenster "Eigenschaften" des Werkzeugs zu schließen.
- Doppelklicken Sie auf das Werkzeug Clip and ZIP.
- Fügen Sie für die Input feature layers die Layer bike_racks und bike_routes hinzu.
- Wählen Sie für den Parameter Clip Polygons den Layer Nachbarschaft aus.
Sobald die ersten beiden Parameter einen Wert erhalten haben, werden der dritte und der vierte Parameter mit ihren Standardwerten gefüllt. Es wird eine Warnmeldung angezeigt, weil Clip.gdb und Clip.zip bereits vorhanden sind
Das Werkzeug kann trotz dieser Warnungen ausgeführt werden. Alternativ können Sie die Ausgabenamen ändern und das Werkzeug ausführen.
In diesem Lernprogramm haben Sie gelernt, wie ein Skriptwerkzeug erstellt wird, das eine benutzerfreundliche Bedienoberfläche für das Arbeiten mit Python-Code bereitstellt. Sie haben gelernt, wie Parameter für das Skriptwerkzeug konfiguriert werden und wie der Code so bearbeitet werden kann, dass er Parameter aus dem Skriptwerkzeug akzeptiert. Zusätzlich haben Sie erfahren, wie hart codierte Pfade entfernt und Rückgabecode-Meldungen hinzugefügt werden. Abschließend haben Sie gelernt, wie dem Code eine Validierung hinzugefügt werden kann, um ihn stabiler zu machen.