スクリプトの確認とテスト

Python スクリプトを使用して、ArcGIS Pro のタスクを自動化できます。 作成したスクリプトは Python .py ファイルとして他のユーザーと共有できます。 一方で、他のユーザーが作成したスクリプトを使用する場合、処理対象のデータセットの名前を変更するだけでも、ある程度の Python の知識が必要になります。 Python スクリプトをより使いやすい形で共有するために、Python スクリプト ツールを作成できます。

Python スクリプト ツールを使用すれば、標準のジオプロセシング ツールのようなユーザー フレンドリーなインターフェイスで Python スクリプトを提供できます。 ユーザー入力を検証するコードやユーザーにメッセージを表示するコードを追加して、スクリプト ツールを標準のジオプロセシング ツールのように動作させることができます。 また、組み込みのサポート ドキュメントで、ツールの使用方法やパラメーターの設定方法を説明することもできます。

スクリプト ツールの作成により、Python スクリプトの機能を他のユーザーと共有しやすくなります。 Python スクリプトをカスタムのツールボックス ファイル (.atbx) に埋め込むこともでき、そうすれば共有がさらに簡単になります。

プロジェクトを開いてデータセットを確認

まず、このチュートリアルのデータをダウンロードし、既存のプロジェクトを開いて、ツールにより処理される予定のデータを確認します。

  1. このチュートリアル用の PythonTool.zip ファイルをダウンロードし、コンピューター上でこのファイルを探します。
    注意:

    ほとんどの Web ブラウザーでは、デフォルトでコンピューターの Downloads フォルダーにファイルがダウンロードされます。

  2. [PythonTool.zip] ファイルを右クリックして、C:\Tutorials\ フォルダーに解凍します。
    注意:

    コンピューター上にこのフォルダーがまだない場合は、フォルダーを作成して zip ファイルを解凍してください。 別の場所に解凍してもかまいませんが、説明やスクリプトではパスとして C:\Tutorials を使用します。 PythonTool フォルダーを別の場所に置いた場合、そのフォルダー パスを指定するようにスクリプトを更新する必要があります。

  3. ArcGIS Pro を起動して ArcGIS Online にサイン インします。
    注意:

    ArcGIS Pro へのアクセス権限または組織アカウントがない場合は、ソフトウェア アクセスのオプションをご参照ください

  4. ArcGIS Pro[別のプロジェクトを開く] をクリックします。

    別のプロジェクトを開くボタン

  5. [プロジェクトを開く] ウィンドウで、PythonTool フォルダーを参照し、[Python Tool.aprx] をクリックして、[OK] をクリックします。

    プロジェクトを開くウィンドウの PythonTool プロジェクト

    プロジェクトが開きます。

    ワシントン D.C. のマップを示すデフォルトのプロジェクト

    このマップには、ワシントン D.C. エリアのいくつかのフィーチャクラスが表示されます。

  6. [カタログ] ウィンドウがまだ表示されていない場合は、リボンの [表示] タブをクリックし、[カタログ ウィンドウ] をクリックします。
  7. [カタログ] ウィンドウで、[フォルダー][PythonTool] を展開します。
  8. [DC.gdb] ジオデータベースを展開します。

    カタログ ウィンドウの DC.gdb ジオデータベース

    このジオデータベースには 8 つのフィーチャクラスが格納されています。 その一部はマップ上のレイヤーです。 [PythonTool] フォルダーには、[neighborhood.shp] というシェープファイルがあり、これもマップ上のものです。

    たとえば、市役所で働いている人が、市内の特定の地域に関するデータ抽出依頼を定期的に受け取っているとします。 このタスクを実行するには、ジオデータベース内のすべてのフィーチャクラスを特定の地域にクリップして、クリップされたフィーチャクラスを新しいジオデータベースに保存する必要があります。 この新しいジオデータベースを ZIP アーカイブに圧縮すれば、簡単に共有したり、バックアップ目的に使用したりできます。

    こういったタスクを ArcGIS Pro で実行できます。そのためには、[ファイル ジオデータベースの作成] ツールを使用して新しいジオデータベースを作成し、[クリップ] ツールをフィーチャクラスごとに 1 回ずつ実行します。 その後、File Explorer か圧縮ユーティリティーを使用して ZIP アーカイブを作成できます。 このプロセスは、特に処理対象のフィーチャクラスが多い場合に複雑になり時間もかかります。

    このプロセスは定期的なタスクであるため、自動化するのが合理的です。 このタスクを自動化するスクリプトが、このプロジェクトに付属しています。 以下、このスタンドアロン スクリプトについて内容を確認してテストし、次にこのスクリプトに基づいて Python スクリプト ツールを作成します。

Python スクリプトの確認とテスト

まず、スクリプトを開いてその内容を確認します。

  1. File Explorer で、C:\Tutorials\PythonTool フォルダーを参照します。
  2. [clip_zip.py] Python スクリプト ファイルを右クリックして、[Edit with IDLE (ArcGIS Pro)] を選択します。

    Edit with IDLE (ArcGIS Pro) オプション

    注意:

    ArcGIS Desktop 10.x (ArcMap) もインストールされている場合、ショートカット メニューに [Edit with IDLE] ショートカットも表示されます。 正しいバージョンの Python が起動されないため、このショートカットを使用しないでください。

    Windows 11 で [Edit with IDLE (ArcGIS Pro)] オプションが表示されない場合は、[その他のオプションを表示] をクリックして、[Edit with IDLE (ArcGIS Pro)] を選択します。

    スクリプトが Python のデフォルト エディターである IDLE で開きます。

    IDLE のスクリプト

    スクリプトはインポートから始まります。

    import arcpy
    import os
    import zipfile

    これらの行では、スクリプトで使用されるモジュールをインポートします。

    ArcPy は、ジオプロセシング ツールと関連タスクを実行するために必要です。また、os モジュールはパスの操作、zipfile モジュールは ZIP アーカイブの作成のために必要となります。

    このスクリプトの次の部分では、ワークスペースと、入力および出力データセットのパスをセットアップします。 コメント以外のコードは次のようになります。

    arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb"
    clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp"  
    gdb = "C:/Tutorials/PythonTool/Clip.gdb"
    gdb_path, new_gdb = os.path.split(gdb)
    gdb = "C:/Tutorials/PythonTool/Clip.zip"
    arcpy.env.overwriteOutput = True

    ワークスペースは [DC.gdb] ジオデータベースに設定されます。このジオデータベースには、クリップする必要のあるフィーチャクラスが格納されています。 [neighborhood.shp] フィーチャクラスは、クリップ フィーチャとして使用されます。 [Clip.gdb] ジオデータベースはこのスクリプトにより作成され、[クリップ] ツールからの出力が格納されます。 ジオデータベースの完全なパスは os.path.split() を使用してフォルダー C:\Tutorials\PythonTool とジオデータベース名 Clip.gdb に分割されます。 これらはスクリプトの後の方で、別々の変数として必要になります。 ZIP アーカイブの [Clip.zip] には、ジオデータベース [Clip.gdb] のすべての内容が格納されます。

    すべてのデータセットが同じフォルダーにありますが、これはスクリプトが動作するための必要条件ではありません。 たとえば、新しいジオデータベースを別のフォルダーに作成することも可能です。

    スクリプトでは次に、新しいジオデータベースを作成します。 出力メッセージで、新しいジオデータベースが作成されたことを示します。

    arcpy.CreateFileGDB_management(gdb_path, new_gdb)
    print(f"Output geodatabase {gdb} created")

    次のセクションで、[クリップ] ツールを実行します。

    inputs = arcpy.ListFeatureClasses()
    for fc in inputs:
        fc_name = arcpy.da.Describe(fc)["baseName"]
        new_fc = os.path.join(gdb, fc_name)
        arcpy.analysis.Clip(fc, clip_fc, new_fc)
        print(f"Output feature class {new_fc} created")

    ListFeatureClasses() 関数は、ワークスペース内のすべてのフィーチャクラスを返します。このワークスペースは [DC.gdb] ジオデータベースのことです。 直後の for ループ内で、フィーチャクラスのベース名を取得します。 このベース名の取得は、このサンプルでは厳密には必要ありませんが、たとえば入力がシェープファイルであるときの .shp などのファイル拡張子が除去されるため、スクリプトのロバスト性が高まります。 出力フィーチャクラスの完全なパスが os.path.join() を使用して作成されます。 最終的にワークスペースではなく [Clip.gdb] ジオデータベースに出力を保存する必要があるため、このパスが必要になります。 [クリップ] ツールが実行され、新しいフィーチャクラスが作成されたことを示すメッセージが出力されます。 リスト内のすべてのフィーチャクラスに対してこれらの手順が繰り返されます。

    最後のセクションで、ZIP アーカイブを作成します。

    with zipfile.ZipFile(out_zip, "w") as myzip:
        for f in os.listdir(gdb):
            if not f.endswith(".lock"):
                file_name = os.path.join(gdb, f)
                arc_name = os.path.join(new_gdb, f)
                myzip.write(file_name, arc_name)

    新しい空の ZIP アーカイブが zipfile.ZipFile() を使用して作成されます。 ここでは with 文を使用してファイルを作成して開き、同時に、処理の完了時にそのファイルを閉じるようしています。 ジオデータベースの内容は os.listdir() を使用して決定します。この関数は、ジオデータベース フォルダー内のすべてのファイルのリストを返します。 ファイル拡張子 .lock のファイルはスキップされます。 残りのファイルを ZIP アーカイブに書き込みます。 変数 file_name は、元のジオデータベースにおける各ファイルの完全なパスを表します。 変数 arc_name は ZIP アーカイブに書き込む各ファイルを表していますが、ジオデータベースの名前とファイル名のみが含まれています。 これは、File Explorer での手動の ZIP アーカイブ作成方法を模しています。

    スクリプトを確認しましたので、次にテストの準備を行います。

  3. IDLE で、スクリプトの開始部分で使用されたパスを確認します。

    チュートリアル フォルダーを C:/Tutorials/PythonTool/ 以外の場所にコピーした場合、File Explorer を使用してそのデータのパスを取得する必要があります。

  4. このセクションの 4 つのパスを編集します。

    arcpy.env.workspace = "C:/Tutorials/PythonTool/DC.gdb"
    clip_fc = "C:/Tutorials/PythonTool/neighborhood.shp"  
    gdb = "C:/Tutorials/PythonTool/Clip.gdb"
    gdb_path, new_gdb = os.path.split(gdb)
    gdb = "C:/Tutorials/PythonTool/Clip.zip"
    arcpy.env.overwriteOutput = True

    注意:

    スクリプト内のパスでは、パス区切り文字としてスラッシュ文字 / が使用されています。 File Explorer でパスをコピーした場合、Windows のデフォルトのパス区切り文字である \ が使用されます。 スクリプト内ではすべてのバックスラッシュ文字をスラッシュに変更する必要があります。

    ハードコードされた完全なパスは、スクリプトの最初のセクションにのみ配置されており、ここでパスが変数に代入されます。 スクリプトの他の部分ではそれらの変数を使用します。 この最初のセクション以外で、完全なパスとファイル名が再び登場することはありません。 この方法により、変更される可能性のある記述の特定が容易になります。また、チュートリアルのこれ以降の手順で Python スクリプト ツールとして使用するためにスクリプトを編集する際にも役に立ちます。

  5. IDLE で、[File] をクリックしてから [Save] を選択し、スクリプトの変更を保存します。

    File メニューの Save オプション

  6. IDLE で、[Run] をクリックし、[Run Module] を選択してスクリプトを実行します。

    Run メニューの Run Module オプション

    スクリプトが実行されます。 IDLE Shell ウィンドウが表示され、スクリプトでのデータの処理中に進捗を示すメッセージが出力されます。

    出力メッセージ

    注意:

    パスを正しく修正していない場合は、エラー メッセージが表示されます。 たとえば、ワークスペースが誤って設定されている場合、inputs という名前のリストが空になり、スクリプトは次のエラーを返します。

    TypeError: ‘NoneType' object is not iterable

    また、ジオデータベース [Clip.gdb] のパスが誤っている場合、スクリプトは次のエラーを返します。

    ERROR 000732: File GDB Location: Dataset … does not exist or is not supported

    これらのエラーは、スクリプトを共有する上での課題を示しています。 スクリプト ツールの作成は、こういったタイプのエラーを防止する良い手段となります。

    スクリプトが問題なく実行された場合、ジオデータベースとクリップされたフィーチャクラスが作成されたことを示すメッセージが表示されます。 ArcGIS Pro および File Explorer を使用して作成されていることを確認します。

  7. ArcGIS Pro[カタログ] ウィンドウで、[PythonTool] フォルダーを右クリックし、[更新] を選択します。

    更新オプション

  8. [カタログ] ウィンドウで、[PythonTool] フォルダー内に [Clip.gdb] ジオデータベースが作成されたことを確認します。

    Clip.gdb ジオデータベース

  9. [Clip.gdb] ジオデータベースを展開します。

    クリップされたフィーチャクラス

  10. [Clip.gdb] ジオデータベースで、[bike_racks] を右クリックし、[現在のマップに追加] を選択します。

    現在のマップに追加オプション

    クリップされた新しい [bike_racks] レイヤーがマップに追加されます。 地域の境界にクリップされました。

    クリップされた bike_racks レイヤーが追加されたマップ

    このレイヤーは、スクリプトが機能したことを示しています。 この [bike_racks] レイヤーは削除できます。

  11. [コンテンツ] ウィンドウで、クリップされた [bike_racks] レイヤーを右クリックして [削除] を選択します。

    [Clip.gdb] も削除します。 このチュートリアルの後半で、スクリプト ツールを実行するときにこのジオデータベースを再作成します。

  12. [カタログ] ウィンドウで、[Clip.gdb] を右クリックして [削除] を選択します。
  13. File Explorer で、C:\Tutorials\PythonTool フォルダーを参照します。

    [Clip.zip] ファイルがこのフォルダーに追加されています。

    Clip.zip ファイル

    後で、同様にスクリプト ツールを使用して「.zip」ファイルを再度作成します。 これは削除してもかまいません。

  14. [Clip.zip] を右クリックし、[削除] を選択します。

このスタンドアロン スクリプトは意図したとおりに動作します。 このスクリプトを異なるデータセットに対して使用する場合は、このスクリプトを開いてパスを修正します。 この作業は、Python スクリプトに詳しくないユーザーにとっては、あまりユーザー フレンドリーではありません。 また、スクリプト内のパスを誤って修正する可能性も大いにあります。 次に、ユーザーフレンドリーなインターフェイスを伴う Python スクリプト ツールを開発します。


ツールの作成とパラメーターの追加

プロセスの次の段階は、スクリプト ツールの作成とそのパラメーターの構成を行い、ツールのユーザー インターフェイスを設定することです。

ツールボックスとスクリプト ツールの作成

Python スクリプト ツールは ArcGIS Pro で作成されます。 それらはカスタム ツールボックスに格納されます。 次に、プロジェクトでカスタム ツールボックスを作成し、スクリプト ツールをそこに追加します。

  1. ArcGIS Pro[カタログ] ウィンドウで、[PythonTool] フォルダーを右クリックし、[新規作成] をポイントして、[ツールボックス (.atbx)] を選択します。

    ツールボックス (.atbx) オプション

    ツールボックスが作成される。

    新しいツールボックス

  2. ツールボックス名として「Clip_and_ZIP」と入力し、Enter キーを押します。

    ツールボックス名を Clip_and_ZIP に設定

    ツールボックスの名前が変更されます。

    注意:

    以前のバージョンの ArcGIS Pro では、.tbx 形式が使用されていました。 この形式での以前のツールボックスは引き続き使用できますが、ツールボックスを作成するときは、ArcGIS Pro 3.0 以降の .atbx 形式を使用する必要があります。

  3. [Clip_and_ZIP] ツールボックスを右クリックし、[新規] をポイントして、[スクリプト] を選択します。

    スクリプト オプション

    [新しいスクリプト] ウィンドウが表示されます。

    新しいスクリプト ウィンドウ

    このウィンドウを使用して、ツールの一般プロパティの設定、ツール パラメーターの構成、実行コードの入力、検証コードの追加を行います。 これからこのチュートリアルで、これらすべての手順を完了します。 次は、スクリプト ツールの名前、ラベル、説明を指定します。

  4. [名前] に「ClipandZIP」と入力します。

    ツールの名前は、そのツールによって使用される、内部の一意の識別名です。 名前に使用できるのは文字と数字のみです。 スペースと特殊文字は使用できません。

  5. [ラベル] に「Clip and ZIP」と入力します。

    ツールのラベルは、ツールボックス内のツールのわかりやすい名前で、ツールをツール ダイアログ ボックスで開くときに表示されます。 ラベルには、スペースと特殊文字を入れることができます。

    次のパラメーターである [ツールボックス] は、スクリプト ツールの場所です。 ツールボックスのパスと名前は .atbx ファイルの場所に基づいて表示され、このウィンドウでは変更できません。 スクリプト ツールは個別のファイルではなく、.atbx ファイルの一部であるという認識を持つことが重要です。

  6. [説明] ボックスに、「This script tool allows you to select multiple feature layers or feature classes and clip them using one or more polygon features. The results are stored in a new geodatabase and a ZIP archive of this new geodatabase is created for easy sharing or backup.」と入力します。

    名前、ラベル、説明のパラメーター

  7. [OK] をクリックします。

    入力した一般プロパティにより、スクリプト ツールが作成されます。

  8. [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。

    Clip and ZIP ツール

    スクリプト ツールが [ジオプロセシング] ウィンドウで開きます。 ジオプロセシング ツールの初期フレームワークがありますが、ほとんどは空のままです。

    Clip and ZIP スクリプト ツールのユーザー インターフェイスにパラメーターが設定されていない状態

  9. ツールを閉じます。

入力フィーチャ レイヤー パラメーターの追加

ツール パラメーターの入念な構成は、Python スクリプト ツールの作成における重要な部分です。 ツール パラメーターは、そのツールのユーザー インターフェイスを定義し、ツールのユーザーがスクリプトによって処理されるデータやその他の値を入力できるようにします。

最初に、入力フィーチャ レイヤー パラメーターを追加します。

  1. [Clip and ZIP] ツールを右クリックして、[プロパティ] を選択します。

    プロパティのオプション

    [ツール プロパティ: Clip and ZIP] ウィンドウが表示されます。 以前に [一般] タブに入力した内容が表示されます。

  2. [パラメーター] タブをクリックします。

    パラメーター タブ

    このタブでツール パラメーターを構成します。 ツール パラメーターはテーブルに整理され、1 行に 1 つのパラメーターが表示されます。列は各パラメーターのプロパティです。

    空のテーブルを含む、パラメーター タブ

    このテーブルを使用して、以下のパラメーターを作成します:

    • [入力フィーチャ レイヤー] - ユーザーはアクティブなマップで任意のフィーチャ レイヤーを選択するか、ディスク上の任意のフィーチャクラスを参照することができます。
    • [クリップ ポリゴン] - ユーザーはポリゴン フィーチャ レイヤーを選択するか、ディスク上のポリゴン フィーチャクラスを参照するか、ポリゴンで構成されているアクティブなマップでフィーチャ セットを作成することができます。
    • [出力ジオデータベース] - ユーザーは結果を格納する新しいジオデータベースのパスとファイル名を指定できます。
    • [出力 ZIP アーカイブ] - ユーザーはジオデータベースのコンテンツとともに作成される ZIP アーカイブのパスとファイル名を指定できます。
  3. [ラベル] 列に「Input feature layers」と入力し、Enter キーを押します。

    Label フィールド

    パラメーターのラベルは、そのパラメーターに付けられた、人間が判読できるラベルであり、ツール ウィンドウに表示されます。 パラメーターの名前はラベルから自動入力され、スペースはアンダースコアで置き換えられます。 パラメーターの名前はスクリプト ツールによって内部で使用され、Python スクリプトでツール パラメーターを設定するときに使用されます。

  4. [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。

    データ タイプの変更ボタン

    [パラメーターのデータ タイプ] ウィンドウが表示されます。 デフォルト値は [String] ですが、これを [フィーチャ レイヤー] に変更します。

  5. データ タイプ ドロップダウン リストをクリックし、「F」セクションまでスクロールして、[フィーチャ レイヤー] を選択します。

    [フィーチャ レイヤー] オプション

    データ タイプを [フィーチャ レイヤー] に設定することで、ユーザーはツールのドロップダウン リストを使用してアクティブなマップのフィーチャ レイヤーを選択するか、ディスク上のフィーチャクラスを参照することができます。

    ツールで複数の入力フィーチャ レイヤーを使用できるようにします。

  6. [複数値] をオンにします。

    複数値オプション

    [複数値] をオンにすると、ユーザーがツールのこのパラメーターで 1 つまたは複数の入力を選択できるようになります。 フィーチャ レイヤーとフィーチャクラスの組み合わせも可能です。

  7. [OK] をクリックして、[パラメーターのデータ タイプ] ウィンドウを閉じます。

    フィーチャ レイヤー データ タイプ

  8. [タイプ] の値が [必須] に設定されていることを確認します。

    パラメーターを [必須] にすると、そのパラメーターの設定なしではツールを実行できません。

  9. [方向] の値が [入力] に設定されていることを確認します。

    パラメーターの方向を [入力] にすると、これが処理対象の入力レイヤーまたは値の 1 つであることをツールに対して指示することになります。 また、ModelBuilder でこのツールを使用し、フィーチャ レイヤーを入力としてツールに接続できます。

    1 つ目のパラメーターはこれで完了です。 この 1 つのパラメーターを設定した状態でスクリプト ツールがどう見えるかをすぐに確認できます。

  10. [ツールのプロパティ] ウィンドウで [OK] をクリックします。
  11. [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。

    スクリプト ツールが [ジオプロセシング] ウィンドウで開きます。 1 つ目のパラメーターが表示されるようになっています。 アクティブなマップからフィーチャ レイヤーを選択するためのドロップダウン リストと、ディスク上のフィーチャクラスを参照するための参照ボタンがあります。 パラメーターのラベルの前にある赤いアスタリスクは、これが必須パラメーターであることを示しています。

    Clip and ZIP ツール ウィンドウで 1 つ目のパラメーターが構成されている状態

    この段階では、ツール パラメーターを構成し、ツールのユーザー インターフェイスを確認してパラメーターが正常に表示されるかどうかをテストしています。 Python コードが追加されていないため、ツールが正常に実行され機能するかどうかをテストすることはまだできません。

    注意:

    入力フィーチャ レイヤーを少なくとも 1 つ選択してツールを実行すると、エラー メッセージが表示されます。

  12. ツールを閉じます。

クリップ ポリゴン パラメーターの追加

次に、クリップ ポリゴンのパラメーターを構成します。

  1. [Clip and ZIP] ツールを右クリックして、[プロパティ] を選択します。
  2. [パラメーター] タブで、テーブルの 2 行目の [ラベル] 列をクリックします。 「Clip Polygons」と入力し、Enter を押します。

    クリップ ポリゴン ラベル

    パラメーターの [名前][Clip_Polygons] に更新されます。

  3. [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
  4. [データ タイプ] で、[フィーチャ セット] を選択します。

    フィーチャ セット オプション

    フィーチャ セットはフィーチャクラスの軽量リプレゼンテーションです。 ジオプロセシング ツールでは、フィーチャ セットによって対話型入力を使用できます。 ユーザーは [フィーチャ作成] ウィンドウを使用して編集中にフィーチャを作成するときと同様に、マップ上で描画してフィーチャを作成できます。 また、アクティブなマップからフィーチャ レイヤーを選択したり、ディスク上のフィーチャクラスを参照したりすることもできます。

  5. [OK] をクリックします。
  6. [タイプ] の値が [必須] に設定されていることを確認します。 [方向] の値が [入力] に設定されていることを確認します。

    次に、このパラメーターにフィルターを設定し、ツールの [クリップ ポリゴン] パラメーターで入力としてポリゴン フィーチャのみを使用できるようにします。

  7. 右にスクロールし、[フィルター] 列をクリックします。

    フィルター列

  8. [フィルター] ドロップダウン リストをクリックし、[フィーチャ タイプ] を選択します。

    フィーチャ タイプ オプション

    [フィーチャ タイプ フィルター] ウィンドウが表示されます。

  9. [ポリゴン] をオンにします。

    ポリゴン オプション

    これで、ツールを実行すると、入力クリップ ジオメトリーにポリゴンのみを使用できます。

  10. [フィーチャ タイプ フィルター] ウィンドウで [OK] をクリックします。

    これで、[クリップ ポリゴン] パラメーターを構成しました。

出力ジオデータベース パラメーターの追加

次に、出力ジオデータベースのパラメーターを構成します。

  1. [パラメーター] タブで、テーブルの 3 行目の [ラベル] 列をクリックします。 「Output geodatabase」と入力し、Enter を押します。
  2. [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
  3. [データ タイプ] で、[ワークスペース] を選択します。

    ワークスペース データ タイプ

  4. [OK] をクリックします。
  5. [タイプ] の値が [必須] に設定されていることを確認します。
  6. [方向] 列をクリックして、[出力] を選択します。

    出力オプション

    方向を [出力] にすることで、これが、生成される出力の 1 つであることをツールに指示します。 また、ModelBuilder でこのツールを使用し、ツールの出力アイテムを生成できます。

  7. [フィルター] 列をクリックし、[ワークスペース] を選択します。

    ワークスペース オプション

  8. [ワークスペース フィルター] ウィンドウで、[ローカル データベース] をオンにします。

    ローカル データベース オプション

    フィルターを [ローカル データベース] に設定すると、ユーザーは出力としてファイル ジオデータベースのみを指定でき、エンタープライズ ジオデータベースまたはフォルダーは指定できなくなります。

  9. [OK] をクリックします。

    これで、[出力ジオデータベース] パラメーターを構成しました。

出力 ZIP アーカイブ パラメーターの追加

次に、出力 ZIP アーカイブのパラメーターを構成します。

  1. [パラメーター] タブで、テーブルの 4 行目の [ラベル] 列をクリックします。 「Output ZIP archive」と入力し、Enter を押します。
  2. [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
  3. [データ タイプ] で、[ファイル] を選択します。

    ファイル オプション

    ZIP アーカイブはファイルであるため、これは適切なデータ タイプです。

  4. [OK] をクリックします。
  5. [方向] 列をクリックして、[出力] を選択します。
  6. [フィルター] 列をクリックして、[ファイル] を選択します。

    フィルター列のファイル オプション

  7. [ファイル フィルター] ウィンドウの [エクステンション] ボックスに「zip」と入力します。

    ファイル フィルター ウィンドウ

    ファイル拡張子は、ファイル名の本体と拡張子を区切るドットを含めず、文字のみとする必要があります。 「.zip」とは入力しないでください。 ファイル拡張子では、大文字と小文字が区別されません。

  8. [OK] をクリックします。

    これで、ツールのすべてのパラメーターを追加しました。

    すべてのツール パラメーター

  9. [ツールのプロパティ] ウィンドウで [OK] をクリックします。

パラメーターのテスト

すべてのツール パラメーターを作成したので、ツール ウィンドウをテストして、各パラメーターの設定が意図したとおりに機能することを確認します。

  1. [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。

    [Clip and ZIP] ツールが開きます。 前の手順で構成したすべてのパラメーターがツール ウィンドウに表示されるようになっています。

    Clip and ZIP ツールとすべてのパラメーター

  2. [Input feature layers] で、[bike_racks] を選択します。

    ツールに bike_racks レイヤーが追加される

    [Input feature layers] の 2 つ目のボックスが [bike_racks] のボックスの下に表示されます。このツール パラメーターでは複数の値を使用できるためです。

  3. [Input feature layers][参照] ボタンをクリックします。
  4. [DC.gdb] ジオデータベースを参照します。 [bike_routes] をクリックして、[OK] をクリックします。

    DC.gdb ジオデータベースの bike_routes フィーチャクラス

    [bike_routes] フィーチャクラスはマップ上にありませんでしたが、[Clip_and_ZIP] ツールにこれを追加しました。

    ツールの bike_routes フィーチャクラス

    これで、アクティブなマップのフィーチャ レイヤーやディスク上のフィーチャクラスを含め、ユーザーが複数の入力を選択できることを確認しました。

  5. [クリップ ポリゴン] スケッチ ツールをクリックします。

    クリップ ポリゴン スケッチ ツール

    フィーチャ セットのスケッチ入力はポリゴン フィーチャのみに制限されています。これにより、ポイントまたはライン フィーチャを使用したクリップを試行できないようにしています。 次に、出力をテストします。

  6. [Output geodatabase] ボックスに「C:\Tutorials\PythonTool\Clip」と入力します。 [Output ZIP archive] テキスト ボックスをクリックします。

    エラーのある、出力ジオデータベース パラメーター

    フォルダーのパスを入力すると、[Output geodatabase] パラメーターにエラー通知アイコンが表示されます。

  7. エラー通知アイコンにポイントします。

    エラー メッセージ

    指定した場所にジオデータベースが存在しない、またはワークスペース タイプが間違っていることを示すエラー メッセージが表示されます。 また、不適切なファイル拡張子 (例: .fdb) を入力すると、自動的に .gdb に変更されます。 最後のパラメーターで同様の検証が実行されます。

  8. [Output ZIP archive] ボックスに「C:\Tutorials\PythonTool\Clip」と入力します。 [Output geodatabase] テキスト ボックスをクリックします。

    ツールによってファイル拡張子 .zip が「Clip」に追加されます。

    出力 ZIP アーカイブ パラメーターの zip 接尾辞

  9. [Output ZIP archive] ボックスに「C:\Tutorials\PythonTool\Clip.zipped」と入力します。 [Output geodatabase] ボックスをクリックします。

    不適切なファイル拡張子で終わるパスを入力すると、[Output ZIP archive] パラメーターにエラー通知アイコンが表示されます。

  10. エラー通知アイコンにポイントします。

    入力が不適切なファイル タイプであることを示すエラー メッセージ

    このエラー メッセージは、これが不適切なファイル タイプであることを示しています。

  11. ツールを閉じます。

    テストによって、構成したフィルターやその他のパラメーター設定が機能していることがわかります。 パラメーターを入念に設計することで、ユーザーが無効な値でツールを実行できなくなるため、ツールの堅牢性が高まります。

    パラメーターのテストは完了しまたが、ツールを実行する準備はまだできていません。コードを追加していないためです。

実行コードの編集

Python スクリプト ツールの実行コードは Python コードです。ユーザーが [ジオプロセシング] ウィンドウで [実行] をクリックすると、このコードが実行されます。 以前に確認したスタンドアロン スクリプトを使用しますが、少し変更を加える必要があります。ツール ウィンドウでユーザーが入力したパラメーターをスクリプトが取得できるようにします。

  1. [Clip and ZIP] ツールを右クリックして、[プロパティ] を選択します。
  2. [実行] タブをクリックします。

    実行タブ

    タブにスクリプト ツールの Python コード テンプレートが表示されます。

    Python コード テンプレート

    初期コードには、スクリプトのドキュメントとして複数行のコメント プレースホルダーがあります。 Python では、3 つの引用符で複数行のコメントの始まりと終わりを示します。 コメント内に入力したテキストは Python によって実行されません。

    コメントの後のコード 1 行目は import arcpy です。 ほとんどのジオプロセシング ツール スクリプトが ArcPy を使用するため、これがテンプレートに含まれています。

    次に、script_tool() という関数が定義されています。 関数は、def のキーワードの後に関数の名前と関数の引数を付けて作成されます。 テンプレート関数の名前をこのツールに合わせて変更します。

    テンプレート関数は 2 つのパラメーターを指定していますが、このツールではさらに必要であるため、この点も変更します。 スクリプト ツールの実行コードはこの関数内で機能します。 関数テンプレート ブロックの最後に、return ステートメントがあります。 これが関数の終わりで、結果を返します。

    コードの最後のセクションは if __name__ == '__main__': で始まります。 これは条件ステートメントであり、その後にインデントされたコード ブロックは、条件が True で評価された場合のみ実行されます。 あらゆるスクリプトの変数 __name__ (両側に 2 つのアンダースコア) の値は、'__main__' です。

    コードをスクリプトとして実行 (スクリプト ツールを実行する場合も該当) すると、インデントされたコード ブロックが実行されます。 ただし、インポートしたモジュールでは、変数がモジュール名に設定されています。 その場合、インデントされたコード ブロックは実行されません。 このコード構造によって、コードをスクリプトとして実行する操作と、別のスクリプトにモジュールとしてインポートする操作を区別できます。 ここでは、このシナリオは当てはまりません。 スクリプト ツールを作成するという目的では、スクリプト ツールを実行するとインデントされたコード ブロックが実行されることを理解していれば十分です。 コード ブロックは ArcPy 関数 GetParameterAsText() を使用してパラメーターを取得し、さらにパラメーターで関数 ScriptTool() を呼び出します。

    このテンプレートは param0 と param1 という 2 つのパラメーターを使用します。 これらは一時的なプレースホルダーであり、スクリプトに合わせてパラメーターを編集します。

    注意:

    次の手順で、実行コードの変更を開始します。 重要なのは、コードがどこに格納されているかを理解することです。 デフォルトでは、Python コードは埋め込まれています。 つまり、これは [.atbx] ツールボックス ファイルの一部であり、別個に格納されているわけではありません。 ただし、編集しやすいようにコードを [.py] ファイルにエクスポートし、後でコードを埋め込むことは可能です。 コードに少しずつ変更を加え、このワークフローを実行します。

    次に、関数 script_tool() の名前をより意味のあるものに変更します。 まず、ツール プロパティ ウィンドウで直接、埋め込みコードを編集します。

  3. [実行] タブのコード ボックスで、def script_tool(param0, param1): という行を編集して def ClipZip(param0, param1): になるようにします。

    この行は次の画像のようになります:

    関数名の行

    ツール プロパティ ウィンドウでコードを変更すると、変更したコード行の前に黄色のマーカーが付きます。

  4. コード ボックスで、script_tool(param0, param1) という行を編集して ClipZip(param0, param1) になるようにします。

    関数を呼び出す場所での名前

    これで、スクリプト ツール テンプレートに表示される両方の場所で関数名を更新しました。 コードを編集するにはこの方法が便利ですが、コード ボックスの機能は一般的な Python エディターと比べて制限されます。 次に、Python エディターで実行コードを編集する 2 つの方法を確認します。

  5. [実行] タブで、[OK] をクリックします。

    OK ボタン

    埋め込みコードに対する変更は自動的に保存され、ツール プロパティ ウィンドウを閉じると黄色のマーカーは消えます。

  6. [Clip and ZIP] ツールを右クリックして、[プロパティ] を選択します。
  7. コード ボックスの下部にある [スクリプト エディターで開く] ボタンをクリックします。

    スクリプト エディターで開くボタン

    一時スクリプト ファイルがデフォルトの Python エディターで開きます。 別のエディターを構成していない限り、スクリプトは [IDLE] で開きます。

    一時スクリプト ファイルが IDLE で開く

    スクリプト ボックスで行った編集内容がスクリプトに反映されています。

    注意:

    Python エディターの構成を、[プロジェクト] タブで行うことができます。 [プロジェクト] タブをクリックし、[オプション] をクリックして、左のウィンドウで [ジオプロセシング] をクリックします。 [スクリプト エディター] オプションはデフォルトで空白になっており、これは IDLE が使用されることを意味します。 パスを指定して、お好みのエディターに変更できます。 このチュートリアルでは、IDLE で十分です。

    パスは C:\Users\UserName\AppData\Local\Temp\1\ArcGISProTemp19512\ のようになります。

    ファイル名は、tmp という文字に続いて、英数字コード、.py ファイル拡張子で構成されます。 コードに変更を加えて .py ファイルを保存すると、これらの変更が埋め込みの実行コード ブロックに追加されます。 このワークフローを実行します。

  8. IDLE で、import arcpy の下に新規のコード行を追加し、以下のコードを追加します:

    import os
    import zipfile

    2 つの import 行

    これらの 2 つのモジュールは元のスタンドアロン スクリプトで使用されています。 スクリプトからコピーして貼り付けるか、コードを入力することができます。

  9. [File] をクリックし、[Save] を選択します。

    File メニューの Save オプション

  10. [IDLE] を閉じます。

    IDLE で追加したコードがコード ボックスに表示されるようになる。

    コード ボックスの新規コード

別のファイルへのスクリプトの保存

これまでに記述したコードはツールボックスに埋め込まれています。 お好みの Python エディターで使用できるように、コードを .py ファイルにエクスポートします。

  1. [実行] タブで、スクリプト ボックスの上にある [スクリプトをファイルにエクスポート] ボタンの緑色の矢印をクリックします。

    スクリプトをファイルにエクスポート ボタン

  2. [スクリプトのエクスポート] ウィンドウで、場所が [PythonTool] フォルダーになっていることを確認します。 [名前] に「clip_zip_tool.py」と入力します。

    Name オプション

    注意:

    含まれるコードのほとんどを移動して更新する必要がある、元のスクリプトは、[clip_zip.py] という名前になっています。 元のファイルを上書きしないよう、異なる名前を必ず使用します。

  3. [保存] をクリックします。

    これで、スクリプト ボックスから外部の Python スクリプト ファイルにコードをエクスポートし、ツールボックスにこのコードが格納された状態ではなくなりました。 ボックスの上部にスクリプト ファイルのパスが表示されています。

    コード ボックスでの .py スクリプト ファイルのパス

    別の .py ファイルを使用するメリットは、お好みのエディターでコードをより容易に記述できるようになる点です。 ただし、このチュートリアルでは、引き続き IDLE を使用します。

    ツール プロパティ ウィンドウに表示されているコードは埋め込みコードではなくなり、.py ファイルのコードになりました。 ただし、コードの編集を引き続きツール プロパティ ウィンドウで直接行うことは可能です。ツール プロパティ ウィンドウを閉じると、.py ファイルは自動的に保存されます。

    このチュートリアルでは、これ以降の大部分で、.py ファイルをツール プロパティ ウィンドウで編集するのではなく、IDLE で開きます。

  4. コード ボックスの下部にある [スクリプト エディターで開く] ボタンをクリックします。

    .py ファイルが IDLE で開きます。

    IDLE のスクリプト

    ファイル名とパスが一時的なものではなくなっています。

    注意:

    .py スクリプト ファイルのコードを [実行] タブのコード ボックスと IDLE で同時に編集することは可能です。 ただし、推奨される最良の方法ではありません。 警告メッセージが表示され、どちらの変更を保持するかを決定する必要があります。 これを回避するには、一度に 1 つのアプリケーションでのみスクリプトを編集します。

    これでコードを .py ファイルにエクスポートしたので、このウィンドウを閉じます。

  5. [プロパティ] ウィンドウで [OK] をクリックします。

    OK ボタン

    次に、スクリプト ツールのパラメーターに合わせてコードを変更します。

  6. IDLE で、if __name__ == "__main__": という行の後にある、param0param1 から始まる 2 つのパラメーター行を以下のコードに置き換えます:

        inputs = arcpy.GetParameter(0)
        clip_fc = arcpy.GetParameterAsText(1)
        gdb = arcpy.GetParameterAsText(2)
        out_zip = arcpy.GetParameterAsText(3)

    デフォルトのテンプレート パラメーター

    更新されたコードは、次の画像のようになります:

    更新されたパラメーター

    注意:

    新しい行のインデントが元のインデント レベル (4 つのスペース) と一致していることが重要です。

    スクリプト ツールの 4 つのパラメーターを設定しました。 Python スクリプトはこのようにして 4 つのパラメーターを取得します。

    スクリプト ツールからのパラメーターの取得は、ArcPy 関数である GetParameter()GetParameterAsText() を使用して行うことができます。 ツールのユーザー インターフェイスはパラメーターを Python タプルとしてスクリプトに渡します。これは、ゼロベースのインデックス付けを使用するシーケンス データ タイプです。 1 つ目のパラメーターのインデックスは 0、2 つ目のパラメーターのインデックスは 1 となります (以下同様です)。 これらのインデックス値は、それぞれの新しい行の最後の括弧で囲まれた数字で参照されます。 これらの数字の順序がツール ユーザー インターフェイスのパラメーターの順序と一致しない場合、スクリプトは不適切なデータ値を取得することになります。

    注意:

    ArcGIS Pro 3.2 以降では、パラメーターを名前で参照することもできます。 たとえば、arcpy.GetParameter(0) を使用する代わりに、arcpy.GetParameter("Input_feature_layers") を使用できます。 このようにすることで、任意の順序でパラメーターを入力でき、各パラメーターのインデックスを把握する必要がありません。

    1 つ目のパラメーターは、複数の入力フィーチャクラス名を含む可能性のある Python リストで構成されています。 関数 GetParameter() はこの形式を維持しているため、この関数は 1 つ目のパラメーターに使用されます。 他のパラメーターは GetParameterAsText() を使用してテキストとして取得されます。

    パラメーター値はそれぞれ 1 つの変数に割り当てられます。 変数は ClipZip 関数に渡されます。 変数名は、既存のスタンドアロン スクリプトのコードと整合するように選択されます。

  7. ClipZip(param0, param1) という行を編集し、param0, param1 をパラメーター値を含む変数に置き換えます。

    ClipZip(inputs, clip_fc, gdb, out_zip)

    ClipZip 関数を呼び出す行

    変更後は次の画像のようになります:

    パラメーターを含む ClipZip 関数

    この行は、これらのパラメーターで ClipZip() 関数を呼び出します。

  8. arcpy.SetParameterAsText(2, "Result") の行を削除します。

    SetParameterAsText の行

    このスクリプト ツールでは、テンプレートのこの行を使用しません。 次に、ClipZip() 関数の定義を更新します。

  9. def ClipZip(param0, param1): という行を編集し、param0, param1 をパラメーター値を含む変数に置き換えます。

    def ClipZip(inputs, clip_fc, gdb, out_zip):

    def ClipZip の行

    変更後は次の画像のようになります:

    新しいパラメーターを含む関数定義

    これで、ClipZip() 関数が 4 つのパラメーターを取得するように定義しました。

    変数の順序が同じである限り、関数定義の変数で [パラメーター] タブと同じ名前を使用する必要はありません。 関数の定義の行の変数名は、その関数が何をするかを定義するコード ブロックの変数 (この時点ではまだ追加していません) と整合している必要があります。

  10. IDLE で、[File] をクリックして [Save] を選択します。

    [IDLE] で加えた変更がスクリプト ファイルに保存されます。 このスクリプトは次の画像のようになります:

    これまでのスクリプトの記述内容

元のスクリプトからのコードのコピー

次に、元のスクリプトのコードを、コード ブロックに追加します。 元のスクリプトに、スクリプト ツールのコード ブロックに追加するコードが入っています。

  1. IDLE で、[File] をクリックして [Open] を選択します。

    File メニューの Open オプション

  2. C:\Tutorials\PythonTool フォルダーで、[clip_zip.py] をクリックします。 [開く] をクリックします。

    開くボタン

  3. IDLE で、[clip_zip.py] スクリプトの # Workspace and datasets という行の先頭をクリックしてからスクリプトの最後までドラッグし、import 行以外のすべてのコードを選択します。

    スクリプトのほとんどを選択した状態

  4. 選択したコードを右クリックして、[Copy] を選択します。

    コピー オプション

  5. IDLE で、[clip_zip_tool.py] ウィンドウに切り替えます。
  6. """Script code goes below""" というコメントを選択します。

    コメント行

  7. 選択したコードを右クリックして、[Paste] を選択します。

    貼り付けオプション

    コードが [ClipZip] 関数のコード ブロックに貼り付けられます。

    関数定義のコード ブロック内のコード

    元のスクリプトでの作業が完了しました。

  8. [clip_zip.py] スクリプト ウィンドウを閉じます。

    [clip_zip_tool.py] スクリプトにコピーしたコード ブロック全体が関数の一部となるように、スペース 4 つ分インデントする必要があります。 それぞれの行の前に手作業で 4 つのスペースを入力してインデントすることができますが、インデントする行を選択してまとめてインデントすることも可能です。

    Python ではインデントされた空白が重要であるため、この場合はまとめて操作するのが最適です。 誤って 3 つまたは 5 つのスペースを行に追加してしまった場合、コードは正常に実行されません。 また、コードは複数行にわたり、ループと条件のセクションがインデントされているため、インデントを手作業で追加すると間違いが生じやすくなります。

  9. [clip_zip_tool.py] ウィンドウで、貼り付けただけでまだ 4 つのスペースでインデントしていないコードを、コード ブロックのコンテンツに合わせるために、ドラッグして選択します。 return 行より前で選択を終えてください。

    # Workspace and datasets 行がインデントされているかどうかは、コードに貼り付けたときに、"""Script code goes below""" というコメントの前のスペースが選択されていたかどうかによって異なります。

    インデントする行

  10. [Format] をクリックし、[Indent Region] を選択します。

    Format メニューの Indent Region オプション

    それぞれのコード行がさらに 4 つのスペースでインデントされます。

    インデントされたコード ブロック

  11. ClipZip 関数のコード ブロック (def ClipZip の行より後の行から return 行まで) が 4 つ (ループまたは条件ステートメントの行では 5 つ以上) のスペースで完全にインデントされていることを確認します。
  12. [File] をクリックし、[Save] を選択します。

ハードコーディングされた値の削除

元のスクリプトでは、数行で特定のパスへの変数が設定されています。これは、パスのハードコーディングとして知られています。 これは、スクリプトがデータを特定して処理するために必要とされていました。 しかし、スクリプト ツールでは、ツールのユーザーがツール ユーザー インターフェイスのコントロールを使用して入力および出力を指定します。 arcpy.GetParameter および arcpy.GetParameterAsText を使用して、この情報をツール ユーザー インターフェイスから取得するように、スクリプトを設定しました。 次に、ハードコーディングされた行を削除します。

  1. ハードコーディングされたパスを指定している行をそれぞれ削除します。

    これらの行は、arcpy.env.workspace = clip_fc = gdb =、および out_zip = から始まっています。

    パスがハードコーディングされている行

  2. arcpy.env.overwriteOutput = True の行を削除します。

    この行をそのままにする必要はありません。コードがスクリプト ツールとして実行されるとき、overwriteOutput プロパティは ArcGIS Pro によって制御されるためです。

  3. gdb 変数の値を分割して変数 gdb_path および new_gdb に値を割り当てるコード行はそのままにします。

    ジオデータベースのパスを分割する行

  4. 行が 4 つのスペースでインデントされ、# Workspace and datasets というコメントと同じレベルになっていることを確認します。

    これで、ハードコーディングされた値を持つコード行をすべて削除しました。 スクリプトは、スクリプト ツールのパラメーターから値を取得します。

  5. スクリプトを保存します。

print ステートメントからメッセージへの変更

元のスクリプトでは、print ステートメントを使用してステータスを [IDLE Shell] ウィンドウに出力していました。 これが機能するのは、スクリプト エディターからスクリプトを実行する場合のみです。 print ステートメントを編集し、arcpy.AddMessage を使用してこの情報をジオプロセシング メッセージに送信するようにします。

print ステートメントは 3 つあります。 そのうち 2 つを変更し、残りの 1 つを削除します。

  1. print(f"Output geodatabase {gdb} created") 行を編集し、print から arcpy.AddMessage に変更します。

    この行は次のようになります:

    arcpy.AddMessage(f"Output geodatabase {gdb} created")

    print の代わりに arcpy.AddMessage が使用されている行

    コード内の次の print ステートメントは、入力フィーチャクラスのリストを出力します。 inputs 変数フィーチャクラス リストはスクリプト ツールによって設定されるため、arcpy.ListFeatureClasses を使用して入力を設定する行は不要です。 この print ステートメントと、リストを作成する行を削除します。

  2. # Clip each input feature class セクションで、inputs = arcpy.ListFeatureClasses() の行と print(inputs) の行を選択します。 両方の行を削除します。

    削除する行

    このセクションは次の画像のようになります:

    行の削除後のコード

    次に、3 つ目の print ステートメントを編集します。

  3. print(f"Output feature class {new_fc} created") 行を編集し、print から arcpy.AddMessage に変更します。

    この行は次のようになります:

    arcpy.AddMessage(f"Output feature class {new_fc} created")

    arcpy.AddMessage が使用されている、3 つ目の print ステートメント

  4. [File] をクリックし、[Save] を選択します。

    ZIP ファイルを作成する最後のコード セクションでは、変更は不要です。

  5. [IDLE] を閉じます。

スクリプト ツールのテスト

スクリプト ツールをテストする準備が整いました。

  1. ArcGIS Pro[カタログ] ウィンドウで、[DC.gdb] ジオデータベースを展開します。

    DC ジオデータベース

  2. [bike_routes] を右クリックし、[現在のマップに追加] を選択します。
  3. [Clip_and_ZIP.atbx] ツールボックスを展開し、[Clip and ZIP] ツールをダブルクリックします。

    [Clip and ZIP] ツールが表示されます。

  4. [Input feature layers] パラメーターで、[複数追加] ボタンをクリックします。

    複数追加ボタン

  5. [bike_racks][bike_routes][bus_lines] をオンにします。 [追加] をクリックします。

    複数の入力フィーチャ レイヤー

  6. [Clip Polygons] パラメーターで、[neighborhood] レイヤーを選択します。
  7. [Output geodatabase] パラメーターで、「C:\Tutorials\PythonTool\Clip.gdb」と入力します。
  8. [Output ZIP archive] パラメーターで、「C:\Tutorials\PythonTool\Clip.zip」と入力します。

    Clip and ZIP ツールのパラメーター

  9. [実行] をクリックします。

    ツールが実行されます。 完了すると、完了したことを示す緑色のメッセージがツールの下部に表示されます。

  10. [詳細の表示] をクリックします。

    [詳細の表示] ボタン

    [詳細] ウィンドウの [メッセージ] セクションに、print ステートメントから arcpy.AddMessage に変更したコードを使用してツールによって生成されたメッセージが表示されます。

  11. [詳細] ウィンドウを閉じます。
  12. [カタログ] タブをクリックします。

    [Clip.gdb] ジオデータベースがプロジェクト フォルダーに追加されました。

    プロジェクト フォルダーの Clip.gdb

    ZIP アーカイブは [カタログ] ウィンドウには表示されませんが、File Explorer を使用して、これが作成されたことを確認できます。

    ファイル エクスプローラーでの Clip.zip ファイル

機能する Python スクリプト ツールを作成しました。 ツールには入力および出力パラメーターがあり、これらのパラメーターでよくある問題を防止するための基本的なフィルターがあります。 次に、スクリプト ツールをより堅牢にするために、検証コードをさらに追加します。


検証によるツールの改善

スクリプト ツールは、ユーザーが入力することで動作するように設計されています。 検証は、ユーザーの入力に意味があり、エラーが発生しないことを確認するために使用されます。 検証の最初のステップは、慎重にツール パラメーターを設計することです。 たとえば、[クリップ ポリゴン] パラメーターには、ポリゴン フィーチャクラスのみが選択されるようにするフィルターがあります。 次に、検証に対する他のアプローチについて説明します。

空のフィーチャクラスに関するチェックの追加

出力フィーチャクラスの 1 つが空であるというシナリオについて検討します。 これは、入力フィーチャクラスのどのフィーチャも、クリップ ポリゴンの境界線の範囲内に含まれない場合に起こります。 この場合、出力が空であるというメッセージが表示されると便利です。

  1. [カタログ] ウィンドウで [Clip and ZIP] ツールを右クリックし、[プロパティ] を選択します。
  2. [実行] タブをクリックします。
  3. # Clip each input feature class セクションで arcpy.AddMessage(f"Output feature class {new_fc} created") 行を選択します。

    選択されたライン

  4. この行を次のコードに置き換えます。

    count = int(arcpy.management.GetCount(new_fc)[0])
            if count > 0:                                       
                arcpy.AddMessage(f"Output feature class {new_fc} created")
            else:
                arcpy.AddWarning(f"Output feature class {new_fc} created but does not contain any features.")

  5. コードのインデントが次の画像と一致することを確認します:

    インデントのあるコード

    新しいコードは、出力フィーチャクラス内のフィーチャ数を取得する count = int(arcpy.management.GetCount(new_fc)[0]) 行で始まります。 この行は、arcpy.analysis.Clip で始まる前の行と同じレベルにインデントされる必要があります。

    次の行では、if 条件ステートメントを使用して、新しいフィーチャクラスにフィーチャが存在するかどうかについて判断します。 フィーチャが存在すれば、条件ブロックが実行され、元のメッセージが追加されます。 フィーチャがない場合は、else ブロックが実行され、arcpy.AddWarning を使用して、フィーチャクラスは作成されたが空であるという警告メッセージが追加されます。 ifelse の後の 2 つの条件行は、前の行に対して 4 つのスペースでインデントする必要があります。

  6. [OK] をクリックします。
  7. [Clip and ZIP] ツールをダブルクリックします。
  8. [Input feature layers][参照] ボタンをクリックします。
  9. [DC.gdb] ジオデータベースを参照します。 [points_outside] フィーチャクラスをクリックして、[OK] をクリックします。

    points_outside フィーチャクラス

    このフィーチャクラスには、すべてが近傍シェープファイルのポリゴンの外側にあるポイント フィーチャが含まれています。 これを使用してツールをテストします。

  10. 2 つ目の [Input feature layers] ボックスで、[bike_routes] レイヤーを選択します。
  11. [Clip Polygons] で、[neighborhood] フィーチャ レイヤーを選択します。
  12. [Output geodatabase] に、「C:\Tutorials\PythonTool\Clip_empty.gdb」とパスを入力します。
  13. [Output ZIP archive] に、「C:\Tutorials\PythonTool\Clip_empty.zip」とパスを入力します。
  14. [実行] をクリックします。

    ツールが実行されます。 完了すると、ツールの下部に黄色のバナーが表示され、警告とともに完了したことを示します。

  15. バナーで、[詳細の表示] をクリックします。

    [詳細の表示] ボタン

    [メッセージ] セクションに、更新したコードで生成されたメッセージが表示されます。 [points_outside] フィーチャクラスが作成されたものの、フィーチャが含まれていないことを示す警告メッセージが表示されます。

    警告を表示するツールのメッセージ

    他のツールのメッセージも予想どおり表示されています。

  16. [Clip and ZIP] メッセージと [Clip and ZIP] ツールを閉じます。

    このタイプの検証は、ツールが実行され出力が作成された後に行われます。 ツールを実行する前に、検証を使用することも可能です。

検証を使用した空入力のチェック

ユーザーが選択したクリップ ポリゴンが空のフィーチャクラスで構成されているというシナリオについて検討します。 入力が有効なため、エラーは発生しません。 しかし、新しく作成されたフィーチャクラスはすべて空となるため、出力は意味がありません。 出力に意味がないことを事前に知る方法がある場合、理想としては、ツールは実行されるべきではありません。

スクリプト ツールのプロパティを変更し、空入力のチェックを追加します。 このタイプの検証はスクリプト ファイルには追加されませんが、別のタイプの検証が使用されます。

  1. [カタログ] ウィンドウで [Clip and ZIP] ツールを右クリックし、[プロパティ] を選択します。
  2. [検証] タブをクリックします。

    検証タブ

    [検証] タブにコード ボックスが表示されますが、これはスクリプト ファイルではありません。 ここにあるコードはツール プロパティにのみ存在し、個別の .py ファイルとしては保存されません。 [検証] タブには、開始点として使用できるテンプレート コードが含まれています。

    ToolValidator テンプレート コード

    テンプレート コードは、[ToolValidator] と呼ばれるクラスを示しています。 このクラスには、様々なタイプの検証に使用されるいくつかのメソッドが含まれています。 この検証のほとんどは、ツールを実行する前に行われます。

    コード ボックスで直接コードを変更することも、[スクリプト エディターで開く] をクリックして、一時的なスクリプト ファイルとしてコードを開くこともできます。

  3. [スクリプト エディターで開く] をクリックします。

    スクリプト エディターで開くボタン

  4. def updateMessages コード ブロックの 3 行を選択します。

    2 つのコメント行と return 行

  5. 次のコードをコピーして貼り付けて、コメントと return ステートメントを置き換えます。

    # When the clip polygon feature set, feature layer or
        # feature class does not contain any features, a warning
        # message appears in the tool dialog since this would result
        # in empty feature classes in the new geodatabase.
        if self.params[1].value:
            count = int(arcpy.management.GetCount(self.params[1].value)[0])
            if count < 1:
                self.params[1].setWarningMessage("No clip features. This results in empty outputs.")
        return

    コードをメソッド定義に貼り付けます。 しかし、問題があります。 コメントの最初の行は正しくインデントされていますが、それより後の行はすべてさらに 4 つのスペースでインデントされる必要があります。

    新しいコードのインデント

  6. インデントする必要がある行の選択。

    インデントする必要がある行

  7. [Format] をクリックし、[Indent Region] を選択します。

    インデントが正しくなりました。

    インデントが正しいことを確認。

  8. [File] をクリックし、[Save] を選択します。
  9. [IDLE] を閉じます。

    ArcGIS Pro に変更が行われたことを示す警告が表示されます。

  10. [はい] をクリックします。
  11. [OK] をクリックして、ツール プロパティ ウィンドウを閉じます。
  12. [Clip and ZIP] ツールをダブルクリックします。
  13. [Input feature layers] で、[bike_racks] レイヤーと [bike_routes] レイヤーを追加します。
  14. [Clip Polygons] で、[参照] ボタンをクリックします。 [DC.gdb] ジオデータベースを参照し、[polygon_empty] フィーチャクラスをクリックして、[OK] をクリックします。

    polygon_empty フィーチャクラス

    [polygon_empty] フィーチャクラスは、フィーチャのないポリゴン フィーチャクラスです。

    [Clip Polygons] 入力ボックスの横に警告アイコンが表示されます。

  15. 警告アイコンをポイントします。

    警告アイコンとメッセージ

    追加したツール検証コードが、ポリゴン フィーチャクラスが空であることを検知し、警告メッセージを表示します。

    警告メッセージは、ツールを実行することはできるが、結果がどうなるかについて事前に想定できることを意味します。 また、setWarningMessage の代わりに setErrorMessage を使用すると、エラー メッセージが表示されます。 このエラーは、ツールが実行されることを防ぎます。 ツールを設計する際は、どのタイプのメッセージが最も適しているかを慎重に検討する必要があります。

    注意:

    ここで使用される検証コードには、[行のカウント] ツールが含まれています。 このツールは、パラメーターの値が選択されているときに実行されます。 一般に、検証コードでジオプロセシング ツールを使用すると、非常に時間がかかり、予期しない問題が発生する可能性があるため、使用しない方がよいでしょう。 [行のカウント] ツールは例外で、非常に大きなデータセットに対しても高速に実行できる非常にシンプルなツールです。

デフォルト値の追加

もう 1 つのタイプのツール検証は、ツール パラメーターにデフォルト値を入力することです。 この手法は、多くのジオプロセシング ツールで使用されています。 たとえば、[クリップ] ツールを実行すると、出力フィーチャクラスの名前はデフォルトで、入力フィーチャクラスの名前の後ろに [_Clip] を付けたものになります。 [Clip and ZIP] ツールでは、[出力ジオデータベース] パラメーターと [出力 ZIP アーカイブ] パラメーターにデフォルトはありません。 これらのデフォルト値を検証コードに追加します。

  1. [Clip and ZIP] ツールを閉じます。
  2. ツールの [プロパティ] ウィンドウを開き、[検証] タブをクリックします。
  3. [スクリプト エディターで開く] をクリックします。
  4. IDLE で def updateParameters コード ブロックの 3 行を選択します。

    def updateParameters コード ブロック内の行

  5. 行を次のコードに置き換えます。

    # The output geodatabase and ZIP archive are given default
        # names of Clip.gdb and Clip.zip, respectively, inside the 
        # workspace of the project. Users can specify a different
        # file name and folder.
        if self.params[0].value and self.params[1].value:
            folder = os.path.split(arcpy.env.workspace)[0]
            self.params[2].value = os.path.join(folder, "Clip.gdb")
            self.params[3].value = os.path.join(folder, "Clip.zip")
        return

    最初の行は正しくインデントされていますが、それ以外の行はすべてさらに 4 つのスペースでインデントされる必要があります。

    新しい行のインデント

  6. インデントする必要がある行の選択。 [Format] をクリックし、[Indent Region] を選択します。

    インデントの問題が修正されました。

    正しいインデント

  7. [File] をクリックし、[Save] を選択します。
  8. [IDLE] を閉じます。
  9. ArcGIS Pro の警告メッセージで、[はい] をクリックします。
  10. [OK] をクリックして、ツール プロパティ ウィンドウを閉じます。
  11. [Clip and ZIP] ツールをダブルクリックします。
  12. [Input feature layers] で、[bike_racks] レイヤーと [bike_routes] レイヤーを追加します。
  13. [Clip Polygons] で、[neighborhood] レイヤーを選択します。

    最初の 2 つのパラメーターに値を設定するとすぐに、3 つ目と 4 つ目のパラメーターにデフォルト値が入力されます。 [Clip.gdb] ファイルと [Clip.zip] ファイルはすでに存在するため、警告メッセージが表示されます。

    デフォルトの出力名が入力されたツールのパラメーター

    これらの警告を無視してツールを実行するか、出力名を変更してツールを実行することができます。

このチュートリアルでは、Python コード用のユーザーフレンドリーなインターフェイスを提供するスクリプト ツールの作成方法を学びました。 スクリプト ツールのパラメーターを構成する方法と、スクリプト ツールからのパラメーターを受け取るようにコードを編集する方法を学びました。 ハードコーディングされたパスを削除し、メッセージを返すコードを追加する方法についても学びました。 最後に、コードに検証を追加して、コードをより堅牢にする方法を学びました。

他のチュートリアルについては、チュートリアル ギャラリーをご覧ください。