Python ツールボックスとは

Python ツールボックス Python ツールボックス は、すべて Python で作成されたジオプロセシング ツールボックスです。Python ツールボックスとツールボックスに含まれるツールの外観および動作は、別の方法で作成されたツールボックスやツールと同様です。Python ツールボックス(*.pyt)は、ツールボックスと 1 つ以上のツールを定義するシンプルな ASCII ベースのファイルです。

Python ツールボックスを作成すると、そのツールボックス内のツールによって多くの利点がもたらされます。

Python ツールボックスの作成

Python ツールボックスを作成するには、新しいツールボックスを作成するフォルダを右クリックし、[新規作成] [Python ツールボックス] の順にクリックします。

最初、Python ツールボックスには、ツールボックスの特性を定義する Toolbox という名前の Python クラスと、雛形となるジオプロセシング ツールを提供する Tool という名前のもう 1 つの Python クラスが含まれます。

Python ツールボックスの例

以下は、ツールを 1 つだけ含む Python ツールボックスの例です。CalculateSinuosity という名前のツールは、フィールドを追加して、フィーチャの湾曲(ラインの曲率の測定値)を計算します。

注意注意:

このツールを使用するには、サンプル コードをコピーしてメモ帳などのエディタに貼り付け、「.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)

関連トピック

5/10/2014