Python ツールボックス は、すべて Python で作成されたジオプロセシング ツールボックスです。Python ツールボックスとツールボックスに含まれるツールの外観および動作は、別の方法で作成されたツールボックスやツールと同様です。Python ツールボックス(*.pyt)は、ツールボックスと 1 つ以上のツールを定義するシンプルな ASCII ベースのファイルです。
Python ツールボックスを作成すると、そのツールボックス内のツールによって多くの利点がもたらされます。
- Python ツールボックスを作成すると、Python に関する知識を活用して、フル機能のジオプロセシング ツールのプロトタイプを迅速に作成し、フル機能のジオプロセシング ツールを構築することができます。
- 作成したツールはシステム ツール同様、ジオプロセシングに重要なツールです。検索ウィンドウまたはカタログ ウィンドウから開くことが可能で、ModelBuilder および Python ウィンドウで使用したり、スクリプトから呼び出したりすることができます。
- [結果] ウィンドウおよび進捗ダイアログ ボックスに、メッセージを書き込むことができます。
- 組み込みのドキュメント化ツールを使用して、ドキュメント化を行うことができます。
- スクリプトをスクリプト ツールとして実行する場合、arcpy は呼び出し元のアプリケーション(ArcMap など)を完全に認識します。アプリケーションで行った設定(arcpy.env.overwriteOutput、arcpy.env.scratchWorkspace など)は、スクリプト ツールの ArcPy から利用することができます。
Python ツールボックスの作成
Python ツールボックスを作成するには、新しいツールボックスを作成するフォルダを右クリックし、[新規作成] > [Python ツールボックス] の順にクリックします。
最初、Python ツールボックスには、ツールボックスの特性を定義する Toolbox という名前の Python クラスと、雛形となるジオプロセシング ツールを提供する Tool という名前のもう 1 つの Python クラスが含まれます。
はじめに
はじめに | |
ツールの定義 | |
ツールのパラメータの定義 | |
ツールの動作のカスタマイズ | |
ツールの「ソース コード」の記述 | |
ツールのドキュメント化 |
Python ツールボックスの例
以下は、ツールを 1 つだけ含む Python ツールボックスの例です。CalculateSinuosity という名前のツールは、フィールドを追加して、フィーチャの湾曲(ラインの曲率の測定値)を計算します。
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)