こちらの Python Tips and Tricks for ArcGIS トレーニングセミナーをご覧ください。@DerekNelson1 と私は、繰り返しの作業や複雑なワークフローを自動化するための数十の戦略を紹介しています。
最初から始める前に既存のソリューションを探しましょう。
ほとんどの場合、誰かが似たような問題に直面しており、その問題解決に役立つPythonモジュールを作成しています。
ArcPyはArcGIS Proで行うタイプのタスク向けです。
ジオプロセシングタスクを自動化したり、ローカルファイルやデータベースを操作したい場合、ArcPyライブラリにはグラフィカルユーザーインターフェイスで手動で行うことを再現するPython関数があります。
ArcGIS API for Pythonはポータルで行うタイプのタスク向けです。
ArcGIS OnlineまたはArcGIS Enterpriseポータル内のユーザー、グループ、コンテンツの管理を自動化することは、ArcGIS API for Pythonの優れたユースケースです。Python APIにはローカルデータまたはフィーチャサービスからSpatially Enabled DataFrameを作成するツールもあります。これはPandas DataFrameの拡張であり、空間的なプロパティや地理データを扱うメソッドとともに、Pandasの強力な表形式データ操作機能を備えています。
ノートブックはコードによる教育、共有、ストーリーテリングに最適です。
コードをセルに分割し、マークダウンでコードの説明を追加し、出力もノートブック内に含めることができるため、ノートブックはコードの反復作業や他者がノートブック内の作業内容とその重要性を理解するのに強力なツールとなります。
IDEはコードを書くのを簡単にする強力なツールです。
PyCharmやVS Codeなどの統合開発環境には、高度なデバッグツール、エラー・警告検出、自動リンティング、有用なコード補完ツールが含まれており、多くのコードを書くことを容易にします。さらに最近ではAIコードアシスタントと統合されて開発速度がさらに加速されています。
Python環境の管理は難しいです。問題に直面することを覚悟してください。
Python環境内のすべてのモジュールは互いに互換性が必要です。環境を微妙な形で壊してしまうことは簡単です。
課題を最小限に抑えるためにArcGIS ProのデフォルトPython環境を使用しましょう。
幸いにも、ArcGIS Proに付属するarcgispro-py3環境にはEsri開発者が厳選したパッケージセットがあり、大多数のGISタスクに必要なライブラリが含まれています。このデフォルト環境は変更できないため、ArcGIS Proで作業している限り少なくとも1つは動作するPython環境があります。
カスタム環境を作成するにはデフォルト環境をクローンしましょう。
arcgispro-py3に含まれていない追加ライブラリが必要な場合は、デフォルト環境をクローンし、ArcGIS ProのProjectタブ内Package Managerからそれらのライブラリを追加できます。conda経由で数千ものPythonライブラリにアクセスでき、インターフェイスからインストール可能です。
高度な環境管理にはcondaを使いましょう。可能ならpipは避けてください。
一部の高度なタスクではArcGIS Proインターフェイスだけでは対応できない複雑な環境管理が必要です。そのような場合はコマンドプロンプトからcondaへアクセスできます。特定チャネルからパッケージ取得や環境テキストファイルへのエクスポートなどが可能です。pipでもパッケージインストールはできますが、pipは依存関係すべてを完全には解決しないため互換性問題が起こるリスクがあります。必要なパッケージがcondaチャネルになければpip使用もやむなしですが、可能なら避ける方が良いです。
Package Managerでパッケージ/ライブラリ依存関係とライセンス情報を確認しましょう。
Package Managerはインストール済みライブラリすべての依存関係特定に役立ちます。またインストール可能パッケージごとのライセンスへのリンクも提供し、ご利用ケースとライセンス条件との適合性確認ができます。
Pythonウィンドウ/Notebookへ送信しましょう。
ジオプロセシングペインからツールをドラッグ&ドロップすると、そのツール用正しい構文がPythonウィンドウに得られます。最近のArcGIS ProではArcGIS Notebookにもドラッグ可能です。
ModelBuilderモデルなど既存リソースを活用しましょう。
既存モデルで処理できる場合、それを書き直す必要はありません。スクリプト内でジオプロセシングツールとして呼び出せます。またArcGIS ProにはモデルをPythonコードとしてエクスポートする機能もあります。
コード実行前にファイルやフィーチャクラスが存在するか確認しましょう。
Exists関数で特定データオブジェクトが実際に存在するかテストできます。存在しない場合、一部コード実行をスキップ可能です。早期リターン戦略でコード実行速度向上につながります。
実行前に行/値が存在するか確認しましょう。
データオブジェクトが存在しても空の場合があります。GetCount関数でテーブルが空か判別し、その場合コード実行スキップできます。
モデル要素にパラメーター化してユーザー入力可能にしましょう。
パラメーター付きモデルはスクリプトへの組み込みが容易であり、プログラム的に異なる入力値を挿入できます。
ArcGIS Pro GUIからPythonコマンドコピー
ジオプロセシングペインでツールを開くと、「実行」ボタン横に小さな上矢印があります。その中に「Copy Python Command」オプションがあります。これでGUI上で設定したパラメーター内容と対応するPython関数呼び出し用スニペットがコピーされます。これはArcGIS Proでジオプロセシング経験者だがPython初心者向け最も効果的なヒントです。またジオプロセシング履歴内任意アイテム右クリックでも同様スニペット取得可能です。
ArcGIS Pro UI内でパスコピー機能活用しましょう。
ファイルパス入力は面倒でミスしやすいですが、Catalogペイン内データオブジェクト右クリックして「Copy Path」すれば入力不要になります。
コード作成中は期待通り結果が返っているか定期的に確認しましょう。
動作確認なしに何時間も書き続けると失敗時チェックすべきバグ箇所が増えます。頻繁なチェックで問題箇所早期発見につながります。
Seabornはチャート/グラフ作成に最適です。
グラフィカル可視化はあなたや他者によるデータ理解促進に役立ちます。Seabornはその可視化作成によく使われるライブラリであり、ノートブック上ならコードと共に直接出力結果も確認できます。
import seaborn as sns
# 値の辞書
cryptid_data = {
"Lochness Monster":LochnessMonsterCount,
"Chupacabra":ChupacabraCount,
"Bigfoot":BigfootCount
}
# 辞書から棒グラフ
cryptid_plot = sns.barplot(
x=list(cryptid_data.keys()),
y=list(cryptid_data.values())
)
ログイン認証情報をコード内に絶対書かないでください。
これは非常に大きなセキュリティリスクです。ArcGIS API for PythonではArcGIS Pro、Notebook ServerまたはArcGIS Online上で作業している場合、ご自身の環境認証情報を活用できます。
ノートブック。プロファイルも使用でき、これはオペレーティングシステムのシークレット管理ツールを利用したり、セキュリティ証明書を使用するPKIを利用したりします。詳細については
異なる認証スキームの操作方法 のドキュメントをご覧ください。<\/P>
ノートブックは画像、ハイパーリンク、フォーマットされたテキストを含むリッチな出力が可能です。<\/STRONG><\/P>これがノートブックが教育や共有に非常に優れている理由の一部です。リッチな出力は、コードで行った作業の結果をよりよく理解するのに役立ちます。<\/P>ArcGIS API for Pythonで検索を絞り込むために追加のパラメーターを使用してください。<\/STRONG><\/P>ContentManagerのsearchメソッドはカテゴリやitem_type、または複数のフィールドに対するクエリで検索できます。いくつかの例示的なクエリはこのナレッジベース記事で確認できます。<\/P>操作するオブジェクトには意味のある変数名を割り当てましょう。<\/STRONG><\/P>変数名を割り当てることで作成した値を活用できます。意味のある名前を付けることで、その値が何を意味しているか理解しやすくなります。 <\/P> <\/P>x = 2405<\/code><\/pre> <\/P>これは特に意味がありません。<\/P> <\/P>population = 2405<\/code><\/pre> <\/P>スクリプト内でその値に関連する文脈を提供します。<\/P>操作しているオブジェクトの具体的なタイプに注意してください。<\/STRONG><\/P>異なるオブジェクトは異なるプロパティとメソッドを持っています。似たタイプのオブジェクト、例えばFeatureLayerCollection、FeatureLayer、およびFeatureSetなどで混同しやすいです。typeチェックを使って何を操作しているか確認し、そのオブジェクトで何ができるかはドキュメントで確認してください。<\/P>22arcpy <やりたいこと>22で検索しましょう。<\/STRONG><\/P>GoogleやBingなどの検索エンジンはほぼ常に最初の数件の検索結果で正しいドキュメントを返します。Esri CommunityやStack Exchangeからの結果も質問者からの情報なので有益なリソースとなる傾向があります。同じ質問が既に誰かによってされている可能性が高く、その解決策を見ることができます。<\/P>ドキュメントはあなたの最高の友達です<\/STRONG><\/P>誰も全てを覚えていません。一番重要なスキルはドキュメントに慣れることです。サンプルコードを使って様々な関数やオブジェクトがどのように動作するか見てみましょう。<\/P>位置引数だけでなくキーワードargumentsも使いましょう。<\/STRONG><\/P>関数呼び出し時に引数順序だけに頼らずキーワードを使うことでコードが読みやすくなります。一部のオプションパラメーターを省略でき、後からコードを見る人にも各値が何のためか分かりやすくなります。<\/P>help()または?を活用しましょう。<\/STRONG><\/P>オブジェクトをhelp関数に渡すと開発環境から離れずにその関数のドキュメントへアクセスできます。これによりコンテキスト切替えによる認知コストが減り、コードを書く作業に戻りやすくなります。ノートブック環境ではオブジェクト名に?を付けるときれいにフォーマットされたドキュメントが得られます。<\/P>リストとループを使ってデータをバッチ処理しましょう。<\/STRONG><\/P>ArcPyにはListWorkspacesやListFilesなど複数のリスト関数があり、自動的にデータオブジェクトのリストを生成します。一度リストがあれば、その中の全アイテムに対してループ処理でタスク実行できます。<\/P> <\/P># ワークスペース設定
arcpy.env.workspace = r"C:\Input_Data"
# そのワークスペース内の全ファイルジオデータベース一覧取得
fgdbs = arcpy.ListWorkspaces(workspace_type="FileGDB")
# ワークスペース内全ファイルジオデータベースごとにモデル実行
for gdb in fgdbs:
arcpy.PythonTipsandTricksatbx.Model1(Database=gdb)<\/code><\/pre> <\/P>定期的なタスクをスケジュールしましょう<\/STRONG><\/P>毎月、毎週、あるいは毎分実行する必要がある処理はスケジュール可能です。ローカルツールはArcGIS Proインターフェイスからスケジュール可能です。またArcGIS Notebook ServerやArcGIS Online上で実行されるノートブックもスケジュール可能です。<\/P>A rcpyジオプロセシングツールの動作制御には環境変数を設定しましょう<\/STRONG><\/P>ワークスペース設定、出力上書き許可、出力空間参照指定など任意のジオプロセシング環境変数はArcPyのenvクラスで宣言できます。ただし全てのツールが全ての環境変数に対応しているわけではないので、対象ツール固有のドキュメントで対応状況をご確認ください。<\/P>ファイルパスには変数を使い、関数パラメーターへ直接ハードコーディングしないようにしましょう。<\/STRONG><\/P>ファイルパスは長く読みづらく、多くの場合データが何を意味するか反映していません。それらを変数名へ割り当てることでパス参照が簡潔になり、そのデータへの適切な文脈情報も与えられます。<\/P>Describe関数でデータ要素情報を取得しましょう。<\/STRONG><\/P>ユーザーインターフェイスではデータ要素について調べたい場合通常右クリックしてプロパティ選択します。しかしスクリプトでは右クリックできません。Describe関数はそのデータ要素全プロパティ保持オブジェクトを作成します。そのプロパティへアクセスしスクリプト内で利用可能です。 <\/P> <\/P>import pandas as pd
import arcpy
# ArcPyツールはワークスペース環境変数対応だがpandasは非対応
# Describeで要素フルファイルパス抽出
arcpy.env.workspace = r"C:\Data"
delays = "AA_delays_jan_2023.csv"
desc = arcpy.Describe(delays)
delays_df = pd.read_csv(desc.catalogPath)<\/code><\/pre> <\/P>表形式データ操作にはpandasライブラリを使いましょう。<\/STRONG><\/P>テーブルやフィーチャクラスをpandas DataFrameへ取り込むことで強力なライブラリ機能によるクリーンアップ、集計、グループ化など多彩な処理が可能になります。またArcGIS API for PythonによるSpatially Enabled DataFrame拡張機能では標準pandas機能と地理空間機能両方利用できます。<\/P> <\/P>delays_df.fillna(0, inplace=True)
airport_group = delays_df.groupby(['ORIGIN_AIRPORT_SEQ_ID'])
delays_by_airport_df = airport_group.agg({'WEATHER_DELAY': 'mean'})<\/code><\/pre> <\/P>非空間データと空間データ結合し空間解析ツール活用しましょう。<\/STRONG><\/P>扱うデータセットは暗黙的には空間的でも実際にはジオメトリなしの場合があります(例:既知地点情報や座標ではなく住所のみ)。これらもJoin、Spatial Join、Geocodingなどで位置ジオメトリと結合できれば空間解析へ組み込めます。またSpatially Enabled DataFrameならpandas merge関数で空間・非空間データ結合し新たなSpatially Enabled DataFrame作成可能です。<\/P> <\/P>airports_sdf = pd.DataFrame.spatial.from_featureclass(airports_fc)
airport_delays_sdf = airports_sdf.merge(
right=delays_by_airport_df,
how='inner',
left_on='AIRPORT_SEQ_ID',
right_on='ORIGIN_AIRPORT_SEQ_ID'
)<\/code>
<\/
>P
Spatially Enabled DataFrames は多くのジオプロセシングツールへの入力として利用可能です。
DataFrame はフィーチャクラスではありませんが、多くのツール用途ではフィーチャクラスとして扱えます。それによって追加処理目的でDataFrame を新形式へエクスポートする必要がなく便利です。
# DataFrame をフィーチャクラスへ空間結合
arcpy.analysis.SpatialJoin(
airport_delays_sdf,
climate_data,
delays_by_airport_weather,
match_option=22CLOSEST22
)<\/
code>
変数を使ってコード可読性向上させましょう。
ジオプロセシングツールを連結するのがより簡単になります。<\/STRONG><\/P>
複雑な解析では、あるツールの出力を別のツールの入力として渡したいことがよくあります。変数を使うと、ジオプロセシングツールのコード全てを変更せずに変数の値を変えられるため、柔軟なコードを書くのが簡単になります。 <\/P>
<\/P>
# DataFrameをフィーチャクラスに空間結合