Was ist eine Python-Toolbox?

Python-Toolboxes Python-Toolbox 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:

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.

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.

HinweisHinweis:

Um dieses Werkzeug zu verwenden, kopieren Sie den Beispielcode, fügen ihn in einem Editor, z. B. Notepad, ein und speichern Sie die Datei mit der Erweiterung .pyt.

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)

Verwandte Themen

9/11/2013