ModelBuilderとユーザー入力を使用した属性による抽出?


11

ModelBuilderを使用して、シェープファイルの抽出に使用する値をユーザーが選択できるツールを作成します。

「Parcel_Type」フィールドを持つパーセルレイヤーがあります。ユーザーが抽出するパーセルのタイプを選択できるようにします。したがって、ユーザーがタイプ「EL」の区画を抽出する場合、変数として「EL」を入力するだけで済みます。「EL」と「CDD」を入力したい場合、それらを複数変数として入力する必要があります。それがモデルと人間との唯一の相互作用です。

モデルでこれらの変数を使用するにはどうすればよいですか?

回答:


14

このタイプの操作では、ほとんどの場合WHERE句を記述する必要があるため、少なくとも少しのPythonを使用することが適切だと思います。

また、ModelBuilder、IMOでこれを行うことができますがカスタム検証とパラメーター設定のより詳細な制御を備えたPython スクリプトツール作成すると、たとえば、Fieldおよび MultiValue *パラメータードロップダウンメニューを作成することにより、ユーザーエクスペリエンスが向上します値を入力する代わりに、値を選択できます。

*おそらく、実際にはMultiValueパラメーターについて不明

ただし、これは別のトピックのより高度な演習であるため、WHERE句を作成するためだけにPythonを使用するModelBuilderアプローチに固執します。

  1. 新しいモデルを作成する
  2. 入力Feature LayerField、およびMultiValueパラメーター用の変数を作成します(空のキャンバスを右クリックして[ 変数の追加 ] クリックします)。
  3. これらをそれぞれ右クリックして、[ モデルパラメーター ]を選択します。
  4. 計算(データ管理)ツールをキャンバスに追加します。前提条件として3つの変数を接続します(この場合は表示のためだけですが、他の状況では実行順序に違いが生じる可能性があります)。
  5. [値の計算]ツールをダブルクリックして設定します。

    5a。以下を[ 式]ボックスにコピーして貼り付けます(変数名に合わせて調整します)。

    buildWhereClauseMultiValue(r"%Feature Layer%","%Field%","%Values%")

    5b。以下をコードブロックボックスにコピーして貼り付けます。

    import arcpy
    
    def buildWhereClauseMultiValue(table, field, values):
        """Takes a semicolon-delimited list of values and constructs a SQL WHERE
        clause to select those values within a given field and table."""
    
        # Add DBMS-specific field delimiters
        fieldDelimited = arcpy.AddFieldDelimiters(arcpy.Describe(table).path, field)
    
        # Split multivalue at semicolons and strip quotes
        valueList = [value[1:-1] if (value.startswith("'") and value.endswith("'")) else value for value in values.split(';')]
    
        # Determine field type
        fieldType = arcpy.ListFields(table, field)[0].type
    
        # Add single-quotes for string field values
        if str(fieldType) == 'String':
            valueList = ["'%s'" % value for value in valueList]
    
        # Format WHERE clause in the form of an IN statement
        whereClause = "%s IN(%s)" % (fieldDelimited, ', '.join(valueList))
        return whereClause

    5c。出力データ型をSQL Expressionに設定します。

    5d。[OK]をクリックし、[値の計算]ツールから出力変数を右クリックして、「WHERE句」などのわかりやすい名前に変更します。

  6. 属性によるレイヤー選択(データ管理)ツールをキャンバスに追加します。フィーチャレイヤーとWHERE句の変数を[属性によるレイヤーの選択]ツールに接続します。
  7. コピー機能(データ管理)ツールをキャンバスに追加します。[属性によるレイヤーの選択]ツールの出力を[フィーチャのコピー]ツールに接続します。[ 出力フィーチャクラス ] 変数を右クリックして、[ モデルパラメーター]および(オプションで)[ 表示に追加]オプションを確認します。

    この時点で、次のようになります。 モデルキャンバス

  8. 下ではモデル - > [ モデルプロパティのメニューはそれを良い名前とラベルを付け、保存して閉じます。

  9. ArcToolboxでモデルをダブルクリックして、モデルダイアログを表示します。パラメータを入力し、[OK]をクリックします。選択したフィーチャを新しいフィーチャクラスにエクスポートし、マップに追加する必要があります(出力フィーチャクラスで[表示に追加]をオンにした場合)。

    モデルダイアログ

ノート:

  • フィーチャレイヤーやフィールドパラメーターのようにユーザーが変更したくない変数を「パラメーター化」せずに、常に値をハードコーディングできます。汎用/再利用可能なツールがあるのが好きなので、それらのモデルパラメータを作成しました。実際、私がすることは、単にジェネリックモデルを新しいモデルにドラッグアンドドロップし、定義済みのパラメーターを設定するだけです。この方法で、いくつかの異なる定義済みの「ラッパー」モデルを作成できます。機能を変更する必要がある場合は、1か所で変更するだけで済みます。

  • 私のように運が良ければ、モデル検証し、検証後に削除するためだけにダミーデータを提供する必要はありません(すべてのモデル要素が空白/白であることに注意してください。 -しかし、私はモデルダイアログのパラメータを入力するときにとにかくそれを実行することができました)。


3

GUIの要件が@ blah238で示された正確なダイアログにない場合は、Selectという1つの単純なジオプロセシングツールを使用してこのワークフローを実現することもできます。

[検索]ウィンドウを使用して検索するか、[ArcToolbox]> [分析ツール]> [抽出]> [選択]に移動します。

セレクト(分析)ツールを使用して、フィーチャクラスから任意のフィールド(属性)を使用して特徴を抽出することができます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.