Python ツールボックスのスキーマの更新

タイプがフィーチャクラス、テーブル、ラスタ、ワークスペースのすべての出力パラメータは、schema オブジェクトを持ちます。フィーチャクラス、テーブル、ラスタ、ワークスペースの出力だけがスキーマを持ちます。他のタイプはスキーマを持ちません。schema オブジェクトは、ジオプロセシングによって作成されます。このスキーマには、パラメータ オブジェクトを通してアクセスし、ツールの出力を記述するためのルールを設定します。スキーマ ルールを設定した後、ジオプロセシングの内部整合チェック コードによって設定したルールが検証され、出力の説明が更新されます。

確認のため、制御の流れを以下に示します。

  1. ツール ダイアログ ボックスを最初に開いたときに、getParameterInfo が呼び出されます。出力を記述するために、静的ルール(ユーザ入力に基づいて変更されないルール)を設定します。この時点では、ユーザは(デフォルト値を設定していない限り)パラメータに値を指定していないため、出力の記述は作成されません。
  2. ユーザがツール ダイアログ ボックスに何らかの対話的操作を行うと、updateParameters が呼び出されます。
  3. updateParameters は、[フィールドの追加(Add Field)] での新しいフィールドの追加といった、パラメータの依存性から決定できない動的な動作を扱う schema オブジェクトを変更できます。
  4. updateParameters の終了後、内部整合チェック ルーチンが呼び出され、schema オブジェクト内にあるルールが適用されて、出力データの記述が更新されます。
  5. 次に、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

Double

rasterRule

文字列:"FirstDependency"、"Min"、"Max"、"Integer"、"Float"

rasterFormatRule

文字列:"Img"、"Grid"

additionalChildren

ワークスペース スキーマに追加するデータセットの Python リスト

schema オブジェクトのプロパティ

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 に設定します。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値に対してクローンが作成されます。

clone を true に設定すると、featureTypeRulegeometryTypeRuleextentRule など、すべてのルールベースのメソッドが "FirstDependency" に設定されます。

次の 2 つのコード例は、同じ処理を行います。両方とも、[クリップ(Clip)] ツールが出力スキーマを作成する方法に基づいています。

例 1: すべてのルールの明示的な設定
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
例 2: clone を使用してルールを FirstDependency に設定後、範囲ルールを上書き
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"

フィーチャ タイプは、依存性の最初のパラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。

featureTypeRule の値

featureType

featureTypeRule が "AsSpecified" のとき、featureType の値は出力のフィーチャ タイプを指定するために使用されます。

説明

"Simple"

出力は、シンプル フィーチャを含みます。フィーチャのジオメトリ タイプは、geometryTypeRule を使用して指定されます。

"Annotation"

出力は、アノテーション フィーチャを含みます。

"Dimension"

出力は、ディメンション フィーチャを含みます。

featureType の値

geometryTypeRule

この設定は、出力フィーチャクラスのジオメトリ タイプ(ポイントやポリゴンなど)を決定します。

説明

"Unknown"

これがデフォルトの設定です。通常は、他のパラメータの値に基づいて、updateParameters() 内のジオメトリ タイプを判別できるはずです。ルールを "Unknown" に設定するのは、ジオメトリ タイプを判別するのに十分な情報がない場合だけです。

"FirstDependency"

ジオメトリ タイプは、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

すべての従属パラメータのジオメトリを調べ、出力ジオメトリ タイプをその中の最小または最大タイプに設定します。"Min" と "Max" は、次のように定義されます。

  • ポイントおよびマルチポイント = 0
  • ポリライン = 1
  • ポリゴン = 2
従属パラメータがポイントまたはポリゴン フィーチャクラスの場合、最小はポイントになり、最大はポリゴンになります。

"AsSpecified"

ジオメトリ タイプは、geometryType プロパティの値によって決定されます。

geometryTypeRule の値

geometryType

geometryTypeRule が "AsSpecified" のときに、使用するジオメトリ タイプ("Point"、"Multipoint"、"Polyline"、"Polygon" のいずれか)に設定します。

extentRule

説明

"AsSpecified"

出力範囲は、extent プロパティで指定されます。

"FirstDependency"

出力範囲は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。

"Intersection"

出力範囲は、すべての従属パラメータの交差部分になります(以下に示すように、これは [クリップ(Clip)] ツールが使用する内容です)。

"Union"

出力範囲は、すべての従属パラメータの幾何学的ユニオンになります。

"Environment"

出力範囲は、出力範囲環境設定に基づき計算されます。

extentRule の値

# 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 フィールドが出力に書き込まれますが、入力のその他のフィールドは書き込まれません。

fieldsRule の値

additionalFields

fieldsRule を使用して追加されたフィールドの他にも、追加フィールドを出力に追加できます。additionalFields は、フィールド オブジェクトの Python リストを使用します。

cellSizeRule

出力ラスタまたはグリッドのセルサイズを決定します。

説明

"AsSpecified"

出力セルサイズは、cellSize プロパティで指定されます。

"FirstDependency"

セル サイズは、最初の従属パラメータから計算されます。従属パラメータがラスタの場合、そのセルサイズが使用されます。従属パラメータがフィーチャクラスやフィーチャ データセットなど、他のタイプの場合、データの範囲を使用してセルサイズが計算されます。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

"Min" の場合、出力セルサイズは従属パラメータの最小セルサイズになります。"Max" の場合、出力セルサイズは従属パラメータの最大セルサイズになります。

"Environment"

出力セルサイズは、セルサイズ環境設定に基づいて計算されます。

cellSizeRule の値

cellSize

cellSizeRule が "AsSpecified" のときに、使用するセルサイズに設定します。

rasterRule

出力ラスタに含まれるデータ タイプ(整数または浮動小数)を決定します。

説明

"FirstDependency"

データ タイプ(整数または浮動小数)は、最初の従属パラメータと同じになります。最初の従属パラメータが複数値(値のリスト)の場合、複数値リストの最初の値が使用されます。

"Min"、"Max"

整数は浮動小数より小さいと見なされます。たとえば、2 つの従属パラメータがあり、一方は整数を含み、他方は浮動小数を含む場合、"Min" は整数の出力を作成し、"Max" は浮動小数の出力を作成します。

"Integer"

出力ラスタには整数(自然数)が含まれます。

"Float"

出力ラスタには浮動小数(有理数)が含まれます。

rasterRule の値

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 つのエントリであるタイプと名前だけが必須です。残りの引数はオプションです。

additionalChildren のメンバー リスト

複数の子を追加する場合、子の記述のリストを指定します。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

関連トピック

5/10/2014