Python ツールボックスのスキーマの更新
タイプがフィーチャクラス、テーブル、ラスタ、ワークスペースのすべての出力パラメータは、schema オブジェクトを持ちます。フィーチャクラス、テーブル、ラスタ、ワークスペースの出力だけがスキーマを持ちます。他のタイプはスキーマを持ちません。schema オブジェクトは、ジオプロセシングによって作成されます。このスキーマには、パラメータ オブジェクトを通してアクセスし、ツールの出力を記述するためのルールを設定します。スキーマ ルールを設定した後、ジオプロセシングの内部整合チェック コードによって設定したルールが検証され、出力の説明が更新されます。
確認のため、制御の流れを以下に示します。
- ツール ダイアログ ボックスを最初に開いたときに、getParameterInfo が呼び出されます。出力を記述するために、静的ルール(ユーザ入力に基づいて変更されないルール)を設定します。この時点では、ユーザは(デフォルト値を設定していない限り)パラメータに値を指定していないため、出力の記述は作成されません。
- ユーザがツール ダイアログ ボックスに何らかの対話的操作を行うと、updateParameters が呼び出されます。
- updateParameters は、[フィールドの追加(Add Field)] での新しいフィールドの追加といった、パラメータの依存性から決定できない動的な動作を扱う schema オブジェクトを変更できます。
- updateParameters の終了後、内部整合チェック ルーチンが呼び出され、schema オブジェクト内にあるルールが適用されて、出力データの記述が更新されます。
- 次に、updateMessages が呼び出されます。内部整合チェックが作成した警告およびエラー メッセージを調べて、それらを変更したり、独自の警告やエラー メッセージを追加したりできます。
すべての schema プロパティは、読み取り専用の type を除いて、すべてが読み書き可能です。
プロパティ名 |
値 |
---|---|
type |
文字列:"Feature"、"Table"、"Raster"、"Container"(ワークスペースおよびフィーチャ データセットの場合)(読み取り専用プロパティ) |
clone |
ブール値 |
featureTypeRule |
文字列:"AsSpecified"、"FirstDependency" |
featureType |
文字列:"Simple"、"Annotation"、"Dimension" |
geometryTypeRule |
文字列:"Unknown"、"FirstDependency"、"Min"、"Max"、"AsSpecified" |
geometryType |
文字列:"Point"、"Multipoint"、"Polyline"、"Polygon" |
extentRule |
文字列:"AsSpecified"、"FirstDependency"、"Intersection"、"Union"、"Environment" |
extent |
範囲オブジェクト |
fieldsRule |
文字列:"None"、"FirstDependency"、"FirstDependencyFIDs"、"All"、"AllNoFIDs"、"AllFIDsOnly" |
additionalFields |
フィールド オブジェクトの Python リスト。 |
cellSizeRule |
文字列:"AsSpecified"、"FirstDependency"、"Min"、"Max"、"Environment" |
cellsize |
倍精度 |
rasterRule |
文字列:"FirstDependency"、"Min"、"Max"、"Integer"、"Float" |
rasterFormatRule |
文字列:"Img"、"Grid" |
additionalChildren |
ワークスペース スキーマに追加するデータセットの Python リスト |
FirstDependency の使用
いくつかのルールは "FirstDependency" に設定できます。これは、parameter.parameterDependencies を使用して、パラメータの依存性配列セット内にある最初のパラメータの値を使用することを意味します。次のコードの例では、パラメータ 2 には 0 と 1 の 2 つの従属パラメータがあり、最初の依存性はパラメータ 0 です。
# Set the dependencies for the output and its schema properties
#
parameters[2].parameterDependencies = [parameters[0].name, parameters[1].name]
従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。
type
type プロパティは読み取り専用で、ジオプロセシングによって設定されます。
clone
true の場合、ジオプロセシングは、最初の従属パラメータ内にある記述の厳密なコピー(クローン)を作成します。デフォルト値は false です。通常は、getParameterInfo メソッド内で clone を true に設定します。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値に対してクローンが作成されます。
- parameter.parameterType が "Derived" の場合、厳密なコピーが作成されます。[フィールドの追加(Add Field)] ツールの動作はこれです。
- parameter.parameterType が "Required" の場合、厳密なコピーも作成されますが、データセットへのカタログ パスが変更されます。カタログ パスは 2 つの部分(ワークスペースとベース名)で構成されます。次に例を示します。
E:/Data/TestData/netcity.gdb/infrastructure/roads
- ワークスペース = E:/Data/TestData/netcity.gdb/infrastructure
- ベース名 = roads
- ベース名は、データセットを含む最初の入力パラメータ(最初の依存性ではなく、最初のパラメータ)のベース名に、スクリプト ツールの名前を付けたものになります(例: roads_MyTool)。
- ワークスペースは、テンポラリ ワークスペース環境設定に設定されます。これが空の場合、現在のワークスペース環境設定が使用されます。これが空の場合、データセットを含む最初の入力パラメータのワークスペースが使用されます。このワークスペースが読み取り専用の場合は、システムのテンポラリ ディレクトリが使用されます。
clone を true に設定すると、featureTypeRule、geometryTypeRule、extentRule など、すべてのルールベースのメソッドが "FirstDependency" に設定されます。
次の 2 つのコード例は、同じ処理を行います。両方とも、[クリップ(Clip)] ツールが出力スキーマを作成する方法に基づいています。
class ExampleClipTool1(object):
def __init__(self):
self.label = "Example Clip tool 1"
self.description = "Explicitly setting all rules"
def getParameterInfo(self):
# Input feature class
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Clip Features",
name="clip_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Output Feature Class",
name="out_feature_class",
datatype="DEFeatureClass",
parameterType="Required",
direction="Output")
# Set the dependencies for the output and its schema properties
# The two input parameters are feature classes.
#
param2.parameterDependencies = [param0.name, param1.name]
# Feature type, geometry type, and fields all come from the first
# dependency (parameter 0), the input features
#
param2.schema.featureTypeRule = "FirstDependency"
param2.schema.geometryTypeRule = "FirstDependency"
param2.schema.fieldsRule = "FirstDependency"
# The extent of the output is the intersection of the input features
# and the clip features (parameter 1)
#
param2.schema.extentRule = "Intersection"
params = [param0, param1, param2]
return params
class ExampleClipTool2(object):
def __init__(self):
self.label = "Example Clip tool 2"
self.description = "Using clone to set rules to FirstDependency, then overriding the extent rule"
def getParameterInfo(self):
# Input feature class
param0 = arcpy.Parameter(
displayName="Input Features",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Clip Features",
name="clip_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Output Feature Class",
name="out_feature_class",
datatype="DEFeatureClass",
parameterType="Required",
direction="Output")
# Set the dependencies for the output and its schema properties
# The two input parameters are feature classes.
#
param2.parameterDependencies = [param0.name, param1.name]
param2.schema.clone = True
params = [param0, param1, param2]
return params
def updateParameters(self, parameters):
# The only property of the clone that changes is that the extent
# of the output is the intersection of the input features
# and the clip features (parameter 1)
#
parameters[0].schema.extentRule = "Intersection"
return
featureTypeRule
この設定は、出力フィーチャクラスのフィーチャ タイプを決定します。このルールは、出力ラスタまたはテーブルには影響しません。
値 |
説明 |
---|---|
"AsSpecified" |
フィーチャ タイプは、featureType プロパティによって決定されます。 |
"FirstDependency" |
フィーチャ タイプは、依存性の最初のパラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
featureType
featureTypeRule が "AsSpecified" のとき、featureType の値は出力のフィーチャ タイプを指定するために使用されます。
値 |
説明 |
---|---|
"Simple" |
出力は、シンプル フィーチャを含みます。フィーチャのジオメトリ タイプは、geometryTypeRule を使用して指定されます。 |
"Annotation" |
出力は、アノテーション フィーチャを含みます。 |
"Dimension" |
出力は、ディメンション フィーチャを含みます。 |
geometryTypeRule
この設定は、出力フィーチャクラスのジオメトリ タイプ(ポイントやポリゴンなど)を決定します。
値 |
説明 |
---|---|
"Unknown" |
これがデフォルトの設定です。通常は、他のパラメータの値に基づいて、updateParameters() 内のジオメトリ タイプを判別できるはずです。ルールを "Unknown" に設定するのは、ジオメトリ タイプを判別するのに十分な情報がない場合だけです。 |
"FirstDependency" |
ジオメトリ タイプは、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
すべての従属パラメータのジオメトリを調べ、出力ジオメトリ タイプをその中の最小または最大タイプに設定します。"Min" と "Max" は、次のように定義されます。
|
"AsSpecified" |
ジオメトリ タイプは、geometryType プロパティの値によって決定されます。 |
geometryType
geometryTypeRule が "AsSpecified" のときに、使用するジオメトリ タイプ("Point"、"Multipoint"、"Polyline"、"Polygon" のいずれか)に設定します。
extentRule
値 |
説明 |
---|---|
"AsSpecified" |
出力範囲は、extent プロパティで指定されます。 |
"FirstDependency" |
出力範囲は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Intersection" |
出力範囲は、すべての従属パラメータの交差部分になります(以下に示すように、これは [クリップ(Clip)] ツールが使用する内容です)。 |
"Union" |
出力範囲は、すべての従属パラメータの幾何学的ユニオンになります。 |
"Environment" |
出力範囲は、出力範囲環境設定に基づき計算されます。 |
例
# The extent of the output is the intersection of the input features
# and the clip features (the dependent parameters)
#
parameters[2].schema.extentRule = "Intersection"
extent
extentRule が "AsSpecified" のときに、使用する範囲に設定します。範囲は、4 つの値を持つスペースで区切られた文字列または Python リスト オブジェクトで設定できます。順序は、xmin、ymin、xmax、ymax です。
parameters[2].schema.extentRule = "AsSpecified"
parameters[2].schema.extent = "123.32 435.8 987.3 567.9"
Python リストを使用した場合
xmin = 123.32
ymin = 435.8
xmax = 987.3
ext = [xmin, ymin, xmax, 567.9]
parameters[2].schema.extent = ext
fieldsRule
fieldsRule は、出力フィーチャクラスまたはテーブルに存在するフィールドを決定します。
次の表で、FID はフィーチャ ID を表していますが、実際は、すべてのフィーチャクラスまたはテーブルにある ObjectID フィールドを参照しています。
値 |
説明 |
---|---|
"None" |
オブジェクト ID 以外のフィールドは出力されません。 |
"FirstDependency" |
出力フィールドは、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"FirstDependencyFIDs" |
最初の従属入力の ObjectID だけが出力に書き込まれます。 |
"All" |
従属パラメータのリスト内にあるすべてのフィールドが出力されます。 |
"AllNoFIDs" |
ObjectID を除くすべてのフィールドが出力に書き込まれます。 |
"AllFIDsOnly" |
すべての ObjectID フィールドが出力に書き込まれますが、入力のその他のフィールドは書き込まれません。 |
additionalFields
fieldsRule を使用して追加されたフィールドの他にも、追加フィールドを出力に追加できます。additionalFields は、フィールド オブジェクトの Python リストを使用します。
cellSizeRule
出力ラスタまたはグリッドのセルサイズを決定します。
値 |
説明 |
---|---|
"AsSpecified" |
出力セルサイズは、cellSize プロパティで指定されます。 |
"FirstDependency" |
セル サイズは、最初の従属パラメータから計算されます。従属パラメータがラスタの場合、そのセルサイズが使用されます。従属パラメータがフィーチャクラスやフィーチャ データセットなど、他のタイプの場合、データの範囲を使用してセルサイズが計算されます。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
"Min" の場合、出力セルサイズは従属パラメータの最小セルサイズになります。"Max" の場合、出力セルサイズは従属パラメータの最大セルサイズになります。 |
"Environment" |
出力セルサイズは、セルサイズ環境設定に基づいて計算されます。 |
cellSize
cellSizeRule が "AsSpecified" のときに、使用するセルサイズに設定します。
rasterRule
出力ラスタに含まれるデータ タイプ(整数または浮動小数)を決定します。
値 |
説明 |
---|---|
"FirstDependency" |
データ タイプ(整数または浮動小数)は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。 |
"Min"、"Max" |
整数は浮動小数より小さいと見なされます。たとえば、2 つの従属パラメータがあり、一方は整数を含み、他方は浮動小数を含む場合、"Min" は整数の出力を作成し、"Max" は浮動小数の出力を作成します。 |
"Integer" |
出力ラスタには整数(自然数)が含まれます。 |
"Float" |
出力ラスタには浮動小数(有理数)が含まれます。 |
rasterFormatRule
出力ラスタの形式("Grid" または "Img")を決定します。デフォルトは "Img" です。これは、ERDAS IMAGINE 形式です。"Grid" は Esri の形式です。
additionalChildren
ワークスペースは、データセット(フィーチャ、テーブル、ラスタ)のコンテナです。これらのデータセットは、ワークスペースの子です(ワークスペースは親と考えます)。ツールがデータセットを新規または既存のワークスペースに追加する場合、子の記述を追加することで、ワークスペースの記述を更新することができます。たとえば、フィーチャクラスのリスト(複数値)を使用して、何らかの方法でそれらのフィーチャクラスを変更してから、変更したフィーチャクラスを既存のワークスペースに書き込むツールがあるとします。ModelBuilder でこのツールを使用する場合、ワークスペースはツールの派生出力となり、このワークスペースを [データの選択(Select Data)] ツールへの入力として使用できます。[データの選択(Select Data)] では、コンテナ内にある子のデータセットを選択して、それを別のツールの入力として使用できます。
additionalChildren への入力は、1 つ以上の子の記述です。子の記述には、2 つの形式があります。
形式 |
説明 |
---|---|
value オブジェクト |
value プロパティから返されるフィーチャクラス、テーブル、ラスタ、ディメンション、またはアノテーション値。 |
[type, name, fields, extent, spatial reference] という形式の Python リスト オブジェクト |
追加する子の記述を含む Python リスト。リスト内の最初の 2 つのエントリであるタイプと名前だけが必須です。残りの引数はオプションです。 |
複数の子を追加する場合、子の記述のリストを指定します。Python リスト オブジェクトの形式で子を追加している場合、additionalChildren のリストのリストを作成します。
Python リストの形式には、次の表に示したように 5 つの引数があります。
引数 |
タイプ |
説明 |
---|---|---|
type |
必須 |
"Point"、"Multipoint"、"Polyline"、"Polygon"、"Table"、"Raster"、"Annotation"、"Dimension" のいずれか |
name |
必須 |
データセットの名前。データセットのベース名("streets")またはフル カタログ パス("E:\mydata\test.gdb\infrastructure\streets")を使用できます。フル カタログ パスで指定した場合、ベース名("streets")以外は無視されます。 |
fields |
オプション |
フィールド オブジェクトの Python リスト。これには、子にあるフィールドが含まれます(既知の場合)。 |
extent |
オプション |
子の空間範囲を含む文字列または Python リスト。 |
spatial reference |
オプション |
空間参照オブジェクト。 |
これらの引数は、この順序で指定する必要があります。オプションの引数をスキップするには、Python のキーワード None または "#" を使用します。
次に、ワークスペース スキーマを設定する例をいくつか示します。これらの例は、次の引数を持つスクリプト ツールに基づいています。
パラメータ名 |
プロパティ | |
---|---|---|
0 |
入力フィーチャクラス |
フィーチャクラス - 入力。 |
1 |
入力テーブル |
テーブル - 入力。 |
2 |
入力ワークスペース |
ワークスペース - 入力(ツールの結果を持つ既存のワークスペース)。 |
3 |
派生ワークスペース |
ワークスペース - 派生出力、取得元は Input_workspace。このワークスペースのスキーマは、追加の子を持つように変更されます。 |
このツールは、入力フィーチャクラスとテーブルを使い、両方をワークスペースにコピーして、新しいフィールドをフィーチャクラスに追加してから、新しいポリゴン フィーチャクラスをワークスペースに作成します(ここでの目的はワークスペース スキーマの設定を示すことなので、ツールの実際の処理は重要ではありません)。以下のコード例は互いを利用して構築されており、まず additionalChildren を単純に使用しています。以下のコード例をいくつか実装してテストする場合は、次のモデルを使用してコードをテストできます。
getParameterInfo では、従属パラメータ(param2)から、出力ワークスペースのクローンが作成されます。
class ExampleTool(object):
def __init__(self):
self.label = "Example tool"
self.description = "Example of parameter dependencies"
def getParameterInfo(self):
#Define parameter definitions
# Input feature class
param0 = arcpy.Parameter(
displayName="Input feature class",
name="in_features",
datatype="GPFeatureLayer",
parameterType="Required",
direction="Input")
# Input table
param1 = arcpy.Parameter(
displayName="Input table",
name="in_table",
datatype="GPTableView",
parameterType="Required",
direction="Input")
# Input workspace
param2 = arcpy.Parameter(
displayName="Input workspace",
name="in_workspace",
datatype="DEWorkspace",
parameterType="Required",
direction="Input")
# Derived workspaces
param3 = arcpy.Parameter(
displayName="Derived workspace",
name="out_workspace",
datatype="DEWorkspace",
parameterType="Derived",
direction="Output")
# Set dependencies to the input workspace parameter
param3.parameterDependencies = [param0.name]
# Copy all existing contents to output
param3.schema.clone = True
params = [param0, param1, param2, param3]
return params
例: 2 つの入力(未変更)を出力ワークスペースにコピーします。
def updateParameters(self, parameters):
inFC = parameters[0].value # input feature class
inTable = parameters[1].value # input table
inWS = parameters[2].value # input workspace
if inFC and inTable and inWS:
parameters[3].schema.additionalChildren = [inFC, inTable]
return
例: ツールが、新しいポリゴン フィーチャクラスを作成します。この新しいフィーチャクラスについて(整合チェック時に)わかるプロパティは、名前("SummaryPolygon")とタイプ("polygon")だけです。
def updateParameters(self, parameters):
children = [] # New empty list
children.append(parameters[0].value)
children.append(parameters[1].value)
children.append(["polygon", "SummaryPolygon"])
parameters[3].schema.additionalChildren = children
return
例: 入力フィーチャクラスにフィールドを追加します。
def updateParameters(self, parameters):
# Create a field object with the name "Category" and type "Long"
#
newField = arcpy.Field()
newField.name = "Category"
newField.type = "Long"
# Describe the input feature class in order to get its list of fields. The 9.3
# version of the geoprocessing object returns fields in a Python list, unlike
# previous versions, which returned fields in an enumerator.
#
desc = arcpy.Describe(parameters[0].value)
fieldList = desc.fields
# Add the new field to the list
#
fieldList.append(newField)
# Create a new child based on the input feature class, but with the
# additional field added
#
newChild = [desc.shapeType, desc.catalogPath, fieldList,
desc.extent, desc.spatialReference]
# Now create our list of children and add to the schema
#
children = []
children.append(newChild)
children.append(inTable)
children.append(["polygon", "SummaryPolygon"])
parameters[3].schema.additionalChildren = children
return
SummaryPolygon(新しいポリゴン フィーチャクラス)のフィールドを作成するには、上記の例で示したパターンに似たフィールド オブジェクトのリストを作成します。
例: 複数値の入力
この例では、最初のパラメータはフィーチャクラスの複数値です。複数値内の各フィーチャクラスは、派生ワークスペースにコピーされます。コピーされた各フィーチャクラスに、ProjectID という新しいフィールドが追加されます。
# 0 - input features (multivalue)
# 1 - input workspace
# 2 - derived workspace
def updateParameters(self, parameters):
inVT = parameters[0].value # multivalue ValueTable
inWS = parameters[1].value # WorkSpace
# Add each feature class to the output workspace. In addition,
# add a new field "ProjectID" to each feature class
#
if inVT and inWS:
rowCount = inVT.rowCount # Row count in MultiValue table
children = []
newField = arcpy.Field()
newField.name = "ProjectID"
newField.type = "Long"
for row in range(0, rowCount):
value = inVT.getValue(row, 0)
if value:
d = arcpy.Describe(value)
fieldList = d.fields
# Note -- not checking if field already exists
#
fieldList.append(newField)
# Create new child with additional ProjectID
# field and add child to list of children
#
child = [d.shapeType, d.catalogPath, fieldList]
children.append(child)
parameters[2].schema.additionalChildren = children
return