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 は "" になります。

状態

サーバ上のジョブのステータスを返します。

  • 0—New
  • 1—Submitted
  • 2—Waiting
  • 3—Executing
  • 4—Succeeded
  • 5—Failed
  • 6—Timed Out
  • 7—Canceling
  • 8—Canceled
  • 9—Deleting
  • 10—Deleted

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")

関連項目


7/10/2012