PythonでArcGISツールプログラミング¶
ArcGIS Desktopで提供されるArcToolboxを、プログラムで自動化できると便利です。 そのような用途に、ArcGISにはPythonによるプログラミング環境が提供されています。
ArcGIS Desktopをインストールすると、Python環境も合わせてインストールされます。 このPython環境には、arcpyライブラリが添付され、arcpyライブラリを介してArcGISの様々な機能にアクセスすることができます。
Pythonプログラミング環境¶
ArcGIS 10 Desktopをインストールすると、スタートメニュー>[すべてのプログラム]>[ArcGIS]>[Python 2.6]が用意されています。
対話環境¶
IDLE (Python GUI)をクリックすると、Python Shellが立ち上がります。これはPythonの対話環境で、コマンドを入力して実行すると、すぐに結果が表われます。 ちょっとした操作をするときにはこの環境が便利でしょう。
スクリプト作成と実行¶
エディタで、Pythonプログラムを記述し、実行する環境です。
ArcGIS Pythonプログラミング 最初の一歩¶
プログラミング作業用のディレクトリを作って、Pythonソースファイルを作成します。ファイル名は、通常拡張子は.pyとします。
最初のプログラムは、ファイル・ジオデータベースを指定し、その中に含まれるフィーチャークラスを一覧するものです。
GdbInfo.py¶
# -*- coding:cp932 -*-
import arcpy, os, sys
inputWorkspace = r'C:\Users\toru\Documents\ArcGIS\worldmap.gdb'
if (not os.path.exists(inputWorkspace)):
print 'パス ' + inputWorkspace + ' が存在しません。'
sys.exit(1)
arcpy.env.workspace = inputWorkspace
inputFeatureClassList = arcpy.ListFeatureClasses()
print 'フィーチャークラスの件数:' + str(len(inputFeatureClassList))
for inputFeatureClass in inputFeatureClassList:
print 'フィーチャー名: ' + str(inputFeatureClass)
コードの先頭行か2行目に、日本語エンコーディングを記述しておきます。Python自体がコメントを含めて日本語を含むソースファイルを解釈するときにエンコーディング指定を必要とします。また、日本語のファイルパスをソースファイル中に記述するときは、Windows OSで適切に動作するようcp932を指定しておきます。
ArcGISのパッケージ arcpy をインポートします。
入力(処理対象)となるワークスペース(ジオデータベース、シェープファイル他)のパス文字列を、arcpy.env.workspaceに設定します。 ここでは、ファイル・ジオデータベースを指定しています。
設定したワークスペースに含まれるフィーチャークラスを取得するListFeatureClasses()関数を呼び、フィーチャークラス一覧(リスト)を取得します。引数には、絞り込み名前(ワイルドカード)、フィーチャータイプ、フィーチャーデータセットを指定することができます。省略時は、絞り込みなし、全てのフィーチャータイプ、ワークスペース(ジオデータベース)直下の(データセットに格納されていない)フィーチャークラスを対象にフィーチャークラス一覧を取得します。
フィーチャークラス一覧からフィーチャークラスを順番に取り出し、名前をプリントします。
コマンドライン引数¶
スクリプト中にハードコーディングしているワークスペース名を、コマンドライン引数から取得すれば汎用性が高まります。Python標準のコマンドライン引数取得もありますが、ArcGISでは、専用の関数 arcpy.GetParameterAsText()が用意されています。
inputWorkspace = arcpy.GetParameterAsText(0)
ジオデータベースへのアクセス(Cursor)¶
前述でジオデータベース内のフィーチャークラスを取得できるようになりました。 次は、フィーチャークラスのレコードへアクセスをしてみます。レコードはCursorを使ってアクセスします。Cursorの作成には、arcpyパッケージの関数が提供されています。
読み出し専用カーサ(SearchCursor)¶
featureClassPath = os.path.join(inputWorkspace, 'rivers')
rows = arcpy.SearchCursor(featureClassPath)
for row in rows:
name = row.getValue('NAME')
print 'NAME:' + name
更新カーサ(UpdateCursor)¶
featureClassPath = os.path.join(inputWorkspace, 'rivers')
rows = arcpy.UpdateCursor(featureClassPath)
for row in rows:
riverRank = int(row.getValue('RIVER_RANK'))
if (riverRank == 1):
row.setValue('RANK_NAME', '一級河川')
rows.updateRaw(row)
del row
del rows
挿入カーサ(InsertCursor)¶
featureClassPath = os.path.join(inputWorkspace, 'rivers')