Mit ArcGIS 10 wurde ArcPy eingeführt. Dabei handelt es sich um ein Python-Site-Paket, in dem das mit ArcGIS 9.2 eingeführte arcgisscripting-Modul enthalten ist und erweitert wurde. ArcPy bietet eine umfassende und dynamische Umgebung zur Entwicklung von Python-Skripten und eine Codevervollständigung sowie eine integrierte Dokumentation für jede Funktion, jedes Modul und jede Klasse.
ArcGIS-Anwendungen und -Skripte, die mit ArcPy geschrieben wurden, können die vielen verschiedenen Python-Module nutzen, die von GIS-Fachleuten und Programmierern der unterschiedlichsten Fachrichtungen entwickelt wurden. Ein zusätzlicher Vorteil der Verwendung von ArcPy in Python besteht darin, dass Python eine allgemeingültige Programmiersprache ist, die einfach erlernt und verwendet werden kann. ArcPy wird interpretiert und dynamisch typisiert. Sie können in einer interaktiven Umgebung also schnell Prototypen von Skripten erstellen und diese testen, und verfügen trotzdem über die Leistungsstärke, um das Schreiben von großen Anwendungen unterstützen zu können.
# Importing arcpy
#
import arcpy
# Set the workspace environment and run Clip_analysis
arcpy.env.workspace = "C:/Data/Tongass"
arcpy.Clip_analysis("standb4", "clipcov", "standby_clip", "1.25")
Nach dem Importieren von ArcPy können Sie alle Geoverarbeitungswerkzeuge der standardmäßigen Toolboxes ausführen, die für ArcGIS installiert sind:
- Toolbox "Analysis"
- Toolbox "Cartography"
- Toolbox "Conversion"
- Toolbox "Data Management"
- Toolbox "Editing"
- Toolbox "Geocoding"
- Toolbox "Linear Referencing"
- Toolbox "Multidimension"
- Toolbox "Spatial Statistics"
Importieren von Modulen
Ein Modul ist eine Python-Datei, die normalerweise Funktionen und Klassen enthält. ArcPy wird von einer Reihe von Modulen unterstützt, einschließlich eines Datenzugriffsmoduls (arcpy.da), eines Moduls zur Kartenerstellung (arcpy.mapping), eines Moduls der Erweiterung "ArcGIS Spatial Analyst" (arcpy.sa) und eines Moduls der Erweiterung "ArcGIS Network Analyst" (arcpy.na).
Verwenden Sie das Importmodul, um ein gesamtes Modul zu importieren:
# Import only arcpy.mapping
#
import arcpy.mapping
Python verfügt natürlich noch über viele andere Kernmodule und Drittanbietermodule. Wenn Sie auch mit den Kernmodulen os und sys von Python arbeiten möchten, können Sie einen ähnlichen Import verwenden:
# Import arcpy, os and sys
#
import arcpy
import os
import sys
In vielen Fällen kann es der Fall sein, dass Sie nicht das gesamte Modul verwenden müssen und dies auch nicht planen. Eine Möglichkeit, nur einen Teil eines Moduls zu importieren, ist die Verwendung der from-import-Anweisung. Im Beispiel unten wird die Klasse "env" (die Klasse "env" enthält alle Geoverarbeitungsumgebungen) importiert. Anstatt auf Umgebungen mit arcpy.env zuzugreifen, können Sie einfach env. verwenden.
# Import env from arcpy and set the workspace environment
#
from arcpy import env
env.workspace = "c:/data"
Wenn wir diesen Gedankengang weiterverfolgen, soll in bestimmten Fällen ggf. auch das Augenmerk darauf gelenkt werden, als was ein Modul oder ein Teil eines Moduls identifiziert wird, um das Skript besser lesbar zu machen. Außerdem kann es sein, dass der Standardname für Ihre Zwecke einfach zu lang ist. In all diesen Fällen können Sie die Form from-import-as verwenden. Wie im vorherigen Beispiel auch, wird im Beispiel unten die Klasse "env" importiert. Hier wird ihr jedoch der Name "ENV" zugewiesen:
# Import env from arcpy as ENV and set the workspace environment
#
from arcpy import env as ENV
ENV.workspace = "c:/data"
Auf die gleiche Weise können Sie das Kartenerstellungsmodul (mapping) importieren:
# Import the mapping module from arcpy as MAP and create a MapDocument
# object
#
from arcpy import mapping as MAP
mxd = MAP.MapDocument("C:/maps/basemap.mxd")
Eine andere Version des Imports ist die Form from-import-*. Der Inhalt des Moduls wird direkt in den Namespace importiert. Dies bedeutet, dass Sie diesen Inhalt dann direkt ohne Präfix verwenden können. Beispiel:
# Import management from arcpy as *
#
from arcpy.management import *
Dieser Ansatz birgt jedoch einige Risiken. Andere Objekte, Variablen, Module usw. mit dem gleichen Namen werden überschrieben. Außerdem kann der Namespace bei großen Modulen schnell überlastet sein. Gehen Sie wie folgt heran: Im folgenden Beispiel werden die Module "management" und "analysis" jeweils als * importiert. Beide Module verfügen über das Werkzeug "Ausschneiden". Wenn Sie jetzt versuchen, das Werkzeug "Ausschneiden" zu verwenden, um welches Werkzeug handelt es sich dann? Die Antwort ist, dass Sie das zweite Werkzeug verwenden. Dieser Ansatz kann jedoch zu Unklarheiten und Schwierigkeiten beim Lesen des Skripts führen.
# Import the management and analysis modules from arcpy as *
#
from arcpy.management import *
from arcpy.analysis import *
# Which Clip is it?
#
Clip("standb4", "clipcov", "standby_clip", "1.25")
In bestimmten Fällen kann from-import-* Ihren Code jedoch vereinfachen, z. B. beim sa-Modul der Erweiterung "ArcGIS Spatial Analyst". Einer der Vorteile des sa-Moduls besteht darin, dass Sie mehrere Klassen und Funktionen in einer einzelnen Zeile schachteln können, um ein Ausgabe-Raster-Objekt zu erzeugen.
# Import arcpy and the sa module as *
#
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension("spatial")
# Get input parameters
#
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (Raster(inRaster1) + (Raster(inRaster2) - Raster(inRaster3)))
Vergleichen Sie dies jetzt mit dem nächsten Codeblock, in dem die herkömmliche import-from-Anweisung verwendet wird. Stellen Sie sich jetzt vor, Sie möchten dem Code einige weitere Klassen und Funktionen hinzufügen. Das einfache Hinzufügen von sa. für jede Funktion und Klasse bedeutet einigen Aufwand, die Lesbarkeit wird verschlechtert, und die Zeilen werden unübersichtlicher.
# Import arcpy and the sa module
#
import arcpy
from arcpy import sa
arcpy.CheckOutExtension("spatial")
# Get input parameters
#
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))
Pfade und Import
Beim Verwenden einer import-Anweisung sucht Python an den folgenden Orten (und in der folgenden Reihenfolge) nach einem Modul, das mit dem Namen übereinstimmt:
- in der Umgebungsvariable des PYTHONPATH-Systems angegebene Pfade
- in verschiedenen standardmäßigen Python-Ordnern (aktueller Ordner, c:\python2x\lib, c:\python2x\Lib\site-packages usw.)
- Pfade, die in PTH-Dateien an den Orten unter Punkt 1 und 2 angegeben sind
Weitere Informationen finden Sie hier: http://docs.python.org/install/index.html#modifying-python-s-search-path.
Bei der Installation von ArcGIS 10.4.1-Produkten wird Python 2.7 installiert, falls die Anwendung noch nicht vorhanden ist. Bei der Installation wird außerdem die Datei "Desktop10.3.pth" (oder "Engine10.3.pth" bzw. "Server10.3.pth") unter python27\Lib\site-packages hinzugefügt. Diese Datei enthält zwei Zeilen mit den Pfaden zu den Ordnern "arcpy" und "bin" der ArcGIS-Installation auf Ihrem System. Diese beiden Pfade sind erforderlich, um ArcPy erfolgreich in Python 2.7 zu importieren.
Beim Verwenden einer import-Anweisung verweist Python auf die PYTHONPATH-Umgebungsvariable des Systems, um nach Moduldateien zu suchen. Für diese Variable ist eine Liste von Verzeichnissen festgelegt.