Python-Toolboxes sind Geoverarbeitungs-Toolboxes, die vollständig in Python erstellt werden. Eine Python-Toolbox und die darin enthaltenen Werkzeuge sehen genauso wie die auf andere Weise erstellten Toolboxes und Werkzeuge aus und funktionieren auch genauso. Bei einer Python-Toolbox (.pyt) handelt es sich einfach um eine ASCII-basierte Datei, die eine Toolbox und ein oder mehrere Werkzeuge definiert.
Nach der Erstellung bieten die Werkzeuge in einer Python-Toolbox zahlreiche Vorteile:
- Wenn Sie eine Python-Toolbox erstellen, können Sie Ihre Python-Kenntnisse nutzen und rasch Prototypen und voll funktionsfähige Geoverarbeitungswerkzeuge erstellen.
- Das erstellte Werkzeug ist wie ein Systemwerkzeug integraler Bestandteil der Geoverarbeitung. Sie können es über das Fenster Suchen oder Katalog öffnen, in ModelBuilder und im Python-Fenster verwenden und aus Skripten heraus aufrufen.
- Sie können Meldungen in das Fenster Ergebnisse und in das Statusdialogfeldfeld schreiben.
- Mit integrierten Dokumentationswerkzeugen können Sie Dokumentation bereitstellen.
- Wenn das Skript als Skriptwerkzeug ausgeführt wird, kennt arcpy die Anwendung, in der es aufgerufen wurde (z. B. ArcMap). In der Anwendung vorgenommene Einstellungen, z. B. arcpy.env.overwriteOutput und arcpy.env.scratchWorkspace, sind von ArcPy im Skriptwerkzeug verfügbar.
Erstellen einer Python-Toolbox
Eine Python-Toolbox erstellen Sie, indem Sie mit der rechten Maustaste auf den Ordner klicken, in dem Sie die neue Toolbox erstellen möchten, und dann auf Neu > Python-Toolbox klicken.
Zunächst enthält die Python-Toolbox eine Python-Klasse mit dem Namen Toolbox, die die Merkmale der Toolbox definiert, und eine zweite Python-Klasse mit dem Namen Tool, die ein Stub-Geoverarbeitungswerkzeug enthält.
Erste Schritte
Erste Schritte | |
Werkzeug definieren | |
Werkzeugparameter definieren | |
Werkzeugverhalten anpassen | Anpassen von Werkzeugverhalten in einer Python-Toolbox |
Quellcode des Werkzeugs schreiben | |
Werkzeug dokumentieren |
Beispiel für eine Python-Toolbox
Nachstehend finden Sie ein funktionsfähiges Beispiel für eine Python-Toolbox mit einem einzelnen Werkzeug. Anhand des Werkzeugs mit dem Namen CalculateSinuosity wird ein Feld hinzugefügt und die Biegung des Features berechnet. Dabei ist die Biegung ein Maß dafür, wie sich eine Linie biegt.
import arcpy
class Toolbox(object):
def __init__(self):
self.label = "Sinuosity toolbox"
self.alias = "sinuosity"
# List of tool classes associated with this toolbox
self.tools = [CalculateSinuosity]
class CalculateSinuosity(object):
def __init__(self):
self.label = "Calculate Sinuosity"
self.description = "Sinuosity measures the amount that a river " + \
"meanders within its valley, calculated by " + \
"dividing total stream length by valley length."
def getParameterInfo(self):
#Define parameter definitions
# Input Features parameter
in_features = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
in_features.filter.list = ["Polyline"]
# Sinuosity Field parameter
sinuosity_field = arcpy.Parameter(
displayName="Sinuosity Field",
name="sinuosity_field",
datatype="Field",
parameterType="Optional",
direction="Input")
sinuosity_field.value = "sinuosity"
# Derived Output Features parameter
out_features = arcpy.Parameter(
displayName="Output Features",
name="out_features",
datatype="GPFeatureLayer",
parameterType="Derived",
direction="Output")
out_features.parameterDependencies = [in_features.name]
out_features.schema.clone = True
parameters = [in_features, sinuosity_field, out_features]
return parameters
def isLicensed(self): #optional
return True
def updateParameters(self, parameters): #optional
if parameters[0].altered:
parameters[1].value = arcpy.ValidateFieldName(parameters[1].value,
parameters[0].value)
return
def updateMessages(self, parameters): #optional
return
def execute(self, parameters, messages):
inFeatures = parameters[0].valueAsText
fieldName = parameters[1].valueAsText
if fieldName in ["#", "", None]:
fieldName = "sinuosity"
arcpy.AddField_management(inFeatures, fieldName, 'DOUBLE')
expression = '''
import math
def getSinuosity(shape):
length = shape.length
d = math.sqrt((shape.firstPoint.X - shape.lastPoint.X) ** 2 +
(shape.firstPoint.Y - shape.lastPoint.Y) ** 2)
return d/length
'''
arcpy.CalculateField_management(inFeatures,
fieldName,
'getSinuosity(!shape!)',
'PYTHON_9.3',
expression)