Python の概要

Python はオープンソースの汎用プログラミング言語で、ArcGIS ジオプロセシングではスクリプト言語として使用します。ジオプロセシング機能には、Python から ArcGIS ソフトウェアの ArcPy サイトパッケージを使用してアクセスすることができます。ArcPy により、ジオプロセシング ツールへのアクセスだけでなく、単純または複雑なワークフローを迅速かつ簡単に作成するための追加機能、クラス、モジュールへのアクセスも提供されます。

ArcPy を使用して作成された ArcGIS アプリケーションとスクリプトは、膨大な数の Python モジュールにアクセスし、操作できます。これらのモジュールは、多種多様な専門分野をもつ GIS プロフェッショナルおよびプログラマによって開発されたものです。Python 内で ArcPy を使用するもう 1 つの利点は、Python が習得しやすく使いやすい汎用プログラミング言語であるという点です。この言語はインタープリタ形式の言語であり動的な型付けを行うので、インタラクティブ環境でスクリプトをすばやくプロトタイプを作成して検証できる一方で、大規模なアプリケーションの作成をサポートするパワフルさも兼ね備えています。

ArcPy は大別するとツール、環境、関数、クラス、モジュールで構成されています。

ツールの実行

次の例は、[バッファ(Buffer)] ツールを実行する方法を示しています。ツールを実行すると、デフォルトで Python ウィンドウの右側のヘルプ セクションにメッセージが表示されます。

>>> arcpy.Buffer_analysis("c:/data/Portland.gdb/streets", "c:/data/Portland.gdb/steets_buffer", "500 METERS")

下記はツールを実行する別の例です。この例では、データ管理ツールボックスと変換ツールボックスのツールを使用します。入力の道路フィーチャクラスにフィールドが追加および計算された後、フィーチャクラスは ArcSDE エンタープライズ ジオデータベースに読み込まれます。

>>> import arcpy 
>>> arcpy.AddField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "TEXT")
>>> arcpy.CalculateField_management("c:/data/Portland.gdb/streets", "LENGTH_MILES", "!shape.length@miles!", "PYTHON_9.3")
>>> arcpy.FeatureClassToFeatureClass_conversion("c:/data/Portland.gdb/streets", "Database Connections/MySDE.sde/PortlandDataset", "streets")
Python でのツールの使用の詳細

ツールからの結果の取得

ジオプロセシング ツールを実行すると、ツールの結果が Result オブジェクトに返されます。一般的に、このオブジェクトはツールによって生成または更新された出力データセットのパスです。数値やブール値などの他の値タイプを含む場合もあります。ツールの出力が複数値パラメータである場合、値はリスト内にリストとして返すことができます。

次のコード例は、リターンを取得する方法と、リターンの内容を示しています。

出力フィーチャクラスのパスを返します。結果は他の関数の入力として使用できます。

>>> result = arcpy.Buffer_analysis("rivers", "riverBuf", "50 METERS")
>>> print result
C:\Portland\Portland_OR.gdb\riverBuf
>>> arcpy.Clip_analysis("streets", result, "streets_50m_of_rivers")

フィーチャの数を返します。

>>> result = arcpy.GetCount_management("streets_50m_of_rivers")
>>> print result.getOutput(0)
54

フィーチャクラスのデフォルト空間グリッド インデックスのリストを返します。

>>> result = arcpy.CalculateDefaultGridIndex_management("streets_50m_of_rivers")
>>> for i in range(0, result.outputCount):
...     print result.getOutput(i)
...
560
200
0

環境設定の使用

ジオプロセシング環境設定は、ツールの結果に影響する追加パラメータと考えることができます。通常のツール パラメータとは異なり、ツールとは独立して設定され、ツールの実行時に照会および使用されます。対象エリア出力データセットの座標系、新しいラスタ データセットのセル サイズなど、すべての環境設定をツールを使って指定し、適用できます。

環境設定は、env クラスからプロパティとして使用できます。これらのプロパティを使用して、現在の環境値を取得したり、値を設定したりすることができます。次に、環境値を使用する方法の例を示します。

ワークスペース環境を設定します。

>>> arcpy.env.workspace = "c:/data/Portland.gdb"
>>> arcpy.Buffer_analysis("streets", "streetBuf", "500 METERS")

ツールのリターンに空間グリッド インデックスを設定します。

>>> arcpy.env.spatialGrid1 = arcpy.CalculateDefaultSpatialGridIndex_management("streets").getOutput(0)

現在のラスタ セル サイズ設定を取得し、標準出力の正しいサイズであることを確認します。

if arcpy.env.cellSize != 30:
    arcpy.env.cellSize = 30
Python での環境設定の使用の詳細

関数の使用

関数は、特定のタスクを実行する機能を定義した小部分で、もっと大きなプログラム内に組み込むことができます。ツールに加えて、ArcPy ではジオプロセシング ワークフローのサポートを強化する多くの関数が公開されています。関数を使用して、特定のデータセットのリスト作成、データセットのプロパティの検索、データの有無の確認、ジオデータベースに追加する前のテーブル名の検証など、数多くの便利なスクリプト タスクを実行できます。

次のコード例は、データのプロパティを取得し、エクステンションをチェックアウトする方法を示しています。

import arcpy

# prints True
print arcpy.Exists("c:/data/Portland.gdb/streets") 

# prints NAD_1983_StatePlane_Oregon_North_FIPS_3601_Feet
sr = arcpy.Describe("c:/data/Portland.gdb/streets").spatialReference
print sr.name 

# prints Available
print arcpy.CheckExtension("spatial") 

arcpy.CheckOutExtension("spatial")
Python での関数の使用の詳細

クラスの使用

SpatialReference クラスや Extent クラスなどの ArcPy クラスは、ジオプロセシング ツールのパラメータを実行するためのショートカットとしてよく使用されます。ArcPy クラスを使用しない場合、これらのパラメータはもっと複雑な文字列が必要になります。クラスは建築の青写真と同様です。青写真には対象物の作成方法のフレームワークが示されます。クラスはオブジェクトの作成に使用できます。これは、よくインスタンス化と呼ばれます。

import arcpy

spatial_ref = arcpy.SpatialReference("Hawaii Albers Equal Area Conic")
Python でのクラスの使用の詳細

モジュールの操作

ArcPy には、ArcGIS のその他の処理を行うためのモジュールが用意されています。ArcPy は、データ アクセス モジュール(arcpy.da)、マッピング モジュールarcpy.mapping)、ArcGIS Spatial Analyst エクステンション モジュールarcpy.sa)、ArcGIS Network Analyst エクステンション モジュール(arcpy.na)など、さまざまなモジュールでサポートされています。

たとえば、arcpy.sa モジュールのツールが [Spatial Analyst] ツールボックスのツールを使用し、マップ代数をサポートするように設定されている場合、arcpy.sa.Slope の実行は、[Spatial Analyst] ツールボックスから [傾斜角(Slope)] ツールを実行する場合と同じです。

関連トピック

9/14/2013