Erstellen mit Python-Skripten

Die meisten Python-Skriptwerkzeuge, die erfolgreich auf Ihrem Computer ausgeführt werden, können erfolgreich als ein Web-Werkzeug in ArcGIS Enterprise oder ein Geoverarbeitungsservice auf einem eigenständigen ArcGIS Server veröffentlicht und ausgeführt werden. Sie müssen das Skript nicht ändern.

Erstellen von Pfaden zu Projektdaten

Ein wichtiger Teil vieler Python-Skripte ist die ordnungsgemäße Konstruktion von Pfaden, die Daten referenzieren. Hierzu zählen Projektdaten (Eingabedaten, die nicht als Werkzeugparameter bereitgestellt werden) in Skripten sowie Zwischendaten (temporäre Daten). Es gibt verschiedene Möglichkeiten, Pfade in Python zu schreiben, die auf Daten verweisen. Weitere Informationen zum Schreiben vollständiger Pfade finden Sie unter Festlegen von Pfaden zu Daten in Python.

Ein Pfad zu Daten relativ zu einem bekannten Speicherort kann mit os.path.join konstruiert werden. Dies ist auch für die Konstruktion von Pfaden zu Ausgabespeicherorten, die im memory-Workspace enthalten sind, oder für die Verwendung von Scratch-Speicherorten für temporäre Daten auf der Festplatte hilfreich. Weitere Informationen zum Verwenden von os.path.join finden Sie im nachfolgenden Beispiel.

Beim Freigeben eines Werkzeugs als Web-Werkzeug wird das Skript gescannt und jede Zeichenfolge (mit einfachen oder doppelten Anführungszeichen) in einer Python-Variable oder als Argument für eine Funktion getestet, um festzustellen, ob es sich um einen Pfad zu vorhandenen Daten handelt. In diesem Fall bezeichnen Projektdaten alle folgenden Elemente:

  • ein Layer im Inhaltsverzeichnis einer Karte oder Szene
  • ein Ordner
  • eine Datei
  • ein Geodataset wie beispielsweise eine Feature-Class, eine Geodatabase, eine Karte (.mapx) oder eine Layer-Datei (.lyrx)

Wenn eine Zeichenfolge im Skript gefunden wird, gibt die Prüfung auf vorhandene Daten Antwort auf folgende Fragen:

  • Verweist die Zeichenfolge auf einen Layer im Bereich Inhalt?
  • Enthält die Zeichenfolge einen absoluten Pfad zu Daten, z. B. "e:\Warehousing\ToolData\SanFrancisco.gdb\streets"?
  • Referenziert die Zeichenfolge Daten, die sich relativ zu einem bekannten Speicherort, z. B. die Projektdatei .aprx oder das Skript, befinden?

Diese Tests werden in sequenzieller Reihenfolge durchgeführt. Wenn die Tests bestanden wurden und die Daten vorhanden sind, werden sie konsolidiert, ausgenommen die Daten wurden beim verbundenen Data Store des Portals registriert.

Hinweis:

Wenn Ordner konsolidiert werden, werden nur die im Ordner vorhandenen Dateien und Geodatasets kopiert, nicht jedoch die enthaltenen Unterordner. Einige Geodatasets, wie z. B. File-Geodatabases und Raster sind technisch gesehen Ordner; sie sind jedoch auch Geodatasets und werden daher kopiert. Wenn der Ordner Layer-Dateien (.lyrx) oder Karten (.mapx) enthält, werden alle von der Layer-Datei oder der Karte referenzierten Daten ebenfalls konsolidiert, sodass die arcpy.mp-Routinen im Skript Zugriff auf die referenzierten Daten erhalten.

Tipp:

Aufgrund der Art und Weise, wie Ordner konsolidiert werden, sollten Sie die Ordner nicht unnötig mit großen Datasets und Dateien füllen, die nicht vom Werkzeug verwendet werden. Dadurch wird die Datenmenge, die gepackt oder auf den Server hochgeladen werden soll, unnötig vergrößert. (Dies gilt nicht für Ordner im Data Store des Servers, da diese Ordner nicht auf den Server hochgeladen werden.)

Beispiel

Das folgende Beispiel basiert auf der Ordnerstruktur dieses Projekts:

Beispielprojekt

Relative Pfade zu Datasets und Ordnern

Eine arcpy.mp-Routine ermöglicht Ihnen das Abrufen des homeFolder oder der defaultGeodatabase für ein angegebenes Projekt. Pfade können mit dem Python-Modul os erstellt werden. Im folgenden Beispiel wird eine Feature-Class in der Geodatabase WebTools.gdb mit einer Layer-Datei im Ordner LYRXs festgelegt und symbolisiert:


import arcpy
import os

# The ArcGIS Project is used to build paths from the defaultGeodatabase and 
# homeFolder using os.path.join

# Reference the CURRENT project with ArcGIS Pro open, or point to an .aprx on 
# disk
prj = arcpy.mp.ArcGISProject("CURRENT")
arcpy.management.CopyFeatures(os.path.join(prj.defaultGeodatabase, "study_sites"), 
                              "memory/tempSite")

# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.management.ApplySymbologyFromLayer("memory/tempSite", 
                                         os.path.join(lyrxFolder, "Site4.lyrx"))

Im Code oben werden die Feature-Class study_sites und die Datei Site4.lyrx (sowie die Daten, auf die sie verweist) getestet, um zu ermitteln, ob vorhandene Daten referenziert werden. Diese Datasets werden konsolidiert und auf den Server hochgeladen (es sei denn, der Ordner, in dem sie sich befinden, wurde als Teil des Data Store des Servers referenziert).

Die Variable lyrxFolder verweist auf einen relativen Pfad zu einem Ordner mit Layer-Dateien. Dieser Ordner wird konsolidiert. Sein gesamter Inhalt (mit Ausnahme der Unterordner, wie oben erläutert) wird gepackt oder auf den Server hochgeladen (wenn der Ordner lyrxFolder nicht Bestandteil des Server-Data-Store ist).

Referenzieren von Layern als Projektdaten

Ein nicht so gängiger Workflow zum Verwenden von Layern als Projektdaten könnte die Performance eines Python-Skriptwerkzeugs erheblich verbessern. Der oben genannte Python-Code verwendet vollständige Pfade zu Feature-Classes und Layer-Dateien. Wenn ein Web-Werkzeug ausgeführt wird, muss es zuerst das Dataset öffnen, was zu Performance-Einbußen führt. Durch die Verwendung von Layern in einem Skript bleiben die Daten geöffnet und werden für eine schnellere Implementierung gecacht. Die folgende Abbildung veranschaulicht, wie Layer im Inhalt des Projekts abgeglichen und im Python-Skript verwendet werden:

Im Python-Skriptwerkzeug verwendete Layer

Die Variablen (extentMask und rasterLayer) verweisen auf einfache Zeichenfolgen, die mit den Layer-Namen in der Karte übereinstimmen. Die Daten werden konsolidiert, sind nach der Freigabe in Ihrem Portal im Web-Werkzeug verfügbar (wenn sie nicht im DataStore referenziert sind) und enthalten einen Verweis auf die im Speicher befindlichen Layer. Dieser Name, der von den Layern in der Karte bis hin zu den Zeichenfolgen in einem Skript übereinstimmt, ermöglicht Werkzeugen das Arbeiten mit Layern.

Hinweis:

Wenn Layer als interne Projektdaten für ein Skriptwerkzeug verwendet werden, wird das Skriptwerkzeug von der verknüpften Karte abhängig. Das Werkzeug kann über eine andere Karte ausgeführt werden, ohne dass diese Layer vorhanden sind. Dieses Muster verringert die allgemeine Portabilität eines Skriptwerkzeugs. Daher eignet sich dieses Muster am besten für die Erstellung von Web-Werkzeugen.

Importieren anderer Python-Module

Ein Skript kann andere Skripte importieren, die Sie bereitgestellt haben. Der folgende Code stellt beispielsweise den Import eines Python-Moduls namens myutils.py dar, das sich im selben Verzeichnis wie das übergeordnete Skript befindet und eine Methode namens getFIDName enthält:


import arcpy
import myutils

inFeatures = arcpy.GetParameterAsText(0)
inFID = myutils.getFIDName(inFeatures)

Wenn die Anweisung import vorkommt, wird das Skript in der folgenden Reihenfolge gesucht:

  1. Im selben Ordner wie das Skript. Wenn das Skript in der Toolbox eingebettet ist, wird der Ordner, der die Toolbox enthält, verwendet.
  2. Der Ordner, der von der Systemvariable PYTHONPATH referenziert wird.
  3. Ein beliebiger Ordner, der von der Systemvariable PATH referenziert wird.
Wenn sich das zu importierende Skript in einem dieser Ordner befindet, wird das Skript konsolidiert. Der Suchvorgang erfolgt rekursiv – das importierte Skript wird ebenfalls auf Projektdaten überprüft, und diese werden anhand der oben beschriebenen Regeln importiert.

Eine weitere Vorgehensweise zum Referenzieren von zu importierenden Modulen ist die Verwendung der Methode sys.path.append. Damit können Sie einen Pfad zu einem Ordner einrichten, der die zu importierenden Skripte enthält.


import arcpy
import sys
import os

# Append the path to the utility modules to the system path
# for the duration of this script.
myPythonModules = r'e:\Warehousing\Scripts'
sys.path.append(myPythonModules)
import myutils  # A Python file within myPythonModules

Im oben angegebenen Code erfordert die Methode sys.path.append einen Ordner als Argument. Da r'e:\Warehousing\Scripts' ein Ordner ist, wird der gesamte Inhalt des Ordners konsolidiert. Die Regeln zum Kopieren des Ordnerinhalts gelten hier ebenfalls – alles im Ordner wird kopiert, außer Unterordner, die keine Geodatasets sind.

Hinweis:

Python-Skripte im Ordner werden nicht auf Projektdaten oder importierte Module überprüft.

Module von Drittanbietern

Drittanbietermodule und -bibliotheken (alle Module, die nicht Teil der Python-Kerninstallation sind) werden nicht konsolidiert. Sie müssen sicherstellen, dass das Modul vorhanden ist und ordnungsgemäß auf dem Server ausgeführt wird. Dies gilt weder für numpy, matplotlib noch für andere Module, die standardmäßig mit Ihrem verbundenen Server, auf dem ArcGIS Server ausgeführt wird, installiert werden. Informationen zur Bereitstellung von Python-Modulen von Drittanbietern finden Sie unter Bereitstellen von benutzerdefinierten Python-Paketen für ArcGIS ServerArcGIS Server.

Werkzeugvalidierungscode

Skriptwerkzeuge unterstützen die benutzerdefinierte Logik zur Werkzeugvalidierung. Die Validierung unterstützt Funktionen, wie etwa das Aktivieren und Deaktivieren von Parametern, das Bereitstellen von Standardwerten und das Aktualisieren von Zeichenfolgen-Schlüsselwörtern. Ohne die Validierungsfunktion bietet die benutzerdefinierte Logik zur Werkzeugvalidierung für Web-Werkzeug-Clients keinen großen Mehrwert. Die Validierungsfunktion bietet Kunden jedoch eine ähnliche Validierungserfahrung bei der Ausführung eines Web-Werkzeugs wie bei der lokalen Ausführung des Werkzeugs.

Validierungsfunktion

Wenn ein Client eine Validierungsanforderung an ein Web-Werkzeug oder einen Geoverarbeitungsservice sendet, wird die Klasse ToolValidator ausgeführt. Um eine bessere Benutzererfahrung für die Benutzer Ihrer Werkzeuge zu gewährleisten, erstellen Sie nur schnell verarbeitbaren Validierungscode. Obwohl Sie Validierungscode verwenden können, der ein Dataset öffnet oder einen Wert oder ein Schema einer Feature- oder Tabelleneingabe ändert, ist die Validierung langsam und sendet das geänderte Feature oder die geänderte Tabelle nicht an den Benutzer des Web-Werkzeugs zurück.

Die folgenden häufig verwendeten benutzerdefinierten Validierungen werden von der Validierungsfunktion vollständig unterstützt. Python unterstützt zudem zusätzliche Validierungsfunktionen, mit Ausnahme der Änderung des Werts eines Eingabe-Features, einer Tabelle oder eines Rasters.

Aktualisieren des Filters eines Parameters

Ausgehend vom Wert eines Parameters wird der Filter eines anderen Parameters aktualisiert.

def updateParameters(self):
    if self.params[0].value < 1000:
        self.params[1].filter.list = ["A4", "Letter"]
    elif self.params[0].value < 5000:
        self.params[1].filter.list = ["A3", "Tabloid"]
    else:
        self.params[1].filter.list = ["A2", "ANSI C"]
    return
Aktivieren bzw. Deaktivieren eines Parameters

Wenn der erste Parameter einen Wert hat, wird der zweite Parameter aktiviert; andernfalls wird der zweite Parameter deaktiviert.

def updateParameters(self):
    if self.params[0].value:
        self.params[1].enabled = True
    else:
        self.params[1].enabled = False
    return
Aktualisieren des Wertes eines Parameters

Wenn ein Benutzer keinen Wert für den Parameter angegeben hat, aktualisiert der Validierungscode den Wert des Parameters auf eine bestimmte Zeichenfolge.

def updateParameters(self):
    if not self.params[3].altered:
        self.params[3].value = "Default map authored by " + self.params[2].valueAsText
    return
Bereitstellen einer benutzerdefinierten Meldung

Je nach Geometrietyp der Eingabe wird eine entsprechende Meldung angezeigt.

def updateMessages(self):
    self.params[0].clearMessage()
        
    if self.params[0].valueAsText:
        shapetype = arcpy.Describe(self.params[0]).shapeType.lower()
        if shapetype == "point":
            self.params[0].setWarningMessage("Choosing a point layer may result long running time of the tool.")
        elif shapetype == "polygon":
            self.params[0].setErrorMessage("Polygon inputs are not supported temporarily.")
    return
Code zur Initialisierung der Validierung

Diese Konfigurationen in der Funktion initializeParameters wirken sich auf das Werkzeug bei seiner Veröffentlichung oder beim Neustart des Geoverarbeitungsservice aus.

def initializeParameters(self):
    self.params[5].parameterDependencies = [4]
    self.params[7].category = "Detailed configurations"
return

Im Gegensatz zum Server können Clients von Web-Werkzeugen die Logik zur Validierung eines Werkzeugs nicht ausführen. Wenn der Client seine Task-Ausführungsanforderung an den Service sendet, wird die Validierungslogik auf dem Server ausgeführt. Wenn bei der Validierung ein Fehler auftritt, wird der Task abgebrochen. Wenn Sie Meldungen von Ihrem Service zurücksenden, erhält der Client keine Meldungen der Validierungsroutinen. Als Teil eines veröffentlichten Web-Werkzeugs bietet der Werkzeugvalidierungscode im Allgemeinen weniger Vorteile als bei der Verwendung auf dem Desktop. Sie können mit einer Kopie des Web-Werkzeugs arbeiten, dessen Validierungscode reduziert oder entfernt wurde, und dieses als Web-Werkzeug freigeben. Sie sollten die Validierungslogik in der Anwendung entwickeln, um das Web-Werkzeug zu verwenden.

Validierungslogik wird mit Python implementiert, und der Validierungscode wird wie jedes andere Python-Skript auf Projektdaten und Module überprüft. Beispielsweise kann die Validierungslogik einen Ordner öffnen, wenn es sich bei dem Ordner nicht um einen Werkzeugparameter, sondern um die in Ihrem Werkzeugvalidierungsskript verwendeten Projektdaten handelt. Die oben beschriebenen Regeln gelten auch für Python-Skripte, und der Ordner c wird konsolidiert und auf den Server kopiert (falls er sich nicht bereits im Data Store des Servers befindet).

Erste Schritte mit Python, ArcPy und Skriptwerkzeugen

Wenn Sie mit Python, ArcPy und Skriptwerkzeugen noch nicht vertraut sind, finden Sie in der folgenden Tabelle einige Themen, die Ihnen bei den ersten Schritten helfen.

HilfethemaInhalt

Einführung in die Geoverarbeitung

Einführung in Geoverarbeitung

Einführung in ArcPy

Einführung in ArcPy

Kurzer Überblick über das Erstellen von Werkzeugen in Python

Was ist ein Skriptwerkzeug?

Einführung in das Erstellen von benutzerdefinierten Skriptwerkzeugen mit Python

Festlegen von Skriptwerkzeugparametern

Nachdem Sie sich mit dem Erstellen von Skriptwerkzeugen vertraut gemacht haben, erläutert dieses Thema ausführlich die Definition von Parametern für Skriptwerkzeuge.