Python のツールの使用
各ジオプロセシング ツールには、ツールを実行するために必要な情報を提供する固定のパラメータがあります。通常、ツールには 1 つ以上のデータセットを定義する入力パラメータがあり、それらは一般に新しい出力データを生成するために使用されます。パラメータには重要なプロパティがいくつかあります。
名前 |
各ツール パラメータには一意の名前が付いています。 |
タイプ |
フィーチャクラス、整数、文字列、ラスタなどの、予期されるデータ タイプ。 |
方向 |
このパラメータが入力または出力のどちらの値を定義するか。 |
必須 |
値がパラメータとして指定されなければならないかどうかを示します。 |
ツールをスクリプトで使用する際、スクリプトの実行時にツールを実行するためには、ツールのパラメータ値が正しく設定されていなければなりません。各ツールのドキュメントには、そのパラメータとプロパティが明確に定義されています。有効なパラメータ値が指定されれば、ツールを実行する準備は完了です。
パラメータは、文字列またはオブジェクトのどちらかで指定されます。文字列は単純なテキストであり、データセットへのパスやキーワードといったパラメータ値を一意に識別します。
ほとんどのツール パラメータは、単純な文字列として指定できます。空間参照など、一部のパラメータには文字列の代わりにオブジェクトを使用できます。次のコード例では、Buffer ツールの入出力パラメータが定義されています。ツール名にはツールボックス エイリアスが常に付加されることに注意してください。この例では、ツールの呼び出しを読みやすくするために、入出力パラメータの定義に 2 つの文字列変数が使用されています。
import arcpy roads = "c:/St_Johns/data.gdb/roads" output = "c:/St_Johns/data.gdb/roads_Buffer" # Run Buffer using the variables set above and pass the remaining parameters # in as strings # arcpy.Buffer_analysis(roads, output, "distance", "FULL", "ROUND", "NONE")
次のコード例では、オプションの座標系パラメータに空間参照オブジェクトを指定して、CreateFeatureClass ツールが実行されます。空間参照オブジェクトは SpatialReference クラスを使用して作成され、オブジェクトの情報は投影ファイルからロードされます。
import arcpy
inputWorkspace = "c:/temp"
outputName = "rivers.shp"
# Create a spatial reference object
#
spatialRef = arcpy.SpatialReference()
# Use a projection file to define the spatial reference's properties
#
spatialRef.createFromFile("c:/program files/arcgis/Desktop10.0/Coordinate Systems/" + \
"Projected Coordinate Systems/Continental/North America/North America Equidistant Conic.prj")
# Run CreateFeatureclass using the spatial reference object
#
arcpy.CreateFeatureclass_management(inputWorkspace, outputName,
"POLYLINE", "", "", "", spatialRef)
ツールの編成
ジオプロセシング ツールは 2 種類の方法で編成されています。すべてのツールは ArcPy 上の関数として使用できますが、ツールボックスのエイリアス名に一致するモジュールでも使用できます。ヘルプにある例のほとんどでは、ツールは ArcPy から使用できる関数としての編成方法で示されていますが、どちらの方法も同じように有効です。どちらの方法を使用するかは、ユーザの好みやコーディング上の習慣によって決めてください。次の例では、両方の方法を使用した GetCount ツールのコーディングを示しています。
import arcpy inFeatures = "c:/temp/rivers.shp" # Tools can be accessed as functions on the arcpy module, and # from modules matching the toolbox name. # arcpy.GetCount_management(inFeatures) arcpy.management.GetCount(inFeatures)
モジュール内のツールを使用する際に、スクリプトを読みやすくするために、モジュールを識別する名前を分かりやすくしたい場合があります。このような場合には、from-import-as という形式を使用できます。
# Clean up street centerlines that were digitized without having set # proper snapping environments # import arcpy from arcpy import edit as EDIT from arcpy import management as DM streets = "c:/data/streets.gdb/majorrds" streetsCopy = "c:/output/Output.gdb/streetsBackup" DM.CopyFeatures(streets, streetsBackup) EDIT.TrimLine(streets, "10 Feet", "KEEP_SHORT") EDIT.ExtendLine(streets, "15 Feet", "EXTENSION")
Spatial Analyst ツールは、マップ代数演算に対応するために扱いが異なっており、ArcPy の関数としてではなく arcpy.sa モジュール内でのみ使用できます。
ツールからの結果の取得
ツールが実行されるときに、ArcPy は Result オブジェクトとしてツールの出力値を返します。Result オブジェクトの利点は、メッセージ、パラメータ、出力など、ツールの実行に関する情報を維持できることです。これらの結果は、他のツールがいくつか実行された後でも維持できます。
次の例では、ジオプロセシング ツールの実行後に Result オブジェクトから出力を取得する方法を示しています。
import arcpy arcpy.env.workspace = "D:/St_Johns/data.gdb" # Geoprocessing tools return a result object of the derived # output dataset. # result = arcpy.CopyFeatures_management("roads", "urban_roads") # A print statement will display the string # representation of the output. # print result # To get the output value, the result object has a getOutput method # resultValue = result.getOutput(0)
Result オブジェクトの getOutput メソッドは、出力値を含む Result オブジェクトから Unicode 文字列を返します。GetCount(テーブル内のレコード数を提供)や、CalculateDefaultClusterTolerance(クラスタの許容値を提供)などのツールを実行する際には、このことを十分に考慮してください。必要なタイプに値を変換するには、int() や float() などの組み込み Python 関数を使用して、値を Unicode 文字列から変換する必要があります。
import arcpy from arcpy import env import types env.workspace = "c:/St_Johns/data.gdb" # Many geoprocessing tools return a result object of the derived # output dataset. A print statement will display the string # representation of the output. # result = arcpy.GetCount_management("roads") resultValue = result.getOutput(0) # The result object's getOutput method returns values as a # unicode string. To convert to a different Python type, use # built-in Python functions: str(), int(), long(), float() # count = int(resultValue) print count print types.TypeType(count)
プロパティとメソッド |
説明 |
---|---|
inputCount | 入力の数を返します。 |
outputCount |
出力数を返します。 |
messageCount |
メッセージ数を返します。 |
maxSeverity |
最大の重要度を返します。返される重要度は、0(エラー/警告なし)、1(警告が発生)、または 2(エラーが発生)です。 |
resultID |
一意の結果 ID を返します。ツールがジオプロセシング サービスでない場合、resultID は "" になります。 |
状態 |
サーバ上のジョブのステータスを返します。
|
cancel() |
サーバ上のジョブをキャンセルします。 |
getInput(index) |
指定された入力を返します。レコード セットまたはラスタ データ オブジェクトの場合、RecordSet または RasterData オブジェクトが返されます。 |
getMapImageURL(ParameterList, Height, Width, Resolution) |
指定された出力に対するマップ サービス イメージを取得します。 |
getMessage(index) |
特定のメッセージを返します。 |
getMessages(severity) |
返されるメッセージのタイプ。0 はメッセージ、1 は警告、2 はエラーです。値を指定しない場合は、すべてのメッセージ タイプが返されます。 |
getOutput(index) |
指定された出力を返します。レコード セットまたはラスタ データ オブジェクトの場合、RecordSet または RasterData オブジェクトが返されます。 |
getSeverity(index) |
特定のメッセージの重要度を返します。 |
サーバ ツールからの結果の取得
他のジオプロセシング ツールと同様に、ジオプロセシング サーバ ツールにはツールを実行するのに必要な情報を提供する固定のパラメータがあります。スクリプト内で非同期サーバ ツールを使用する場合には、結果の getOutput メソッドを使用して出力を取得できます。
ツールが同期または非同期のどちらで実行されているか判別するには、IsSynchronous 関数を使用できます。ツールが同期型の場合、結果は自動的に返されますが、ツールが完了するまで他のアクションを行うことはできません。
次の例では、GetParameterValue 関数を使用してサーバ ツールから FeatureSet オブジェクトを取得しています。FeatureSet オブジェクトには、ツールの入力パラメータのスキーマが格納されています。その後、FeatureSet オブジェクトにフィーチャクラスがロードされ、サーバ上でサーバ ツールが実行されます。スクリプトの終了時には、結果オブジェクトの getOutput メソッドを使用してツールの出力を取得します。この出力は、FeatureSet の save メソッドを使用してローカルに保存されます。
import arcpy import time # Add a toolbox from a server # arcpy.ImportToolbox("http://flame7/arcgis/services;GP/BufferByVal", "mytools") # Use GetParameterValue to get a featureset object with the default # schema of the first parameter of the tool 'bufferpoints' # inFeatureSet = arcpy.GetParameterValue("bufferpoints", 0) # Load a shapefile into the featureset # inFeatureSet.load("c:/base/roads.shp") # Run a server tool named BufferPoints with featureset created above # result = arcpy.BufferPoints_mytools(inFeatureSet, "5 feet") # Check the status of the result object every 0.2 seconds until it has a value # of 4 (succeeded) or greater # while result.status < 4: time.sleep(0.2) # Get the output FeatureSet back from the server and save to a local geodatabase # outFeatSet = result.getOutput(0) outFeatSet.save("c:/temp/base.gdb/towers_buffer")
サーバ ツールからのラスタ結果の取得
ラスタ形式の結果は TIFF(Tagged Image File Format)として返されます。デフォルトでは、getOutput を使用すると、TIFF はシステムの TEMP フォルダに書き込まれます。TIFF の場所を変更するには、scratchWorkspace 環境をいずれかのフォルダに設定します。
import arcpy import time # Set the scratchworkspace to a folder. # arcpy.env.scratchWorkspace = "c:/temp/rasteroutput" # Add a toolbox from a server # arcpy.ImportToolbox("http://flame7/arcgis/services;SlopeByVal", "mytools") dem = "c:/dems/k_ne_g" # Run a server tool named RunSlope # result = arcpy.RunSlope_mytools(dem) # Check the status of the result object every 0.2 seconds until it has a value # of 4 (succeeded) or greater # while result.status < 4: print result.status time.sleep(0.2) # Raster output will be written to the scratchworkspace # outTIFF = result.getOutput(0)
マップ イメージの取得
ジオプロセシング サービスでは、タスク結果のデジタル マップ イメージを作成するために、結果を表示するマップ サービスを使用できます。デジタル マップには、情報を伝達するジオグラフィック データセットのビジュアル表現が含まれています。デジタル マップは、Web 上で画像として(*.jpeg など)転送されます。マップ イメージには、人間が解釈できる情報がフィーチャクラスのフィーチャよりもはるかに多く含まれています。マップ イメージは、管理も簡単であり、簡単に圧縮したり、管理しやすいタイルに分割したりできるだけではなく、Web 上で転送および表示するための方法も確立されています。
マップ イメージは、ArcGIS Server マップ サービスによって作成される、ArcMap ドキュメント(*.mxd)を公開したものです。マップ イメージにはこのような特性があるため、一般的には、ジオプロセシング タスクの結果に対してマップ イメージを 1 つ作成し、Web 上では結果として生成されたデータセットを転送する代わりにマップ イメージを転送するほうが適切です。ジオプロセシング サービスには、ArcGIS Server によって出力データのマップ イメージを作成するために使用される結果を表示するマップ サービスを含めることができます。
import arcpy import time import urllib # Add a toolbox from a server # arcpy.ImportToolbox("http://flame7/arcgis/services;GP/BufferByVal", "mytools") # Use GetParameterValue to get a featureset object with the default schema of the # first parameter of the tool 'bufferpoints' # inFeatureSet = arcpy.GetParameterValue("bufferpoints", 0) # Load a shapefile into the featureset # inFeatureSet.load("c:/base/roads.shp") # Run a server tool named BufferPoints with featureset created above # result = arcpy.BufferPoints_mytools(inFeatureSet, "5 feet") # Check the status of the result object every 0.2 seconds until it has a value # of 4 (succeeded) or greater # while result.status < 4: time.sleep(0.2) print result.status # Return a map service # mapimage = result.getMapImageURL(0) # Use Python's urllib module's urlretrieve method to copy the image locally # urllib.urlretrieve(mapimage, "c:/base/road_buffer.jpg")