Python を使用したジオプロセシング ツールの実行
プロジェクトを開いてデータセットを確認
Python を使用して、ジオプロセシング ツールを実行する前に、データセットをダウンロードして、新しいプロジェクトを開き、使用するデータセットを確認します。
- チュートリアルのデータをダウンロードして、お使いのコンピューター上の場所に、コンテンツを展開します。
.zip ファイルには、[PythonGP] というフォルダーがあります。
このチュートリアルでは、C:\Lessons\PythonGP\ に、データが表示されます。 別のフォルダーを使用できますが、以下の手順でそのパスを必ず調整してください。
- ArcGIS Pro を起動します。
- ArcGIS Pro で、[最近使ったプロジェクト] の横にある [別のプロジェクトを開く] をクリックします。
- [プロジェクトを開く] ウィンドウで、[PythonGP.zip] ファイルから展開したフォルダーを参照し、[Python Geoprocessing.aprx] をクリックして選択したら、[OK] をクリックします。
プロジェクトが開きます。 現在のマップに、カナダのトロント市の境界線が表示されます。 このマップに、いくつかのフィーチャクラスを追加します。
- [カタログ] ウィンドウが表示されない場合は、[表示] タブをクリックし、[カタログ ウィンドウ] をクリックします。
- [カタログ] ウィンドウをマップの右側にドッキングします。
- [カタログ] ウィンドウで、[フォルダー] を展開し、[PythonGP] を展開します。
- [Toronto.gdb] ファイル ジオデータベースを展開します。
このジオデータベースには、いくつかのフィーチャクラスが格納されています。
- [ambulances] フィーチャクラスを右クリックして、[現在のマップに追加] をクリックします。
このフィーチャクラスは、トロント市内の救急車の指令センターを表します。
- [fire_stations] および [communities] フィーチャクラスを同じマップに追加します。
これらのフィーチャクラスは、それぞれトロント市内の消防署と地区境界を表します。 このチュートリアルでは、Python を使用して、これらのフィーチャクラスに対して、ジオプロセシング ツールを実行します。
Python ウィンドウでのツールの実行
ArcGIS Pro で、Python を実行する 1 つの方法として、Python ウィンドウがあります。 ここでは、構文に関するヒントが提供されるため、Python コードを初めて記述する場合には、この方法が適しています。
- リボンの [解析] タブをクリックし、[ジオプロセシング] セクションで、[Python] ボタンの右側のドロップダウン矢印をクリックして、[Python ウィンドウ] をクリックします。
[Python] ボタンをクリックすると、Python ノートブックが直接開きます。 ここで、Python コードを記述することもできますが、このチュートリアルでは、Python ウィンドウを使用します。 ノートブックの使用方法については、ArcGIS Pro のノートブックの基本操作チュートリアルをご参照ください。
Python ウィンドウには、2 つのセクションがあります。 上部のセクションをトランスクリプトと呼び、下部セクションをプロンプトと呼びます。 プロンプト セクションにコードを入力すると、トランスクリプト セクションに、実行されたコードとともに、出力された結果やエラー メッセージなどのすべてのメッセージが表示されます。
- Python ウィンドウのプロンプト セクションに次のコードを入力し、Enter キーを押します。
import arcpy
このコード行で、ArcPy パッケージをインポートします。 ArcPy は、ジオプロセシングをはじめとする ArcGIS Pro の多くの機能を Python 内から使用できるようにする Python パッケージです。
注意:
ArcGIS Pro 内で、Python ウィンドウを使用しているため、最初に ArcPy をインポートせずに、ジオプロセシング ツールを実行することができます。 ただし、コードの先頭で import arcpy を常に使用することをお勧めします。そうすることで、ArcGIS Pro の外部でも、同じコードが動作するようになります。
最初に使用するツールは、[XY 座標の追加] ツールです。 フィーチャクラスの属性テーブルを開き、このツールの実行結果を確認します。
- [コンテンツ] ウィンドウで、[ambulances] レイヤーを右クリックし、[属性テーブル] をクリックします。
- マップ、ambulances レイヤーの属性テーブル、Python ウィンドウが見やすくなるように、ArcGIS Pro インターフェイスを配置します。
インターフェイスをどのように配置するかは好みの問題ですが、通常はマップとテーブルを上部に配置し、Python ウィンドウをその下に配置します。
- Python ウィンドウのプロンプト セクションに次のコードを入力し、Enter キーを押します。
arcpy.management.AddXY("ambulances")
Enter キーを押すとコードが実行され、POINT_X フィールドと POINT_Y フィールドが、ambulances フィーチャクラスの属性テーブルに追加されます。
このコード行を実行すると、そのツール ダイアログ ボックスから実行するのと同様に、[XY 座標の追加] ツールが実行されます。 実行したコードが Python ウィンドウのトランスクリプト セクションに表示され、ツールの実行結果が下に表示されます。 この場合、新しいフィーチャクラスは作成されていませんが、既存のフィーチャクラスの属性テーブルが更新されています。 このツールでは、現在のマップ内の既存の ambulances フィーチャ レイヤーへの参照が結果として返されます。
arcpy.management.AddXY("ambulances") コード行は、複数の部分で構成されています。 1 つ目の arcpy は、ほぼすべてのジオプロセシング ツールを含む ArcGIS Pro の多くの機能を Python で使用できるようにする ArcPy モジュールです。 次のエレメント management は、[XY 座標の追加] ツールが含まれているデータ管理ツールボックスのツールボックス エイリアスです。 次のエレメント AddXY は、ArcGIS Pro の [XY 座標の追加] ツールに相当する ArcPy 関数の名前です。
各部分は、ドットで区切られており (これを Python では、ドット表記と呼びます)、スペースはありません。 ArcGIS でのツール名は、[XY 座標の追加] ですが、ArcPy での関数名は、スペースなしの AddXY です。 関数名とツール名が同じになることもありますが、一部の関数名は、このように短くなっています。 Python の関数名には、スペースが含まれていません。 これは ArcPy の関数なので、後ろに括弧 () が付きます。 開き括弧と閉じ括弧の両方が必須です。 括弧内に関数のパラメーターを指定します。これらは、ツール ダイアログ ボックスを使用する場合のツールのパラメーターと同じです。
[XY 座標の追加] ツールの場合、パラメーターは、単一の入力フィーチャクラスの名前だけです。
ツールを実行する構文を別の表記で記述することもできます。 両方知っていると便利なので、両方の表記によるコード サンプルを以下に示します。
- Python ウィンドウのプロンプト セクションに次のコードを入力し、Enter キーを押します。
arcpy.AddXY_management("ambulances")
このコード行を実行すると、XY 座標の追加ツールが再び実行されます。 前の結果は上書きされるため、結果の違いを確認することはできません。
2 つの表記を区別なく使用できます。
arcpy.<toolboxalias>.<toolname> arcpy.<toolname>_<toolboxalias>
2 つ目の表記では、ドットではなく、アンダースコアが使用されます。 つまり、arcpy.<toolname>.<toolboxalias> は間違っており、エラーが発生します。
- Python ウィンドウのプロンプト セクションに次のコードを入力し、Enter キーを押します。
arcpy.AddXY.management("ambulances")
この表記を使用しても、AddXY 関数は見つからないため、エラーが発生します。
Python ウィンドウには、エラーが発生しないコードの記述を支援する、いくつかの組み込み機能があります。
- 次のコード行を入力し、ドットで一時停止します。
arcpy.
ドットの後ろで一時停止すると、候補の長いリストが、アルファベット順に表示されます。 これは、コード オートコンプリート プロンプトと呼ばれます。
リストをスクロールするか、続けて文字を入力していきます。 入力するに従って、候補のリストが更新されます。
- 続けて以下を入力します。
arcpy.man
これにより、ArcPy に含まれている「man」という文字で始まるコード エレメントにリストが絞り込まれます。
- [management] エントリの上に、ポインターを置きます。
ツールボックスのフル ネームを示す小さなポップアップが表示されます。
- リストで、[management] をクリックします。
ツールボックス エイリアスとその後ろに、ドットが追加されます。
arcpy.management.
- 文字 a を入力して、リストを [AddXY] までスクロールしてから、[AddXY() management] をクリックします。
ツール名が追加され、1 組の括弧が自動的に追加されます。
括弧の間にポインターを置くと、マップ上の 2 つのポイント フィーチャクラスの名前を示すポップアップが表示されます。 コード行の下には、そのツールの簡単な説明を含むポップアップが表示されます。 ここには、次のようなツールの構文も表示されます。
management.AddXY(in_features)
これは、ツールのヘルプ ページに掲載されている構文とほぼ同じです。 コードを入力しながら、構文を確認できるのは便利です。 1 つ目 (かつ唯一) のツール パラメーターの簡単な説明も表示されます。
コード行の上には、1 つ目のツール パラメーターの値の候補を示すポップアップが表示されます。 このツールの入力フィーチャは、ポイント フィーチャだけです。 候補の値として、開いているマップ内のすべてのポイント フィーチャ レイヤーが表示されます。 この例では、ポイント フィーチャ レイヤーは、ambulances と fire_stations です。 communities データ レイヤーは、ポリゴン フィーチャ レイヤーなので表示されません。 これらのコード オートコンプリート プロンプトには、意味のある入力フィーチャだけが表示されるため、正しいコードを記述することができます。
- ポップアップで、[fire_stations] エントリをクリックします。
これにより、フィーチャ レイヤーの名前がコード行に追加され、引用符が自動的に追加されます。
arcpy.management.AddXY('fire_stations')
ヒント:
ポインターを Python ウィンドウの外に移動すると、このポップアップは消えます。 ポップアップを再び表示するには、まずコード行内の括弧の外側にポインターを置いてから、括弧の内側にポインターを再び置きます。以上で、コード行が完成しました。
- Enter キーを押して、コード行を実行します。
- [コンテンツ] ウィンドウで、[fire_stations] レイヤーを右クリックし、[属性テーブル] をクリックします。
POINT_X フィールドと POINT_Y フィールドが、フィーチャクラスに追加されています。
- 属性テーブルを閉じます。
次に、コード オートコンプリート プロンプトを使用して、さらに複雑なツール パラメーターを使用するジオプロセシング ツールの正しい構文を取得します。
ツール パラメーターの理解
XY 座標の追加ツールで使用されるパラメーターは 1 つだけなので、コードはとても短くなっています。 ほとんどのジオプロセシング ツールのパラメーターはこれよりも数が多く、必須のパラメーターとオプションのパラメーターがあります。 ツール パラメーターの数が多いツールの例として、バッファー ツールについて見ていきます。
最初に、ヘルプ ページで、このツールの構文を確認します。
- 次の URL を参照します。
- [パラメーター] セクションまで下にスクロールし、[ダイアログ] タブをクリックします。
この表では、ツールのパラメーターとそのデータ タイプについて詳しく説明されています。 ツールのパラメーターについて十分に理解しておくことで、Python コードで、ツールを簡単に使用できるようになります。
- [Python] タブをクリックします。
ここには、Python でのバッファー ツールの構文が示されています。 バッファー ツールは解析ツール ツールボックス内にあるため、コードは arcpy.analysis で始まります。 括弧内にバッファー ツールのパラメーターが指定されています。 これらは、ツール ダイアログ ボックス上のパラメーターと同じであり、同じ順序で指定されています。 各パラメーターには名前が付いており (in_features など)、パラメーターは、カンマとスペースで区切られています。 パラメーターの命名は、Python の変数名の規則に従い、小文字のみが使用され、読みやすさのために、単語がアンダースコアで区切られています。
ジオプロセシング ツールには、必須のパラメーターとオプションのパラメーターがあります。 必須のパラメーターは、オプションのパラメーターより前に指定します。 構文では、中括弧 { } の中に指定されているものが、オプションのパラメーターです。 構文から、バッファー ツールには、必須のパラメーターが 3 つと、オプションのパラメーターが 5 つあることがわかります。
ツール パラメーターがオプションである場合、そのパラメーターには、デフォルト値があります。 オプションのパラメーターの値を指定しなかった場合、デフォルトが使用されます。
最初に、必須パラメーターのみを使用して、バッファー ツールを実行します。
- ArcGIS Pro の [Python] ウィンドウで、プロンプト セクションに、次のコードを入力します。
arcpy.Buf
- ポップアップ リストで、[Buffer() analysis] エントリをクリックします。
キーボードの上矢印と下矢印を使用して、リスト上のアイテムをハイライト表示することもできます。 エントリがハイライト表示されたら、Tab キーを押して、そのアイテムを追加します。
オートコンプリート プロンプトは Buffer_analysis ですが、次の構文を使用して、コードが追加されます。
arcpy.analysis.Buffer()
arcpy.analysis.Buffer() と arcpy.Buffer_analysis() は、同じツールを異なる表記で指定したものです。 どちらも正しいです。
ポインターを括弧の内側に置くと、ツールの構文が下に表示され、1 つ目のパラメーターの候補となるフィーチャ レイヤーが上に表示されます。
バッファー ツールの 1 つ目のパラメーターは、in_features です。 このパラメーターが、構文ポップアップで太字で示されています。 このパラメーターの説明が下に示されています。 ツール パラメーターの指定を完了すると、この表示は更新されます。
- ポップアップで、[fire_stations] をクリックします。
これにより、フィーチャ レイヤーの名前がコード行に追加され、引用符が自動的に追加されます。
arcpy.analysis.Buffer('fire_stations')
- 次に、カンマに続けて、スペースを入力します。
arcpy.analysis.Buffer('fire_stations', )
構文ポップアップで、次のパラメーター out_feature_class が太字で示されます。 これは出力なので、名前の候補は表示されません。
- out_feature_class の名前として、引用符で囲んで、'fire_buffer' と入力します。
コード行が、次のようになりました。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer')
フィーチャクラスの名前を記述する際には、一重引用符と二重引用符のどちらを使用してもかまいません。 フィーチャ レイヤーの候補リストから選択する際に、オートコンプリート プロンプトでは一重引用符が使用されていますが、各文字列を囲む開始引用符と終了引用符が同じスタイルであれば、1 つのコード行で引用符のスタイルが混在していてもかまいません。 たとえば、以下は正しい表記です。
arcpy.analysis.Buffer('fire_stations', "fire_buffer")
これに対し、以下は間違った表記であり、構文エラーが発生します。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer")
- 最後の一重引用符を二重引用符に変更します。
2 つ目のツール パラメーターがオレンジ色でハイライト表示され、構文エラーがあることが示されます。 実行する前であっても、このコード行はエラーになることがわかるので便利です。
- 二重引用符を一重引用符に戻します。
- 次に、カンマに続けて、スペースを入力します。
3 つ目のパラメーターは、バッファーの作成時に使用される距離です。 このパラメーターの値を入力することも、入力フィーチャの属性テーブルのフィールドを使用することもできます。 コード オートコンプリートの候補では、fire_stations フィーチャ レイヤーの各フィールドが示されます。 しかし、ここでは数値を入力します。
- "1000 meters" と入力します (引用符を含む)。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer', "1000 meters")
距離は数値ですが、距離単位も必要です。 したがって、この値は、数値、スペース、距離単位から成る文字列になります。 Python は大部分で大文字と小文字が区別されますが、単位には大文字と小文字のどちらを使用してもかまいません。 このため、"1000 meters"、"1000 METERS"、"1000 Meters" は、すべて正しいものと見なされます。 前述のように、一重引用符または二重引用符のペアを使用することができ、どちらも正しい表記です。
以上で、必須パラメーターの入力が完了しました。 ツールが実行できる状態になっています。 続けて、オプションのパラメーターの値を入力することもできますが、このツールを実行するには、必須ではありません。
- コード行の末尾で、Enter キーを押して、ツールを実行します。
ツールが実行され、Python ウィンドウのトランスクリプトに結果が出力され、結果のフィーチャクラスが、現在のマップに追加されます。
トランスクリプトのツールを実行したコード行の下に、ツールの実行結果が表示されます。 この場合、バッファー ツールの結果として、新しいフィーチャクラスが作成されました。 XY 座標の追加ツールの例では、結果として新しいフィーチャクラスではなく、既存のフィーチャ レイヤーが示されていました。
出力された結果では、新しく作成されたフィーチャクラスの場所が示されています。
<Result 'C:\\Lessons\\PythonGP\\Toronto.gdb\\fire_buffer'>
出力フィーチャクラスを指定する際には、フィーチャクラスの名前だけを指定しました。 このフィーチャクラスが、Toronto.gdb ファイル ジオデータベースに作成されたのはなぜでしょうか? それは、プロジェクトの現在のワークスペースだからです。 Python ウィンドウ内のコードは、アプリケーションの環境設定に従います。
注意:
パスでは、単一のバックスラッシュ (\) ではなく、2 つのバックスラッシュ (\\) が使用されています。 Python では、単一のバックスラッシュは、エスケープ文字として使用されるため、予期しない結果が生じる可能性があります。 2 つのバックスラッシュの代わりに、行を表す文字 r を文字列の前に使用するか ( r"C:\Lessons\PythonGP\Toronto.gdb")、単一のスラッシュを使用することもできます ("C:/Lessons/PythonGP/Toronto.gdb")。 この 3 つは、いずれも正しい表記と見なされ、区別なく使用できます。3 つの必須パラメーターのみを使用して、バッファー ツールを実行しました。 次に、オプションのパラメーターのうちの 1 つを指定して、再度実行します。
- バッファー ツールの構文をもう一度見てみましょう。
arcpy.analysis.Buffer(in_features, out_feature_class, buffer_distance_or_field, {line_side}, {line_end_type}, {dissolve_option}, {dissolve_field}, {method})
dissolve_option パラメーターでは、重なり合っているバッファー ポリゴンの処理方法を指定します。 このパラメーターのデフォルト値は NONE であり、重なり合っているかどうかにかかわらず、個々のバッファーがすべて維持されます。 この値を ALL に設定することで、すべての出力フィーチャがディゾルブされて、重複が解消されます。
先ほどのコードを再度入力する代わりに、先ほどのコード行を読み込むショートカットを使用します。
- プロンプト内にポインターを置いた状態で、キーボードの上矢印キーを押します。
前のバッファー ツールの実行に使用したコード行が読み込まれます。 以前に使用したすべてのコード行で、これを使用できます。 上矢印キーと下矢印キーを使用して、複数のコード行をスクロールできます。 対象のコード行が見つかったら、プロンプト内で変更を加え、Enter キーを押して、コードを再び実行します。
- 3 つ目のパラメーターの末尾の最後の引用符と閉じ括弧の間に、ポインターを置きます。
- カンマに続けて、スペースを入力します。
line_side パラメーターのコード オートコンプリート プロンプトが表示されます。 このパラメーターのデフォルト値は Full です。これを変更する必要はありません。 この値を指定せずに、このパラメーターをスキップすることができます。 パラメーターをスキップするには、空の文字列を指定します。
- 二重引用符を入力します。
2 つ目の引用符は、自動的に追加されます。 コードは、次のようになります。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer', "1000 meters", "")
line_side パラメーターの値は、"" (空の文字列) に設定されています。 これは、このパラメーターにはデフォルト値が使用されることを意味しています。
次のパラメーター line_end_type もスキップできます。
- 4 つ目のパラメーターの末尾の最後の引用符と閉じ括弧の間に、ポインターを置きます。
- カンマを入力し、続けてスペースを入力してから、二重引用符を入力します。
2 つ目の引用符は、自動的に追加されます。 コードは、次のようになります。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer', "1000 meters", "", "")
次に、dissolve_option パラメーターの値を指定します。
- カンマを入力し、続けてスペースを入力してから、引用符を入力します。
- 表示されたオプションのリストから、[すべてディゾルブ] を選択します。
このパラメーターの値として、文字列 ALL が取り込まれます。 オートコンプリート プロンプトでは長い説明が表示されますが、コードでは 'ALL' と示されることに注意してください。 これは、このパラメーター キーワードが ALL であるためです。これは、ツールのドキュメントに記載されています。 長い説明はキーワード ラベルであり、ツール ダイアログ ボックスで、このパラメーターに表示される選択肢と一致しています。 コードを手入力する場合、パラメーター キーワードを Python 文字列として入力する必要があります ('ALL' や "ALL" など)。
コードは、次のようになります。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", "", "", 'ALL')
最後に、この場合は、出力フィーチャクラスの名前を変更すると便利です。名前を変更することで、ディゾルブされていない以前のバージョンと区別できるようになります。
- 出力フィーチャクラスの名前を 'fire_buffer' から 'fire_buffer_diss' に変更します。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", "", "", 'ALL')
このツールを実行する準備が整いました。
- Enter キーを押して、ツールを実行します。
結果のフィーチャクラスがアクティブなマップに追加され、出力フィーチャクラスの名前とパスが、コード行の下に出力されます。 バッファーがディゾルブされ、すべて重なり合っていません。
オプションのパラメーターをなぜスキップする必要があるのか、疑問に思われたかもしれません。 その理由は、このツールの構文では、パラメーターの順序が事前に定義されているからです。 dissolve_option パラメーターは、6 番目のパラメーターです。 パラメーター名を明示的に指定しない場合、この順序を維持する必要があります。 この順序が維持されなかった場合、どうなるか見ていきましょう。
- プロンプト内にポインターを置いた状態で、キーボードの上矢印キーを押して、先ほどのコード行を読み込みます。
- コード行から、スキップした 2 つのパラメーターを削除します。 コードは、次のようになります。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", 'ALL')
- Enter キーを押して、コードを実行します。
これはエラーになります。
つまり、ALL が 4 つ目のパラメーター line_side の値として使用されます。 このパラメーターに有効な値は、Full だけなので、ここで ALL を使用すると、エラーが発生します。
空の文字列 ("") を使用して、オプションのパラメーターをスキップする以外に、いくつかの方法があります。 番号記号 ("#") または値 None を使用することもできます。 この結果、以下の行はいずれも正しい表記と見なされ、区別なく使用できます。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", "", "", 'ALL')
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", "#", "#", 'ALL')
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", None, None, 'ALL')
番号記号は、引用符で囲む必要があります。つまり、# ではなく、"#" と指定します。 引用符がない番号記号は Python ではコメントに使用されるため、ここでは使用できません。
これに対し、値 None には引用符を付けません。 None はキーワードであり、Python では、それ自体がデータタイプです。 これは空の文字列と同じではありませんが、ここでは同じ効果があります。 一部のツール パラメーターでは、その値として "NONE" を使用できるため、これによって、いくらかの混乱が生じることがあります。 値 None は、オプションのパラメーターをスキップするときに使用し、実質的にはデフォルト値が使用されます。 値 "NONE" は、その文字列値自体にパラメーターの値を設定するときに使用します。
オートコンプリートを使用して、[Python] ウィンドウで、ジオプロセシング ツールを実行するための正しい構文を取得する方法について学習しました。 次に、複数のパラメーターを名前によって指定し、複数の入力行を [Python] ウィンドウに追加する方法について見ていきます。
名前によるツール パラメーターの指定
デフォルトのままにすることができるオプションのパラメーターを、空の文字列、番号記号、または None を使用してスキップする代わりに、その名前によって、パラメーターを指定することができます。
- プロンプト内にポインターを置いた状態で、キーボードの上矢印キーを押します。
- 次のように、コード行を変更します。
arcpy.analysis.Buffer('fire_stations', 'fire_buffer_diss', "1000 meters", dissolve_option='ALL')
dissolve_option パラメーターが、'ALL' に設定されています。
- Enter キーを押して、コードを実行します。
ツールはエラーは発生せず、正しく実行されます。
デフォルト以外の値を必要とするオプションのパラメーターを指定する際の、複数のソリューションについて見てきました。
- デフォルトのままにするオプションのパラメーターを、空の文字列 ("")、番号記号 ("#")、またはキーワード None を使用してスキップして、対象のオプションのパラメーターに移動します。
対象のオプションのパラメーターをその名前によって指定し、デフォルトのままにする、その他すべてのオプションのパラメーターは省略します。
これらのソリューションはすべて正しく、どの方法を使用するかは好みの問題です。 どれか 1 つのスタイルを使い続けてもかまいませんが、他の人が記述したコードでは、他のスタイルも使用されているため、他のスタイルについて理解しておくのがよいでしょう。
ツール パラメーターをその名前によって指定するという方法は、オプションのパラメーターで使用できますが、次のように、同じアプローチをすべてのパラメーターに適用することができます。
arcpy.analysis.Buffer(in_features='fire_stations', out_feature_class='fire_buffer_diss', buffer_distance_or_field="1000 meters", dissolve_option='ALL')
ツール パラメーターをその名前によって指定する場合、スペースを使用してもコードの実行には影響がありませんが、慣例では = 演算子の前後にスペースを追加しません。 また、パラメーターを名前で指定した場合、それ以降のすべてのパラメーターを名前で指定する必要があります。
これらの名前はすべて、ツールの構文ヘルプに記載されているとおりのパラメーター名であることに注意してください。名前によるパラメーターの指定が機能するためには、パラメーター名が記載どおりである必要があります。
これによってコードはかなり長くなりますが、コードの中でパラメーターが説明されているため、コードを確認して理解するのが簡単になります。 パラメーターの数が少ない比較的単純なツールでは、このような説明は必要ないかもしれません。 しかし、多数のパラメーターを使用した複雑なツールの既存のコードを確認する際には、このような説明があることで、コードを理解しやすくなり、構文を調べる必要がなくなります。
パラメーター名を使用した場合のマイナス面としては、コード行が非常に長くなり、Python コードの推奨最大長である 79 文字より長くなることがあります。 これを解決するには、コード行を複数の行に分割します。
arcpy.analysis.Buffer(in_features='fire_stations', out_feature_class='fire_buffer_diss', buffer_distance_or_field="1000 meters", dissolve_option='ALL')
これによって、コード行が複数の行に分割されて読みやすくなりますが、引き続き 1 つのコード行として実行されます。 このスタイルでは、いわゆる非明示的な行継続が使用されます。 Python では、開き括弧の後ろで、閉じ括弧を指定する必要があります。 この閉じ括弧は 1 行目には存在しないため、閉じ括弧がくるまで以降の数行は、同じコード行の一部と見なされます。 位置を揃えるために追加の空白が使用されており、これはインデントとは見なされません。
次に、これら複数の行を Python ウィンドウで作成します。
- Python ウィンドウに、次のコードを追加します (ただし、Enter キーは押さないでください)。
arcpy.analysis.Buffer(in_features='fire_stations', out_feature_class='fire_buffer_diss', buffer_distance_or_field="1000 meters", dissolve_option='ALL')
次に、このコードを複数の行に分割します。 通常、これを行うには Enter キーを押しますが、 Python ウィンドウで Enter キーを押すと、コード行が実行されます。 コードを実行することなく改行するには、代わりに Shift + Enter キーを押す必要があります。
- 1 つ目のパラメーター in_features='fire_stations', のカンマの後ろにポインターを置き、Shift + Enter キーを押します。
- 2 つ目のパラメーター名の前にスペースを追加して、1 つ目のパラメーターと位置を揃えます。
- 2 つ目のパラメーターのカンマの後ろにポインターを置き、Shift + Enter キーを押します。
- 3 つ目のパラメーターのカンマの後ろにポインターを置き、Shift + Enter キーを押します。
パラメーターごとに改行されましたが、これらはすべて括弧で囲まれているため、Python は、このブロックを 1 つのコード行と見なします。
ツール パラメーターの位置を揃えると、さらに読みやすくなります。
- Enter キーを 2 回押して、ツールを実行します。
Python エディターによって、非明示的な行継続の処理方法は若干異なります。 たとえば、IDLE や PyCharm などのエディターでスクリプトを記述している場合、最初の一連のスペースは手動で入力する必要がなく、複数の行の位置が自動的に調整されます。
このようにパラメーターを複数の行に分割するのは読みやすさを向上させるための余分な作業だと思われるかもしれません。 Python ウィンドウでは、読みやすさが大きく向上することはないかもしれませんが、スクリプト エディターでさらに長いスクリプトを記述する際には、読みやすさが大幅に向上することがあります。 非明示的な行継続はサンプルでも使用されているため、これについて理解しておくと役立ちます。
ワークスペースの設定
これまでの例では、Toronto.gdb ジオデータベースをワークスペースとして使用してきました。 ワークスペースは、ジオプロセシング ツールの入力データセットと出力データセットなど、コードで操作するデータセットのデフォルトの場所です。 Python ウィンドウを使用している場合、ワークスペースは、ArcGIS Pro の環境設定によって制御されます。 現在のワークスペースを Python ウィンドウで確認できます。
- プロンプトで次のコードを入力し、Enter キーを押します。
print(arcpy.env.workspace)
次のパスが返されます。
C:\\Lessons\\PythonGP\\Toronto.gdb
ワークスペースを変更するには、いくつかのオプションがあります。 1 つ目として、ArcGIS Pro プロジェクトのワークスペースを変更できます。 これは Python ウィンドウを使用している場合には便利ですが、ArcGIS Pro の外部の IDLE や PyCharm などの Python エディターで同じ Python コードを使用している場合には機能しません。 2 つ目として、ツールの入力と出力のパラメーターとして、完全なパスを使用できます。 これは機能しますが、コード内のパスが何度も繰り返されて非常に長くなる可能性があります。 これによってコードが読みにくくなって、ロバスト性が低下します。 3 つ目として、Python コードを使用して、ワークスペースを設定することができます。これが最適な方法です。
ワークスペースを設定するコード行を追加します。
- プロンプトで、次のコードを入力します。
arcpy.env.workspace =
次に、ワークスペースを Python 文字列として指定する必要があります。 これを入力することもできますが、[カタログ] ウィンドウから、パスをドラッグすることもできます。
- [カタログ] ウィンドウで、[Results.gdb] をクリックして、Python プロンプト内にドラッグします。
パスが、プロンプトに追加されます。
ワークスペースだけでなく、フィーチャクラスやその他のデータ エレメントを Python ウィンドウ内のコードにドラッグすることもできます。 これらのエレメントをドラッグすると、適切なフォーマットの完全なパスが結果として取得されるので便利です。 これによって時間が節約され、スペル ミスをなくすことができます。
- Enter キーを押して、コード行を実行します。
ワークスペースが設定され、アプリケーション レベルのワークスペースがオーバーライドされます。 つまり、この時点から、Python ウィンドウでコードを実行すると、このワークスペースが使用されるようになります。 環境で設定されているワークスペースは変わらないため、各ツールのダイアログ ボックスから実行されたツールでは、これまでのワークスペースが引き続き使用されます。
次に、バッファー ツールをもう一度実行して、ワークスペースを変更した影響を確認します。
- プロンプト内にポインターを置いた状態で、キーボードの上矢印キーを押して、[バッファー] ツールの直近の実行を読み込みます。
- ポインターをコード行の末尾に置いた状態で、Enter キーを 2 回押します。
- [Results.gdb] を展開します。
新しいフィーチャクラスが、このジオデータベースに追加されます。
入力フィーチャクラスは、fire_stations です。 このフィーチャクラスは、現在のワークスペース (Results.gdb) 内には存在しません。 ただし、fire_stations は、現在のマップ内のフィーチャ レイヤーです。 Python ウィンドウで、ジオプロセシング ツールを実行する際、現在のマップ内のフィーチャ レイヤーとディスク上のフィーチャクラスの両方を入力として使用できます。 つまり、使用中のワークスペースを把握していることが重要です。
- プロンプトで次のコードを入力し、Enter キーを押します。
arcpy.management.AddXY("fountains")
これはエラーになります。
ERROR 000732: Input Features: Dataset fountains does not exist or is not supported Failed to execute (AddXY).
fountains フィーチャクラスは、Python ウィンドウのワークスペースではなくなった Toronto ジオデータベース内に存在します。 このフィーチャクラスは、アクティブなマップに追加されていないため、見つかりません。
ワークスペースにないフィーチャクラスを操作するには、先にそのフィーチャクラスをアクティブなマップに追加するか、フル パスを使用する必要があります。 フル パスを追加します。
- 上矢印キーを押して、先ほどのコード行を読み込みます。
- フィーチャクラス名 "fountains" を削除します。
コードは、次のようになります。
arcpy.management.AddXY()
- [カタログ] ウィンドウで、Toronto.gdb を展開し、[fountains] フィーチャクラスを Python プロンプト内にドラッグします。
fountains フィーチャクラスへのフル パスが、ツール パラメーターに追加されます。
- ポインターをコード行の末尾に置いた状態で、Enter キーを押します。
XY 座標の追加ツールが、エラーなしで実行されます。 フル パスを使用すると、この 1 つのコード行についてのみ、ワークスペースがオーバーライドされます。
ほとんどのスクリプトでは、最初にスクリプトの先頭で、ワークスペースを設定します。 一般的に行われている設定が、もう 1 つあります。 ArcGIS Pro プロジェクトのオプションの 1 つを使用して、ジオプロセシング ツールが既存のデータセットを上書きすることを許可することができます。 これにより、同じツールを複数回実行するのが簡単になります。 Python では、次のコード行を実行することで、このプロパティを設定します。
arcpy.env.overwriteOutput = True
ジオプロセシング ツールを使用した典型的なスクリプトは、一般的に次のようなコードで始まります。
import arcpy arcpy.env.workspace = <path to workspace as a string> arcpy.env.overwriteOutput = True
<path to workspace as a string> は、ワークスペースへの実際のパスに置き換えます。
Python ウィンドウを使用している場合、インポートと環境は、ArcGIS Pro によって制御されます。つまり、これらの行は必要ありません。 ただし、IDLE や PyCharm などの Python エディター内のスタンドアロン スクリプトでは、インポートの使用と環境設定が必要なので、これらを含めることをお勧めします。
履歴からのコードのエクスポート
最後に、ジオプロセシング ツールを実行するコードを記述する際に役立つアプローチがもう 1 つあります。 ツールをそのツール ダイアログ ボックスから実行し、その実行したコードを履歴ウィンドウから Python ウィンドウにエクスポートすることができます。
- [カタログ] ウィンドウで、[Toronto.gdb] ジオデータベースを参照します。
- アクティブなマップに、[greenspace] フィーチャクラスおよび [etobicoke] フィーチャクラスを追加します。
- リボンの [解析] をクリックし、[ジオプロセシング] グループで、[ツール] をクリックします。
- [ジオプロセシング] ウィンドウで、検索バーに「クリップ」と入力して、Enter キーを押します。
- [クリップ] ツールをダブルクリックします。
- [入力フィーチャ] で、[greenspace] を選択します。
- [クリップ フィーチャ] で、[etobicoke] を選択します。
- [出力フィーチャまたはデータセット] で、[Results.gdb] を参照し、出力フィーチャクラスに「greenspace_clip」という名前を付けます。
- [実行] をクリックします。
クリップ ツールが実行され、結果のフィーチャクラスが、マップに追加されます。
- リボンの [ジオプロセシング] グループで、[履歴] をクリックします。
[ジオプロセシング履歴] ウィンドウが表示されます。
クリップ ツール ウィンドウの下部にある [履歴を開く] をクリックして、履歴を開くこともできます。
- [ジオプロセシング履歴] リストで、[クリップ] を右クリックして、[Python ウィンドウに送信] をクリックします。
クリップ ツールを実行する Python コードが、Python ウィンドウに送信されます。 これはコードの一部であり、コード スニペットと呼ばれます。
注意:
この他のオプションとして、[Python コマンドのコピー] と [Python スクリプトとして保存] があります。 結果のコードは同じですが、これらのオプションは ArcGIS Pro の外部で、Python エディターを使用したり、ノートブックを使用したりして作業する場合に役立ちます。1 つ目と 2 つ目のパラメーターは、フィーチャ データ レイヤーの名前であり、パスは含まれていません。 3 つ目のパラメーターは、出力フィーチャの名前であり、フル パスが含まれています。 ワークスペースは先ほど、arcpy.env.workspace を使用して設定したので、このパスは必要ありません。 最後のパラメーター (ツール ダイアログ ボックスに表示されていない cluster tolerance) は、デフォルト値 None のままにするため、省略できます。 このため、コードを短くすることができます。
- コードを次のように単純化します。
arcpy.analysis.Clip("greenspace", "etobicoke", "greenspace_clip")
- このコードを実行して、これが機能することを確認します。
クリップ ツールは以前に同じ設定で実行されているため、何も変化がないように見えるかもしれません。 これをテストするため、greenspace_clip レイヤーをアクティブなマップから削除し、ツールを再び実行します。 今度は、結果のフィーチャクラスがマップに追加されたことがわかります。
ツール ダイアログ ボックスからツールを実行した後で、ジオプロセシング履歴から Python コードをコピーする方法について学習しました。 これはツールの構文を理解する上で役立ちますが、デフォルトのままにしておけるパラメーターは省略するなど、最適な方法に従うためには、コードを整理する必要が生じることがあります。
確認
- Python コードを使用して、ジオプロセシング ツールを実行できます。 ジオプロセシング ツールについて十分に理解することで、コードを簡単に記述できるようになります。
- Python ウィンドウには、各種コード オートコンプリート プロンプトやその他の構文ヘルプなど、コードの記述を支援する、いくつかの機能が備わっています。
- ツール パラメーターには、必須のパラメーターとオプションのパラメーターがあります。 デフォルトのままにしておけるオプションのパラメーターは、コードから省略することができます。 オプションのパラメーターを使用する必要がある場合、必要に応じてその他のオプションのパラメーターをスキップするためのオプションがいくつかあります。
- ツール ダイアログ ボックスからのツールの実行結果を Python コードにエクスポートして、Python でツールを実行するときの出発点として使用することができます。
このチュートリアルでは、Python ウィンドウでジオプロセシング ツールを実行する方法と、Python 構文ヘルプを取得する方法について学習しました。 ツール パラメーター、必須のパラメーターとオプションのパラメーター、パラメーターの指定方法について学習しました。 Python ウィンドウでのデータへのパスとジオプロセシング環境の振舞いについて学習しました。 最後に、実行されたジオプロセシング ツールのコードをジオプロセシング履歴から Python ウィンドウにコピーする方法について学習しました。
また、Esri Press から出版されている Paul A. Zandbergen 博士による Python Scripting for ArcGIS Pro、Advanced Python Scripting for ArcGIS Pro についても、ぜひお読みください。