Erstellen von Geoverarbeitungsservices mit Python-Skripten

Detailinformationen:

Die meisten Python-Skriptwerkzeuge, die erfolgreich auf Ihrem Computer ausgeführt werden, können erfolgreich als Geoverarbeitungsservice veröffentlicht und ausgeführt werden – Sie müssen das Skript nicht ändern. Falls jedoch Probleme auftreten, kann es daran liegen, dass das Skript viele Projektdaten (d. h. Eingabedaten, die nicht als Parameter bereitgestellt werden) verwendet oder import-Anweisungen einsetzt, um die von Ihnen entwickelten Python-Module zu importieren. In diesem Fall finden Sie dieses Thema wahrscheinlich hilfreich, da die folgenden Szenarien erläutert werden:

  • Konstruieren und Suchen von Pfaden zu Projektdaten
  • Suchen importierter Module und deren Bereitstellung für die Verwendung im Werkzeug
  • Verarbeitung von Drittanbieterbibliotheken
  • Verarbeiten von Werkzeugvalidierungscode und dessen Interaktion mit dem Client und dem Geoverarbeitungsservice

Wenn Sie mit Python, ArcPy oder Skriptwerkzeugen nicht vertraut sind, finden Sie im nachfolgenden Abschnitt Erste Schritte mit Python, ArcPy und Skriptwerkzeugen eine Liste hilfreicher Themen.

Konstruieren und Suchen 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 Parameter 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 des Werkzeugs als Geoverarbeitungsservice wird das Skript gescannt. Dabei wird jede Zeichenfolge in Anführungszeichen (einfache oder doppelte Anführungszeichen) in einer Python-Variable bzw. als Argument einer Funktion getestet, um festzustellen, ob es sich um einen Pfad zu vorhandenen Daten handelt. In diesem Fall bezeichnen Projektdaten folgende Elemente:

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

Wenn eine Zeichenfolge in Anführungszeichen im Skript gefunden wird, wird der Test auf vorhandene Daten wie folgt fortgeführt:

  • 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 das Abrufen von homeFolder oder 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.CopyFeatures_management(os.path.join(prj.defaultGeodatabase, "study_sites"), 
                              "in_memory/tempSite")

# Create a variable to reference the LYRX folder
lyrxFolder = os.path.join(prj.homeFolder, "LYRXs")
arcpy.ApplySymbologyFromLayer_management("in_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 des Python-Skriptwerkzeugs erheblich verbessern. Der oben genannten Python-Code verwendet vollständige Pfade zu Feature-Classes und Layer-Dateien. Wenn ein Geoverarbeitungsservice ausgeführt wird, muss zuerst das Dataset geöffnet werden, was zu Performance-Einbußen führt. Durch die Verwendung von Layern im Skript bleiben die Daten geöffnet und werden für eine bessere Performance 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 und sind nach der Freigabe in Ihrem Portal im Geoverarbeitungsservice verfügbar (wenn sie nicht im Datenspeicher referenziert sind). Sie enthalten außerdem einen Verweis auf die im Speicher befindlichen Layer. Dieser Name, der von den Layern in der Karte bis hin zu den Zeichenfolgen in Ihrem 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 reduziert die allgemeine Portabilität Ihres Skriptwerkzeugs. Daher ist dieses Muster besonders für die Erstellung von Geoverarbeitungsservices geeignet.

Importieren anderer Python-Module

Ihr 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 Parent-Skript befindet und eine Routine 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 von der Systemvariable PYTHONPATH referenzierte Ordner.
  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

Beachten Sie im oben angegebenen Code, dass die Methode sys.path.append einen Ordner als Argument erfordert. 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 dem ArcGIS Server installiert werden. Informationen zur Bereitstellung von Python-Modulen von Drittanbietern finden Sie unter Bereitstellen von benutzerdefinierten Python-Paketen für ArcGIS Server.

Werkzeugvalidierungscode

Wenn Sie Erfahrungen mit dem Schreiben von Skriptwerkzeugen haben, können Sie eine eigene Logik zur Werkzeugvalidierung bereitstellen. Im Gegensatz zum Server verfügen Clients von Geoverarbeitungsservices nicht über die Funktion zum Ausführen der Werkzeugvalidierungslogik. Wenn die Clients ihre Task-Ausführungsanforderung an den Service senden, wird die Validierungslogik auf dem Server ausgeführt. Falls die Validierungsroutine einen Fehler ergibt, wird die Task-Ausführung gestoppt. Sie können den Service Meldungen zurückgeben lassen, sodass dem Client Meldungen von den Validierungsroutinen angezeigt werden. Als Teil eines veröffentlichten Geoverarbeitungsservice bietet der Werkzeugvalidierungscode in der Regel weniger Vorteile als bei der Verwendung auf dem Desktop. Sie können mit einer Kopie des Geoverarbeitungsservice arbeiten, in der der Validierungscode reduziert oder entfernt wurde, und diese als Geoverarbeitungsservice freigeben. Sie sollten die Validierungslogik in der Anwendung entwickeln, um den Geoverarbeitungsservice zu verwenden.

Validierungslogik wird mit Python implementiert, und der Validierungscode wird wie jedes andere Python-Skript auf Projektdaten und Module überprüft. So kann die Validierungslogik beispielsweise einen Ordner öffnen (z. B. d:\approved_projections), der Projektionsdateien enthält (.prj), um eine Auswahlliste von Raumbezügen zu erstellen, die der Client bei der Ausführung des Werkzeugs durch den Server auswählen kann. Dieser Ordner ist kein Werkzeugparameter; es handelt sich um Projektdaten, die im Werkzeugvalidierungsskript verwendet werden. Die oben beschriebene Regel gilt auch für Python-Skripte, und folglich wird der Ordner d:\approved_projections konsolidiert und auf den Server kopiert (falls er sich nicht bereits im Datenspeicher 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.

Was ist 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 Parametern für Skriptwerkzeuge

Nachdem Sie sich mit dem Erstellen von Skriptwerkzeugen vertraut gemacht haben, wird häufig auf dieses Thema verwiesen, da es ausführlich erläutert, wie Sie Skriptwerkzeug-Parameter definieren.