ArcGIS 10 で導入された ArcPy は、ArcGIS 9.2 で導入された arcgisscripting モジュールを含み、さらに拡張した Python サイト パッケージです。 ArcPy は Python スクリプトを開発するための豊富な機能を備えたダイナミックな環境を提供し、さらにコード補完機能とそれぞれの関数、モジュール、およびクラスに対応する統合されたドキュメントを備えています。
ArcPy で記述された ArcGIS アプリケーションとスクリプトは、あらゆる分野の GIS プロフェッショナルとプログラマーが開発した、数々の Python モジュールにアクセスし、連携できるというメリットがあります。 Python 内で ArcPy を使用するもう 1 つの大きなメリットとして、Python が汎用的なプログラミング言語であり、学習しやすく、使いやすい点が挙げられます。 Python の解釈と入力は動的に行われるため、対話的な環境の中でスクリプトのプロトタイプをすばやく作成し、テストできます。その間も、大規模なアプリケーションの記述をサポートするパワーは維持されます。
# Importing arcpy
import arcpy
# Set the workspace environment and run Clip_analysis
arcpy.env.workspace = 'C:/Data/Tongass'
arcpy.Clip_analysis('standb4', 'clipcov', 'standby_clip', 1.25)
ArcPy をインポートした後、ArcGIS とともにインストールされる標準ツールボックスにあるジオプロセシング ツールがすべて実行可能になります。
- [解析] ツールボックス
- [カートグラフィ] ツールボックス
- [変換] ツールボックス
- [データ管理] ツールボックス
- [編集] ツールボックス
- [ジオコーディング] ツールボックス
- [リニア リファレンス] ツールボックス
- [マルチディメンション] ツールボックス
- [空間統計] ツールボックス
モジュールのインポート
通常、モジュールは、関数とクラスで構成された Python ファイルです。ArcPy は、データ アクセス モジュール(arcpy.da)、マッピング モジュール(arcpy.mapping)、ArcGIS Spatial Analyst extension モジュール(arcpy.sa)、および ArcGIS Network Analyst extension モジュール (arcpy.na) などさまざまなモジュールでサポートされています。
モジュール全体をインポートするには、次のようにインポート モジュールを使用します。
# Import only arcpy.mapping
import arcpy.mapping
当然、Python には、その他のコア モジュールやサードパーティ モジュールも多数あります。 Python の os モジュールと sys モジュールも使用したい場合は、同様にして、次のようなインポートを使用できます。
# Import arcpy, os and sys
import arcpy
import os
import sys
多くの場合、モジュール全体を計画したり、使用したりする必要性はありません。 モジュールの一部のみをインポートする 1 つの方法としては、from-import ステートメントを使用します。 次の例では env クラスをインポートします (env クラスにはすべてのジオプロセシング環境が含まれます)。 これで、環境に arcpy.env という名前でアクセスする必要がなくなり、env に単純化できます。
# Import env from arcpy and set the workspace environment
from arcpy import env
env.workspace = 'c:/data'
同様に、スクリプトをより読みやすくするために、あるいは長すぎるデフォルト名を短縮するために、モジュールまたはモジュールの一部の表記を考えるのも一案です。 このような場合には、from-import-as という形式を使用できます。 前述の例と同様に、次の例でも env クラスをインポートしますが、ENV という名前をこのクラスに割り当てます。
# Import env from arcpy as ENV and set the workspace environment
from arcpy import env as ENV
ENV.workspace = 'c:/data'
マッピング モジュールを同じ方法でインポートすることもできます。
# Import the mapping module from arcpy as MAP and create a MapDocument
# object
from arcpy import mapping as MAP
mxd = MAP.MapDocument('C:/maps/basemap.mxd')
このほかに、from-import-* という形式のインポートも可能です。 モジュールのコンテンツは名前空間に直接インポートされます。つまり、これらすべてのコンテンツを、接頭辞を付ける必要なく直接使用できるということです。 例:
# Import management from arcpy as *
from arcpy.management import *
しかし、この方法にもリスクはあります。 同じ名前を持つ他のオブジェクト、変数、モジュールなどが上書きされるという点です。さらに、モジュールが大きくなると、名前空間は特に混雑し、ビジーになる点も挙げられます。 次のように考えてみてください。次に示す例では、管理モジュールと解析モジュールの両方が ** としてインポートされます。 どちらのモジュールにも [クリップ (Clip)] ツールがあります。 ここで [クリップ (Clip)] を使用すると、実際にはどちらの [クリップ (Clip)] を使用することになるでしょうか? 正解は 2 番目のものですが、この方法ではあいまいさが生じ、スクリプトが読みづらくなります。
# Import the management and analysis modules from arcpy as *
from arcpy.management import *
from arcpy.analysis import *
# Which Clip is it?
Clip('standb4', 'clipcov', 'standby_clip', 1.25)
ただし、場合によっては、from-import-* を使用するとコードを単純化できます。これは、ArcGIS Spatial Analyst extension の sa モジュールを使用する場合が当てはまります。 sa モジュールの利点の 1 つは、1 つのラスター オブジェクトを生成するために、1 行に複数のクラスと関数を入れ子にできる点です。
# Import arcpy and the sa module as *
import arcpy
from arcpy.sa import *
arcpy.CheckOutExtension('spatial')
# Get input parameters
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (Raster(inRaster1) + (Raster(inRaster2) - Raster(inRaster3)))
これを、次のコード ブロックと比較してみましょう。ここでは標準的な import-from ステートメントを使用します。 ここで、このコードにいくつかのクラスと関数を追加した場合を想像してみましょう。すべての関数とクラスに単純に sa. を追加するだけですが、すぐに積もり重なって読みやすさが損なわれ、行に余計な部分が増えます。
# Import arcpy and the sa module
import arcpy
from arcpy import sa
arcpy.CheckOutExtension('spatial')
# Get input parameters
inRaster1 = arcpy.GetParameterAsText(0)
inRaster2 = arcpy.GetParameterAsText(1)
inRaster3 = arcpy.GetParameterAsText(2)
outRaster = (sa.Raster(inRaster1) + (sa.Raster(inRaster2) - sa.Raster(inRaster3)))
パスとインポート
import ステートメントを使用する際に、Python はその名前と一致するモジュールを次の場所で検索します (順序も次のとおり)。
- PYTHONPATH システム環境変数に指定されているパス
- 一連の標準 Python フォルダー (現在のフォルダー、c:\python27\lib、c:\python27\Lib\site-packages など)
- 1 および 2 で見つかった *.pth ファイル内で指定されているパス
詳細については、https://docs.python.org/install/index.html#modifying-python-s-search-path をご参照ください。
ArcGIS 10.8.2 製品をインストールすると、Python 2.7 もインストールされます (すでにインストールされていない場合)。 さらに、Desktop10.8.pth ファイル、Engine10.8.pth ファイル、または Server10.8.pth ファイルも python27\Lib\site-packages に追加されます。 このファイルには、システムの ArcGIS のインストール先の arcpy フォルダーと bin フォルダーへのパスを示す 2 つの行が含まれます。 これら 2 つのパスは、Python バージョン 2.7 に ArcPy を正常にインポートするために必要です。
import ステートメントを使用する際、Python ではシステムの PYTHONPATH 環境変数を参照し、モジュール ファイルを特定します。 この変数は、ディレクトリのリストに設定されています。