スクリプトの確認とテスト
Python スクリプトを使用して、ArcGIS Pro のタスクを自動化できます。 作成したスクリプトは Python .py ファイルとして他のユーザーと共有できます。 一方で、他のユーザーが作成したスクリプトを使用する場合、処理対象のデータセットの名前を変更するだけでも、ある程度の Python の知識が必要になります。 Python スクリプトをより使いやすい形で共有するために、Python スクリプト ツールを作成できます。
Python スクリプト ツールを使用すれば、標準のジオプロセシング ツールのようなユーザー フレンドリーなインターフェイスで Python スクリプトを提供できます。 ユーザー入力を検証するコードやユーザーにメッセージを表示するコードを追加して、スクリプト ツールを標準のジオプロセシング ツールのように動作させることができます。 また、組み込みのサポート ドキュメントで、ツールの使用方法やパラメーターの設定方法を説明することもできます。
スクリプト ツールの作成により、Python スクリプトの機能を他のユーザーと共有しやすくなります。 Python スクリプトをカスタムのツールボックス ファイル (.atbx) に埋め込むこともでき、そうすれば共有がさらに簡単になります。
プロジェクトを開いてデータセットを確認
まず、このチュートリアルのデータをダウンロードし、既存のプロジェクトを開いて、ツールにより処理される予定のデータを確認します。
- このチュートリアル用の PythonTool.zip ファイルをダウンロードし、コンピューター上でこのファイルを探します。
注意:
ほとんどの Web ブラウザーでは、デフォルトでコンピューターの Downloads フォルダーにファイルがダウンロードされます。 - [PythonTool.zip] ファイルを右クリックして、C:\Tutorials\ フォルダーに解凍します。
注意:
コンピューター上にこのフォルダーがまだない場合は、フォルダーを作成して zip ファイルを解凍してください。 別の場所に解凍してもかまいませんが、説明やスクリプトではパスとして C:\Tutorials を使用します。 PythonTool フォルダーを別の場所に置いた場合、そのフォルダー パスを指定するようにスクリプトを更新する必要があります。 - ArcGIS Pro を起動して ArcGIS Online にサイン インします。
注意:
組織アカウントがない場合は、ソフトウェア アクセスのオプションをご参照ください。
- ArcGIS Pro で [別のプロジェクトを開く] をクリックします。
- [プロジェクトを開く] ウィンドウで、PythonTool フォルダーを参照し、[Python Tool.aprx] をクリックして、[OK] をクリックします。
プロジェクトが開きます。
このマップには、ワシントン D.C. エリアのいくつかのフィーチャクラスが表示されます。
- [カタログ] ウィンドウがまだ表示されていない場合は、リボンの [表示] タブで、[カタログ ウィンドウ] をクリックします。
- [カタログ] ウィンドウで、[フォルダー]、[PythonTool] を展開します。
- [DC.gdb] ジオデータベースを展開します。
このジオデータベースには 8 つのフィーチャクラスが格納されています。 その一部はマップ上のレイヤーです。
[PythonTool] フォルダーには、[neighborhood.shp] というシェープファイルもあり、これもマップ上のものです。
たとえば、市役所で働いている人が、市内の特定の地域に関するデータ抽出依頼を定期的に受け取っているとします。
このタスクを実行するには、ジオデータベース内のすべてのフィーチャクラスを特定の地域にクリップして、クリップされたフィーチャクラスを新しいジオデータベースに保存する必要があります。 この新しいジオデータベースを ZIP アーカイブに圧縮すれば、簡単に共有したり、バックアップ目的に使用したりできます。
このようなタスクは GIS を使用する多くの職場で比較的よく行われます。
こういったタスクを ArcGIS Pro で実行できます。そのためには、[ファイル ジオデータベースの作成] ツールを使用して新しいジオデータベースを作成し、[クリップ] ツールをフィーチャクラスごとに 1 回ずつ実行します。 その後、File Explorer か圧縮ユーティリティを使用して ZIP アーカイブを作成できます。 このプロセスは、特に処理対象のフィーチャクラスが多い場合に複雑になり時間もかかります。
このプロセスは定期的なタスクであるため、自動化するのが合理的です。
このタスクを自動化するスクリプトが、このプロジェクトに付属しています。 以下、このスタンドアロン スクリプトについて内容を確認してテストし、次にこのスクリプトに基づいて Python スクリプト ツールを作成します。
Python スクリプトの確認とテスト
まず、スクリプトを開いてその内容を確認します。
- File Explorer で、C:\Tutorials\PythonTool フォルダーを参照します。
- [clip_zip.py] Python スクリプト ファイルを右クリックして、[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 で開きます。
次に、このスクリプトを確認してその動作を理解し、スクリプトをテストします。
スクリプトはインポートから始まります。
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 アーカイブ作成方法を模しています。
スクリプトを確認しましたので、次にテストの準備を行います。
- IDLE で、スクリプトの開始部分で使用されたパスを確認します。
チュートリアル フォルダーを C:/Tutorials/PythonTool/ 以外の場所に保存した場合、File Explorer を使用してそのデータのパスを取得する必要があります。
- このセクションの 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 スクリプト ツールとして使用するためにスクリプトを編集する際にも役に立ちます。
- IDLE で、[File] をクリックしてから [Save] をクリックし、スクリプトを保存します。
- IDLE で、[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 を使用して、実際に確認します。
- ArcGIS Pro の [カタログ] ウィンドウで、[PythonTool] フォルダーを右クリックし、[更新] をクリックします。
- [カタログ] ウィンドウで、[PythonTool] フォルダー内に [Clip.gdb] ジオデータベースが作成されたことを確認します。
- [Clip.gdb] ジオデータベースを展開します。
- [Clip.gdb] ジオデータベースで、[bike_racks] を右クリックし、[現在のマップに追加] をクリックします。
クリップされた新しい [bike_racks] レイヤーがマップに追加されます。
- File Explorer で、C:\Tutorials\PythonTool フォルダーを参照します。
Clip.zip ファイルがこのフォルダーに追加されています。
このスタンドアロン スクリプトは意図したとおりに動作します。 このスクリプトを異なるデータセットに対して使用する場合は、このスクリプトを開いてパスを修正します。 この作業は、Python スクリプトに詳しくないユーザーにとっては、あまりユーザー フレンドリーではありません。 また、スクリプト内のパスを誤って修正する可能性も大いにあります。 次のセクションでは、ユーザー フレンドリーなインターフェイスを伴う Python スクリプト ツールを開発します。
ツールの作成とパラメーターの追加
プロセスの次のステップは、スクリプト ツールの作成とそのパラメーターの構成です。 これでツールのユーザー インターフェイスを設定します。
ツールボックスとスクリプト ツールの作成
Python スクリプト ツールは ArcGIS Pro で作成されます。 それらはカスタム ツールボックスに格納されます。 ここで、プロジェクトでカスタム ツールボックスを作成し、スクリプト ツールを追加します。
- ArcGIS Pro の [カタログ] ウィンドウで、[PythonTool] フォルダーを右クリックし、[新規] をクリックして、[ツールボックス (.atbx)] をクリックします。
ツールボックスが作成されます。
- ツールボックス名として「Clip_and_ZIP」と入力し、Enter キーを押します。
ツールボックス名が [Clip_and_ZIP] になります。
注意:
以前のバージョンの ArcGIS Pro では、.tbx 形式が使用されていました。 以前のツールボックスをこの形式で使用することは可能ですが、ツールボックスを作成するときは ArcGIS Pro 3.0 以降の .atbx 形式を使用する必要があります。 - [Clip_and_ZIP] ツールボックスを右クリックし、[新規] をポイントして、[スクリプト] をクリックします。
[新しいスクリプト] ウィンドウが表示されます。
このウィンドウを使用して、ツールの一般プロパティの設定、ツール パラメーターの構成、実行コードの入力、検証コードの追加を行います。 これからこのチュートリアルで、これらすべての手順を完了します。
次は、スクリプト ツールの名前、ラベル、説明を指定します。
- [名前] ボックスに「ClipandZIP」と入力します。
ツールの名前は、そのツールによって使用される、内部の一意の識別名です。 名前に使用できるのは文字と数字のみです。 スペースと特殊文字は使用できません。
- [ラベル] ボックスに「Clip and ZIP」と入力します。
ツールのラベルは、ツールボックス内のツールのわかりやすい名前で、ツールをツール ダイアログ ボックスで開くときに表示されます。 ラベルには、スペースと特殊文字を入れることができます。
次の [ツールボックス] ボックスは、スクリプト ツールの場所です。 ツールボックスのパスと名前は .atbx ファイルの場所に基づいて表示され、このウィンドウでは変更できません。 スクリプト ツールは個別のファイルではなく、.atbx ファイルの一部であるという認識を持つことが重要です。
- [説明] ボックスに、「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.」と入力します。
- [OK] をクリックします。
入力した一般プロパティにより、スクリプト ツールが作成されます。
- [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。
スクリプト ツールが [ジオプロセシング] ウィンドウで開きます。 ジオプロセシング ツールの初期フレームワークがありますが、ほとんどは空のままです。
- ツールを閉じます。
次に、ツールのパラメーターを構成します。
ツールのプロパティの確認
ツール パラメーターの入念な構成は、Python スクリプト ツールの作成における重要な部分です。 ツール パラメーターは、そのツールのユーザー インターフェイスを定義し、ツールのユーザーがスクリプトによって処理されるデータやその他の値を入力できるようにします。
- [Clip and ZIP] ツールを右クリックして、[プロパティ] をクリックします。
[ツール プロパティ: Clip and ZIP] ウィンドウが表示され、前に [一般] タブに入力した内容が表示されます。
- [パラメーター] タブをクリックします。
ここでツール パラメーターを構成します。 ツール パラメーターはテーブルに整理され、1 行に 1 つのパラメーターが表示されます。列は各パラメーターのプロパティです。
このテーブルを使用して以下のパラメーターを作成します。
- [入力フィーチャ レイヤー] - ユーザーはアクティブなマップで任意のフィーチャ レイヤーを選択するか、ディスク上の任意のフィーチャクラスを参照することができます。
- [クリップ ポリゴン] - ユーザーはポリゴン フィーチャ レイヤーを選択するか、ディスク上のポリゴン フィーチャクラスを参照するか、ポリゴンで構成されているアクティブなマップでフィーチャ セットを作成することができます。
- [出力ジオデータベース] - ユーザーは結果を格納する新しいジオデータベースのパスとファイル名を指定できます。
- [出力 ZIP アーカイブ] - ユーザーはジオデータベースのコンテンツとともに作成される ZIP アーカイブのパスとファイル名を指定できます。
入力フィーチャ レイヤー パラメーターの追加
最初に、入力フィーチャ レイヤー パラメーターを追加します。
- [ラベル] 列に「Input feature layers」と入力し、Enter キーを押します。
パラメーターのラベルは、そのパラメーターに付けられた、人間が判読できるラベルであり、ツール ウィンドウに表示されます。
パラメーターの名前はラベルから自動入力され、スペースはアンダースコアで置き換えられます。 パラメーターの名前はスクリプト ツールによって内部で使用され、Python スクリプトでツール パラメーターを設定するときに使用されます。
- [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
[パラメーターのデータ タイプ] ウィンドウが表示されます。
デフォルト値は [文字列] ですが、これを [フィーチャ レイヤー] に変更します。
- データ タイプ ドロップダウン リストをクリックし、リストの「F」セクションまでスクロールして [フィーチャ レイヤー] をクリックします。
データ タイプを [フィーチャ レイヤー] に設定することで、ユーザーはツールのドロップダウン リストを使用してアクティブなマップのフィーチャ レイヤーを選択するか、ディスク上のフィーチャクラスを参照することができます。
ツールで複数の入力フィーチャ レイヤーを使用できるようにします。
- [複数の値] をオンにします。
[複数の値] をオンにすると、ユーザーがツールのこのパラメーターで 1 つまたは複数の入力を選択できるようになります。 フィーチャ レイヤーとフィーチャクラスの組み合わせも可能です。
- [OK] をクリックして、[パラメーターのデータ タイプ] ウィンドウを閉じます。
- [タイプ] は、デフォルト値の [必須] のままにします。
パラメーターを [必須] にすると、そのパラメーターの設定なしではツールを実行できません。
- [方向] は、デフォルト値の [入力] のままにします。
パラメーターの方向を [入力] にすると、これが処理対象の入力レイヤーまたは値の 1 つであることをツールに対して指示することになります。 また、ModelBuilder でこのツールを使用し、フィーチャ レイヤーを入力としてツールに接続できます。
これで 1 つ目のパラメーターが完成します。 この 1 つのパラメーターを設定した状態でスクリプト ツールがどう見えるかをすぐに確認できます。
- [ツール プロパティ: Clip and ZIP] ウィンドウで、[OK] をクリックします。
- [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。
スクリプト ツールが [ジオプロセシング] ウィンドウで開きます。 1 つ目のパラメーターが表示されるようになっています。 アクティブなマップからフィーチャ レイヤーを選択するためのドロップダウン リストと、ディスク上のフィーチャクラスを参照するための参照ボタンがあります。 パラメーターのラベルの前にある赤いアスタリスクは、これが必須パラメーターであることを示しています。
この段階では、ツール パラメーターを構成し、ツールのユーザー インターフェイスを確認してパラメーターが正常に表示されるかどうかをテストしています。 Python コードが追加されていないため、ツールが正常に実行され機能するかどうかをテストすることはまだできません。
注意:
入力フィーチャ レイヤーを少なくとも 1 つ選択してツールを実行すると、エラー メッセージが表示されます。 - ツールを閉じます。
クリップ ポリゴン パラメーターの追加
次に、クリップ ポリゴンのパラメーターを構成します。
- [Clip and ZIP] ツールを右クリックして、[プロパティ] をクリックします。
- [パラメーター] タブで、テーブルの 2 つ目の行の [ラベル] 列をクリックして「Clip Polygons」と入力し、Enter キーを押します。
パラメーターの [名前] が [Clip_Polygons] に更新されます。
- [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
- [データ タイプ] でドロップダウン リストをクリックし、[フィーチャ セット] をクリックします。
フィーチャ セットはフィーチャクラスの軽量リプレゼンテーションです。 ジオプロセシング ツールでは、フィーチャ セットによって対話型入力を使用できます。 ユーザーは [フィーチャ作成] ウィンドウを使用して編集中にフィーチャを作成するときと同様に、マップ上で描画してフィーチャを作成できます。 また、アクティブなマップからフィーチャ レイヤーを選択したり、ディスク上のフィーチャクラスを参照したりすることもできます。
- [OK] をクリックして、[パラメーターのデータ タイプ] ウィンドウを閉じます。
- [タイプ] は、デフォルト値の [必須] のままにします。
- [方向] は、デフォルト値の [入力] のままにします。
次に、このパラメーターにフィルターを設定し、ツールの [クリップ ポリゴン] パラメーターで入力としてポリゴン フィーチャのみを使用できるようにします。
- 右にスクロールし、[フィルター] 列をクリックします。
- [フィルター] ドロップダウン リストをクリックし、[フィーチャ タイプ] を選択します。
[フィーチャ タイプ フィルター] ウィンドウが表示されます。
- [ポリゴン] をオンにします。
これで、ツールを実行すると、入力クリップ ジオメトリにポリゴンのみを使用できます。
-
[フィーチャ タイプ フィルター] ウィンドウで [OK] をクリックします。
これで、[クリップ ポリゴン] パラメーターを構成しました。
出力ジオデータベース パラメーターの追加
次に、出力ジオデータベースのパラメーターを構成します。
- [パラメーター] タブで、テーブルの 3 つ目の行の [ラベル] 列をクリックして「Output geodatabase」と入力し、Enter キーを押します。
- [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
- [データ タイプ] でドロップダウン リストをクリックし、[ワークスペース] をクリックして [OK] をクリックします。
- [タイプ] は、デフォルト値の [必須] のままにします。
- [方向] 列をクリックして、ドロップダウン リストで [出力] を選択します。
[方向] を [出力] にすることで、これが生成する出力の 1 つであることをツールに指示することになります。 また、ModelBuilder でこのツールを使用し、ツールの出力アイテムを生成できます。
- [フィルター] の列をクリックします。
- [フィルター] ドロップダウン リストをクリックし、[ワークスペース] を選択します。
- [ワークスペース フィルター] ウィンドウで、[ローカル データベース] をオンにします。
フィルターを [ローカル データベース] に設定すると、ユーザーは出力としてファイル ジオデータベースのみを指定でき、エンタープライズ ジオデータベースまたはフォルダーは指定できなくなります。
- [OK] をクリックします。
これで、[出力ジオデータベース] パラメーターを構成しました。
出力 ZIP アーカイブ パラメーターの追加
次に、出力 ZIP アーカイブのパラメーターを構成します。
- [パラメーター] タブで、テーブルの 4 つ目の行の [ラベル] 列をクリックして「Output ZIP archive」と入力し、Enter キーを押します。
- [データ タイプ] 列で、[データ タイプの変更] ボタンをクリックします。
- [データ タイプ] でドロップダウン リストをクリックし、[ファイル] をクリックして [OK] をクリックします。
ZIP アーカイブはファイルであるため、これは適切なデータ タイプです。
- [方向] 列をクリックして、ドロップダウン リストで [出力] を選択します。
- [フィルター] ドロップダウン リストをクリックし、[ファイル] を選択します。
- [ファイル フィルター] ウィンドウの [エクステンション] ボックスに「zip」と入力します。
ファイル拡張子は、ファイル名の本体と拡張子を区切るドットを含めず、文字のみとする必要があります。 「.zip」とは入力しないでください。
ファイル拡張子では、大文字と小文字が区別されません。
- [OK] をクリックします。
これで、ツールのすべてのパラメーターを追加しました。
- [ツール プロパティ: Clip and ZIP] ウィンドウで、[OK] をクリックします。
次の手順で、構成したパラメーターをテストします。
パラメーターのテスト
すべてのツール パラメーターを作成した後、ツール ウィンドウで、各パラメーターの設定が意図したとおりに機能するようにするためのテストを行うことができます。
- [カタログ] ウィンドウの [Clip_and_ZIP] ツールボックスで、[Clip and ZIP] ツールをダブルクリックします。
[Clip and ZIP] ツールが開きます。 前の手順で構成したすべてのパラメーターがツール ウィンドウに表示されるようになっています。
- [Clip and ZIP] ツールで [入力フィーチャ レイヤー] ドロップダウン リストをクリックし、[bike_racks] をクリックします。
[入力フィーチャ レイヤー] の 2 つ目のボックスが [bike_racks] のボックスの下に表示されます。このツール パラメーターでは複数の値を使用できるためです。
- [入力フィーチャ レイヤー] の参照ボタンをクリックして、[DC.gdb] ジオデータベースを展開し、[bike_routes] をクリックし、[OK] をクリックします。
bike_routes フィーチャクラスはマップ上になく、[Clip_and_ZIP] ツールにこれを追加しました。
これで、アクティブなマップのフィーチャ レイヤーやディスク上のフィーチャクラスを含めて、ユーザーが複数の入力を選択できることが確認されます。
- [クリップ ポリゴン] スケッチ ツールをクリックします。
フィーチャ セットのスケッチ入力はポリゴン フィーチャのみに制限されています。
これにより、エラーが発生する、ポイントまたはライン フィーチャを使用してクリップしようとすることを防止しています。
次に、出力をテストします。
- [出力ジオデータベース] ボックスに「C:\Tutorials\PythonTool\Clip」と入力し、[出力 ZIP アーカイブ] テキスト ボックスをクリックします。
フォルダーのパスを入力すると、[出力ジオデータベース] パラメーターにエラー通知アイコンが表示されます。
- エラー通知アイコンにポイントします。
指定した場所にジオデータベースが存在しない、またはワークスペース タイプが間違っていることを示すエラー メッセージが表示されます。
また、不適切なファイル拡張子 (例: .fdb) を入力すると、自動的に .gdb に変更されます。
最後のパラメーターで同様の検証が実行されます。
- [出力 ZIP アーカイブ] ボックスに「C:\Tutorials\PythonTool\Clip」と入力し、[出力ジオデータベース] テキスト ボックスをクリックします。
ツールによってファイル拡張子 .zip が「Clip」に追加されます。
- [出力 ZIP アーカイブ] ボックスに「C:\Tutorials\PythonTool\Clip.zipped」と入力し、[出力ジオデータベース] テキスト ボックスをクリックします。
不適切なファイル拡張子で終わるパスを入力すると、[出力 ZIP アーカイブ] パラメーターにエラー通知アイコンが表示されます。
- エラー通知アイコンにポイントします。
アイコンにポイントすると、これが不適切なファイル タイプであることを示すエラー メッセージが表示されます。
- ツールを閉じます。
テストによって、構成したフィルターやその他のパラメーター設定が機能していることがわかります。 パラメーターを入念に設計することで、ユーザーが無効な値でツールを実行できなくなるため、ツールの堅牢性が高まります。
パラメーターのテストは完了しまたが、ツールを実行する準備はまだできていません。コードを追加していないためです。 次のセクションでその作業を行います。
実行コードの編集
Python スクリプト ツールの実行コードは Python コードです。ユーザーが [ジオプロセシング] ウィンドウで [実行] をクリックすると、このコードが実行されます。 前に確認したスタンドアロン スクリプトを使用しますが、少し変更を加える必要があります。ツール ウィンドウでユーザーによって入力されたパラメーターをスクリプトが取得できるようにします。
- [Clip and ZIP] ツールを右クリックして、[プロパティ] をクリックします。
- [実行] タブをクリックします。
タブにスクリプト ツールの 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() の名前をより意味のあるものに変更します。 まず、ツール プロパティ ダイアログ ボックスで直接、埋め込みコードを編集します。
- [実行] タブのコード ボックスで、def script_tool(param0, param1): という行を編集して def ClipZip(param0, param1): になるようにします。
変更箇所は以下の部分です。
変更後は以下のようになります。
ツール プロパティ ダイアログ ボックスでコードを変更すると、変更したコードの行の前に黄色のマーカーが付きます。
- コード ボックスで、script_tool(param0, param1) という行を編集して ClipZip(param0, param1) になるようにします。
これで、スクリプト ツール テンプレートに表示される両方の場所で関数名を更新しました。
コードを編集するにはこの方法が便利で迅速ですが、コード ボックスの機能は一般的な Python エディターと比べて制限されます。 次に、Python エディターで実行コードを編集する 2 つの方法を確認します。
- [実行] タブのコード ボックスの下で、[OK] をクリックします。
埋め込みコードに対する変更は自動的に保存され、ツール プロパティ ダイアログ ボックスを閉じると黄色のマーカーは消えます。
- [Clip and ZIP] ツールを右クリックして、[プロパティ] をクリックします。
- コード ボックスの下部にある [スクリプト エディターで開く] ボタンをクリックします。
一時スクリプト ファイルがデフォルトの Python エディターで開きます。 別のエディターを構成していない限り、スクリプトは [IDLE] で開きます。
スクリプト ボックスで行った編集内容がスクリプトに反映されています。
注意:
Python エディターの構成を、[プロジェクト] タブで行うことができます。 [プロジェクト] タブをクリックし、[オプション] をクリックして、左のウィンドウで [ジオプロセシング] をクリックします。 [スクリプト エディター] オプションはデフォルトで空白になっており、これは [IDLE] が使用されることを意味します。 パスを指定して、お好みのエディターに変更できます。 このチュートリアルの目的では、[IDLE] で十分です。パスは C:\Users\UserName\AppData\Local\Temp\1\ArcGISProTemp19512\ のようになります。
ファイル名は、tmp という文字に続いて、英数字コード、.py ファイル拡張子で構成されます。 コードに変更を加えて .py ファイルを保存すると、これらの変更が埋め込みの実行コード ブロックに追加されます。 このワークフローを実行します。
- [IDLE] で、import arcpy の下に新規のコード行を追加し、以下のコードを追加します。
import os import zipfile
これらの 2 つのモジュールは元のスタンドアロン スクリプトで使用されています。 スクリプトからコピーして貼り付けるか、コードを入力することができます。
- [IDLE] で [File] をクリックして [Save] をクリックします。
- [IDLE] を閉じます。
[IDLE] で追加したコードがコード ボックスに表示されるようになりました。
次に、スタンドアロン スクリプト ファイルでスクリプトのパラメーターを編集します。
別のファイルへのスクリプトの保存
これまでに記述したコードはツールボックスに埋め込まれています。 また、コードを .py ファイルにエクスポートし、お好みの Python エディターで使用することもできます。
- [実行] タブで、スクリプト ボックスの上にある [スクリプトをファイルにエクスポート] ボタンの緑色の矢印をクリックします。
- [スクリプトのエクスポート] ウィンドウで、場所が [PythonTool] フォルダーになっていることを確認し、[名前] に「clip_zip_tool.py」と入力します。
移動と更新が必要なほとんどのコードの入った元のスクリプトは [clip_zip.py] という名前になっているため、元のファイルを上書きしないよう、異なる名前を必ず使用します。
- [保存] をクリックします。
これで、スクリプト ボックスから外部の Python スクリプト ファイルにコードをエクスポートし、ツールボックスにこのコードが格納された状態ではなくなりました。
ボックスの上部にスクリプト ファイルのパスが表示されています。
別の .py ファイルを使用するメリットは、お好みのエディターでコードをより容易に記述できるようになる点です。 ただし、このチュートリアルでは、引き続き [IDLE] を使用します。
ツール プロパティ ウィンドウに表示されているコードは埋め込みコードではなくなり、.py ファイルのコードになりました。 ただし、コードの編集を引き続きツール プロパティ ウィンドウで直接行うことは可能です。ツール プロパティ ウィンドウを閉じると、.py ファイルは自動的に保存されます。
このチュートリアルの残りの大部分では、.py ファイルをツール プロパティ ウィンドウで編集するのではなく、[IDLE] で開きます。
- コード ボックスの下部にある [スクリプト エディターで開く] ボタンをクリックします。
.py ファイルが [IDLE] で開きます。
ファイル名とパスが一時的なものではなくなっています。
注意:
.py スクリプト ファイルのコードを [実行] タブのコード ボックスと [IDLE] で同時に編集することは可能です。 ただし、推奨される最良の方法ではありません。 警告メッセージが表示され、どちらの変更を保持するかを決定する必要があります。 これを回避するには、一度に 1 つのアプリケーションでのみスクリプトを編集します。これでコードを .py ファイルにエクスポートしたので、このウィンドウを閉じます。
- [プロパティ] ウィンドウで [OK] をクリックします。
次に、スクリプト ツールのパラメーターに合わせてコードを変更します。
- [IDLE] で、if __name__ == "__main__": という行の後にある、param0 と param1 から始まる 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 関数に渡されます。 変数名は、既存のスタンドアロン スクリプトのコードと整合するように選択されます。
- ClipZip(param0, param1) という行を編集し、param0, param1 をパラメーター値を含む変数に置き換えます。
ClipZip(inputs, clip_fc, gdb, out_zip)
変更後は以下のようになります。
この行は、これらのパラメーターで ClipZip() 関数を呼び出します。
- arcpy.SetParameterAsText(2, "Result") の行を削除します。
このスクリプト ツールでは、テンプレートのこの行を使用しません。
次に、ClipZip() 関数の定義を更新します。
- def ClipZip(param0, param1): という行を編集し、param0, param1 をパラメーター値を含む変数に置き換えます。
def ClipZip(inputs, clip_fc, gdb, out_zip):
変更後は以下のようになります。
これで、ClipZip() 関数が 4 つのパラメーターを取得するように定義しました。
変数の順序が同じであるかぎり、関数の定義で変数がパラメーター タブと同じ名前を使用する必要はありません。 関数の定義の行の変数名は、その関数が何をするかを定義するコード ブロックの変数 (この時点ではまだ追加していません) と整合している必要があります。
- [IDLE] で [File] をクリックして [Save] をクリックします。
[IDLE] で加えた変更がスクリプト ファイルに保存されます。
スクリプトは以下のようになります。
次に、元のスクリプトのコードを、コード ブロックに追加します。
元のスクリプトからのコードのコピー
元のスクリプトに、スクリプト ツールのコード ブロックに追加するコードが入っています。
- [IDLE] で [File] をクリックして [Open] をクリックします。
- C:\Tutorials\PythonTool フォルダーで [clip_zip.py] をクリックし、[開く] をクリックします。
- [IDLE] の [clip_zip.py] スクリプトで、# Workspace and datasets 行の先頭をクリックしてからスクリプトの最後までドラッグし、import 行以外のすべてのコードを選択します。
- 選択したコードを右クリックして、[コピー] をクリックします。
- [IDLE] で [clip_zip_tool.py]ウィンドウに切り替えます。
- """Script code goes below""" というコメントを選択します。
- 選択したコードを右クリックして [貼り付け] をクリックします。
コードが [ClipZip] 関数のコード ブロックに貼り付けられます。
元のスクリプトでの作業が完了しました。 これで、ウィンドウを閉じて [clip_zip_tool.py] コードに集中できます。
- [IDLE] で [clip_zip.py] スクリプト ウィンドウを閉じます。
[clip_zip_tool.py] スクリプトにコピーしたコード ブロック全体が関数の一部となるように、スペース 4 つ分インデントする必要があります。
それぞれの行の前に手作業で 4 つのスペースを入力してインデントすることができますが、インデントする行を選択してまとめてインデントすることも可能です。
Python ではインデントされた空白が重要であるため、この場合はまとめて操作するのが最適です。 誤って 3 つまたは 5 つのスペースを行に追加してしまった場合、コードは正常に実行されません。 また、コードは複数行にわたり、ループと条件のセクションがインデントされているため、インデントを手作業で追加すると間違いが生じやすくなります。
- [IDLE] の [clip_zip_tool.py] ウィンドウで、貼り付けただけで 4 つのスペースでインデントしていないコードを、コード ブロックのコンテンツに合わせるために、クリック アンド ドラッグして選択します。
# Workspace and datasets 行がインデントされているかどうかは、コードに貼り付けたときに、"""Script code goes below""" というコメントの前のスペースが選択されていたかどうかによって異なります。
return 行の前で選択を終えるようにしてください。
- [Format] をクリックし、[Indent Region] をクリックします。
それぞれのコード行がさらに 4 つのスペースでインデントされます。
- ClipZip 関数のコード ブロック (def ClipZip 行より後の行、かつ return までの行のすべて) が 4 つのスペースでインデントされていることを確認します (ループまたは条件ステートメントの行では 4 つ以上)。
- [IDLE] で [File] をクリックして [Save] をクリックします。
ハードコーディングされた値の削除
元のスクリプトでは、数行で特定のパスへの変数が設定されています。これは、パスのハードコーディングとして知られています。 これは、スクリプトがデータを特定して処理するために必要とされていました。 しかし、スクリプト ツールでは、ツールのユーザーがツール ユーザー インターフェイスのコントロールを使用して入力および出力を指定します。 arcpy.GetParameter および arcpy.GetParameterAsText を使用して、この情報をツール ユーザー インターフェイスから取得するように、スクリプトを設定しました。 次の手順で、ハードコーディングされた行を削除します。
- ハードコーディングされたパスを指定している行をそれぞれ削除します。
これらの行は、arcpy.env.workspace = 、clip_fc = 、gdb =、および out_zip = から始まっています。
- arcpy.env.overwriteOutput = True の行を削除します。
この行をそのままにする必要はありません。コードがスクリプト ツールとして実行されるとき、overwriteOutput プロパティは ArcGIS Pro によって制御されるためです。
- gdb 変数の値を分割して変数 gdb_path および new_gdb に値を割り当てるコード行はそのままにします。
- 行が 4 つのスペースでインデントされ、# Workspace and datasets というコメントと同じレベルになっていることを確認します。
これで、ハードコーディングされた値を持つコード行をすべて削除しました。 スクリプトは、スクリプト ツールのパラメーターから値を取得します。
- スクリプトを保存します。
print ステートメントからメッセージへの変更
元のスクリプトでは、print ステートメントを使用してステータスを [IDLE Shell] ウィンドウに出力していました。 これが機能するのは、スクリプト エディターからスクリプトを実行する場合のみです。 print ステートメントを編集し、arcpy.AddMessage を使用してこの情報をジオプロセシング メッセージに送信するようにします。
print ステートメントは 3 つあります。 そのうち 2 つを変更し、残りの 1 つを削除します。
- print(f"Output geodatabase {gdb} created") 行を編集し、print から arcpy.AddMessage に変更します。
行は次のようになります。
arcpy.AddMessage(f"Output geodatabase {gdb} created")
コード内の次の print ステートメントは、入力フィーチャクラスのリストを出力します。 inputs 変数フィーチャクラス リストはスクリプト ツールによって設定されるため、arcpy.ListFeatureClasses を使用して入力を設定する行は不要です。 この print ステートメントと、リストを作成する行を削除します。
- # Clip each input feature class セクションで、inputs = arcpy.ListFeatureClasses() 行と print(inputs) 行を選択して削除します。
このセクションは以下のようになります。
次に、3 つ目の print ステートメントを編集します。
- print(f"Output feature class {new_fc} created") 行を編集し、print から arcpy.AddMessage に変更します。
行は以下のようになっています。
arcpy.AddMessage(f"Output feature class {new_fc} created")
- [IDLE] で [File] をクリックして [Save] をクリックします。
ZIP ファイルを作成する最後のコード セクションでは、変更は不要です。
- [IDLE] を閉じます。
スクリプト ツールのテスト
スクリプト ツールをテストする準備が整いました。
- ArcGIS Pro の [カタログ] ウィンドウで、[DC.gdb] ジオデータベースを展開します。
- [bike_routes] を右クリックし、[現在のマップに追加] をクリックします。
- [Clip_and_ZIP.atbx] ツールボックスを展開し、[Clip and ZIP] ツールをダブルクリックします。
[Clip and ZIP] ツールが開きます。
- [入力フィーチャ レイヤー] パラメーターで、[複数追加] 矢印ボタンをクリックします。
- [複数追加] ボックスで、[bike_racks]、[bike_routes]、[bus_lines] をオンにし、[追加] をクリックします。
- [クリップ ポリゴン] パラメーターで、[neighborhood] レイヤーを選択します。
- [出力ジオデータベース] パラメーターで、「C:\Tutorials\PythonTool\Clip.gdb」と入力します。
- [出力 ZIP アーカイブ] パラメーターで、「C:\Tutorials\PythonTool\Clip.zip」と入力します。
- [実行] をクリックします。
ツールが実行されます。 完了すると、ツールの下部に完了したことを示す緑色のバナーが表示されます。
- バナーで、[詳細の表示] をクリックします。
ツールの [メッセージ] セクションに、print ステートメントから arcpy.AddMessage に変更したコードを使用してツールが生成したメッセージが表示されます。
- [詳細] ウィンドウを閉じます。
- [カタログ] タブをクリックします。
[Clip.gdb] ジオデータベースがプロジェクト フォルダーに追加されました。
ZIP アーカイブは [カタログ] ウィンドウには表示されませんが、Windows File Explorer を使用して、これが作成されたことを確認できます。
機能する Python スクリプト ツールを作成しました。 ツールには入力および出力パラメーターがあり、これらのパラメーターでよくある問題を防止するための基本的なフィルターがあります。
次のセクションでは、スクリプト ツールをより堅牢にするために検証コードを追加する方法を説明します。
検証によるツールの改善
スクリプト ツールは、ユーザーが入力することで動作するように設計されています。 検証は、ユーザーの入力に意味があり、エラーが発生しないことを確認するために使用されます。 検証の最初のステップは、慎重にツール パラメーターを設計することです。 たとえば、[クリップ ポリゴン] パラメーターには、ポリゴン フィーチャクラスのみが選択されるようにするフィルターがあります。 このセクションでは、検証に対する他のアプローチについて説明します。
空のフィーチャクラスに関するチェックの追加
出力フィーチャクラスの 1 つが空であるというシナリオについて検討します。 これは、入力フィーチャクラスのどのフィーチャも、クリップ ポリゴンの境界線の範囲内に含まれない場合に起こります。 この場合、出力が空であるというメッセージが表示されると便利です。
- [カタログ] ウィンドウで [Clip and ZIP] ツールを右クリックし、[プロパティ] をクリックします。
- [実行] タブをクリックします。
- # Clip each input feature class セクションで arcpy.AddMessage(f"Output feature class {new_fc} created") 行を選択します。
- この行を次のコードに置き換えます。
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.")
- コードのインデントが次の画像と一致することを確認します。
新しいコードは、出力フィーチャクラス内のフィーチャ数を取得する count = int(arcpy.management.GetCount(new_fc)[0]) 行で始まります。 この行は、arcpy.analysis.Clip で始まる前の行と同じレベルにインデントされる必要があります。
次の行では、if 条件ステートメントを使用して、新しいフィーチャクラスにフィーチャが存在するかどうかについて判断します。 フィーチャが存在すれば、条件ブロックが実行され、元のメッセージが追加されます。 フィーチャがない場合は、else ブロックが実行され、arcpy.AddWarning を使用して、フィーチャクラスは作成されたが空であるという警告メッセージが追加されます。 if と else の後の 2 つの条件行は、前の行に対して 4 つのスペースでインデントする必要があります。
- [OK] をクリックしてツールの [プロパティ] ウィンドウを閉じ、変更内容を保存します。
- [Clip and ZIP] ツールをダブルクリックします。
- [入力フィーチャ レイヤー] ウィンドウで、参照をクリックし、[DC.gdb] ジオデータベースで、[points_outside] フィーチャクラスをクリックして、[OK] をクリックします。
このフィーチャクラスには、すべてが近傍シェープファイルのポリゴンの外側にあるポイント フィーチャが含まれています。 これを使用してツールのテストを行います。
- 2 つ目の [入力フィーチャ レイヤー] で、マップから [bike_routes] レイヤーを選択します。
- [クリップ ポリゴン] パラメーターで、[neighborhood] フィーチャ レイヤーを選択します。
- [出力ジオデータベース] パラメーターに、「C:\Tutorials\PythonTool\Clip_empty.gdb」とパスを入力します。
- [出力 ZIP アーカイブ] パラメーターに、「C:\Tutorials\PythonTool\Clip_empty.zip」とパスを入力します。
- [実行] をクリックします。
ツールが実行されます。 完了すると、ツールの下部に完了したことを示す黄色のバナーが表示されますが、警告も表示されます。
- バナーで、[詳細の表示] をクリックします。
ツールの [メッセージ] セクションに、更新したコードで生成されたメッセージが表示されます。 [points_outside] フィーチャクラスが作成されたものの、フィーチャが含まれていないことを示す警告メッセージが表示されます。
他のツールのメッセージも予想どおり表示されています。
- [Clip and ZIP] メッセージと [Clip and ZIP] ツールを閉じます。
このタイプの検証は、ツールが実行され出力が作成された後に行われます。 ツールを実行する前に、検証を使用することも可能です。
検証を使用した空入力のチェック
ユーザーが選択したクリップ ポリゴンが空のフィーチャクラスで構成されているというシナリオについて検討します。 入力が有効なため、エラーは発生しません。 しかし、新しく作成されたフィーチャクラスはすべて空となるため、出力は意味がありません。 出力に意味がないことを事前に知る方法がある場合、理想としては、ツールは実行されるべきではありません。
スクリプト ツールのプロパティを変更し、空入力のチェックを追加します。 このタイプの検証はスクリプト ファイルには追加されませんが、別のタイプの検証が使用されます。
- [カタログ] ウィンドウで [Clip and ZIP] ツールを右クリックし、[プロパティ] をクリックします。
- [検証] タブをクリックします。
[検証] タブにコード ボックスが表示されますが、これはスクリプト ファイルではありません。 ここにあるコードはツール プロパティにのみ存在し、個別の .py ファイルとしては保存されません。 [検証] タブには、開始点として使用できるテンプレート コードが含まれています。
テンプレート コードは、[ToolValidator] と呼ばれるクラスを示しています。 このクラスには、様々なタイプの検証に使用されるいくつかのメソッドが含まれています。 この検証のほとんどは、ツールを実行する前に行われます。
コード ボックスで直接コードを変更することも、[スクリプト エディターで開く] をクリックして、一時的なスクリプト ファイルとしてコードを開くこともできます。
- [スクリプト エディターで開く] をクリックします。
- def updateMessages セクションで、2 つのコメント行を選択します。
- def updateMessages コード ブロックの 3 行を選択します。
- 次のコードをコピーして貼り付けて、コメントと return ステートメントを置き換えます。
# When the clip polgyon 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 つのスペースでインデントされる必要があります。
- インデントする必要がある行を選択します。
- [形式] をクリックし、[領域をインデント] をクリックします。
- インデントが正しくなっていることを確認します。
- [IDLE] で [ファイル] をクリックして [保存] をクリックします。
- [IDLE] を閉じます。
ArcGIS Pro に変更が行われたことを示す警告が表示されます。
- [はい] をクリックします。
- [OK] をクリックして、ツール プロパティ ウィンドウを閉じます。
- [Clip and ZIP] ツールをダブルクリックします。
- [入力フィーチャ レイヤー] で、[bike_racks] レイヤーと [bike_routes] レイヤーを追加します。
- [クリップ ポリゴン] パラメーターで、参照をクリックし、[DC.gdb] ジオデータベースで、[polygon_empty] フィーチャクラスをクリックして、[OK] をクリックします。
[polygon_empty] フィーチャクラスは、フィーチャのないポリゴン フィーチャクラスです。
[クリップ ポリゴン] 入力ボックスの横に警告アイコンが表示されます。
- 警告アイコンをポイントします。
追加したツール検証コードが、ポリゴン フィーチャクラスが空であることを検知し、警告メッセージを表示します。
警告メッセージは、ツールを実行することはできるが、結果がどうなるかについて事前に想定できることを意味します。 また、setWarningMessage の代わりに setErrorMessage を使用すると、エラー メッセージが表示され、ツールが実行されることを防ぎます。 ツールを設計する際は、どのタイプのメッセージが最も適しているかを慎重に検討する必要があります。
注意:
ここで使用される検証コードには、[行のカウント] ツールが含まれています。 このツールは、パラメーターの値が選択されているときに実行されます。 一般に、検証コードでジオプロセシング ツールを使用すると、非常に時間がかかり、予期しない問題が発生する可能性があるため、使用しない方がよいでしょう。 [行のカウント] ツールは例外で、非常に大きなデータセットに対しても高速に実行できる非常にシンプルなツールです。
デフォルト値の追加
もう 1 つのタイプのツール検証は、ツール パラメーターにデフォルト値を入力することです。 この手法は、多くのジオプロセシング ツールで使用されています。 たとえば、[クリップ] ツールを実行すると、出力フィーチャクラスの名前はデフォルトで、入力フィーチャクラスの名前の後ろに [_Clip] を付けたものになります。 [Clip and ZIP] ツールでは、[出力ジオデータベース] パラメーターと [出力 ZIP アーカイブ] パラメーターにデフォルトはありません。 これらのデフォルト値を検証コードに追加できます。
- [Clip and ZIP] ツールを閉じます。
- ツールの [プロパティ] を開き、[検証] タブをクリックします。
- [スクリプト エディターで開く] をクリックします。
- [IDLE] で def updateParameters コード ブロックの 3 行を選択します。
- 行を次のコードに置き換えます。
# 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 つのスペースでインデントされる必要があります。
- インデントする必要がある行を選択し、[形式] をクリックして、[領域をインデント] をクリックします。
インデントの問題が修正されました。
- [IDLE] で [ファイル] をクリックして [保存] をクリックします。
- [IDLE] を閉じます。
- ArcGIS Pro の警告メッセージ上で、[はい] をクリックします。
- [OK] をクリックして、ツール プロパティ ウィンドウを閉じます。
- [Clip and ZIP] ツールをダブルクリックします。
- [入力フィーチャ レイヤー] で、[bike_racks] レイヤーと [bike_routes] レイヤーを追加します。
- [クリップ ポリゴン] パラメーターで、[neighborhood] レイヤーを選択します。
最初の 2 つのパラメーターに値を設定するとすぐに、3 つ目と 4 つ目のパラメーターにデフォルト値が入力されます。 [Clip.gdb] ファイルと [Clip.zip] ファイルはすでに存在するため、警告メッセージが表示されます。
これらの警告を無視してツールを実行するか、出力名を変更してツールを実行することができます。
このチュートリアルでは、Python コード用のユーザーフレンドリーなインターフェイスを提供するスクリプト ツールの作成方法を学びました。 スクリプト ツールのパラメーターを構成する方法と、スクリプト ツールからのパラメーターを受け取るようにコードを編集する方法を学びました。 ハードコーディングされたパスを削除し、メッセージを返すコードを追加する方法についても学びました。 最後に、コードに検証を追加して、コードをより堅牢にする方法を学びました。