Python スクリプトの新規作成
Python コードを保存するには、Python ファイル(.py)を作成します。このファイルは ASCII ファイルで、Python ステートメントを格納します。
- Python 統合開発環境(IDE)を使用する場合、新しいスクリプトを作成し、スクリプトの最初に次の行を追加します。
- 処理するフィーチャクラスのセットを定義する入力ワークスペース
- [クリップ(Clip)] ツールによって入力フィーチャクラスからクリップされる領域として使用されるフィーチャクラス
- [クリップ(Clip)] ツールの結果が書き込まれる出力ワークスペース
- [クリップ(Clip)] ツールで使用される XY 許容値
- 次のコードをスクリプトに追加して、実行時にスクリプトに渡されるユーザ定義の値に基づいて変数を定義および設定します。
- 次に示すエラー処理ステートメントおよび ArcPy の ListFeatureClasses() 関数をスクリプト ウィンドウに追加します。
- 次のコードを追加します。
- 次の行を追加してスクリプトを完成させます。
- スクリプトの最初に、次のヘッダーを追加します。
- スクリプトを保存します。
# Import ArcPy site-package and os modules
import arcpy
import os
これで ArcPy サイトパッケージとオペレーティング システム モジュール os がスクリプトにインポートされます。os モジュールを使用すると、オペレーティング システムの最も基本的なツールに簡単にアクセスすることができます。このスクリプトでは、os モジュールのファイル名操作メソッドをいくつか使用します。
このスクリプトは、以下の 4 つの引数を持つため、汎用的に使用することができます。
# Set the input workspace
arcpy.env.workspace = arcpy.GetParameterAsText(0)
# Set the clip featureclass
clipFeatures = arcpy.GetParameterAsText(1)
# Set the output workspace
outWorkspace = arcpy.GetParameterAsText(2)
# Set the XY tolerance
clusterTolerance = arcpy.GetParameterAsText(3)
try:
# Get a list of the featureclasses in the input folder
fcs = arcpy.ListFeatureClasses()
Python では、この言語の構造として、特定のステートメントの後のコードが強制的にインデントされます。try ステートメントは、関連付けられた例外ハンドラである except ステートメントで処理されるコード ブロックの始まりを定義します。このブロック内のすべてのコードをインデントする必要があります。Python では try/except ブロックを使用して、実行中の予期しないエラーを処理します。例外ハンドラは、システムまたはスクリプト自体によって例外が発生したときに、プログラムで行うべき措置を定義します。例外の処理により、システム エラーを発生させるのではなく、スクリプトを穏やかに終了して有益なメッセージを返すことが可能になります。
ListFeatureClasses() は、現在のワークスペースにあるフィーチャクラス名のリストを返します。ワークスペースは、使用するデータの場所と、絶対パスが指定されない場合にすべての新しいデータを作成する場所を定義します。ワークスペースは、すでに 1 つ目の引数の値に設定されています。リストに含まれている各フィーチャクラスを確認するには、for ループを使用します。
for fc in fcs:
# Validate the new feature class name for the output workspace.
featureClassName = arcpy.ValidateTableName(fc, outWorkspace)
outFeatureClass = os.path.join(outWorkspace, featureClassName)
# Clip each feature class in the list with the clip feature class.
# Do not clip the clipFeatures, it may be in the same workspace.
if fc != os.path.basename(clipFeatures):
arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass,
clusterTolerance)
リストの最後の名前に達すると、for ループは終了します。ValidateTableName() 関数は、出力名が出力ワークスペースに有効であることを確認するために使用します。ピリオドやダッシュなど、一部の文字はジオデータベースでは許可されないため、このメソッドでは無効な文字を有効な文字で置き換えた名前が返されます。一意の名前が返されるため、既存のデータが上書きされることはありません。
os.path.basename メソッドは、クリップ フィーチャクラスのパスを操作するために使用されます。したがって、式ではパス全体ではなく、フィーチャクラスの名前のみが評価されます。[クリップ(Clip)] ツールには ArcPy 関数として、各種の文字列変数をパラメータ値に使用してアクセスします。
except Exception as err:
arcpy.AddError(err)
print err
except ステートメントは、先述の try ステートメントに必要です。使用しない場合は構文エラーになります。実行中にエラーが発生した場合は、except ブロック内のコードが実行されます。スクリプトがスクリプト ツールを実行する場合、AddError() 関数を使用して、エラー メッセージが追加されます。スクリプトがツールの外部で実行された場合は、すべてのエラー メッセージが標準出力にも出力されます。
"""-----------------------------------------------------------------------------
Script Name: Clip Multiple Feature Classes
Description: Clips one or more shapefiles
from a folder and places the clipped
feature classes into a geodatabase.
Created By: Insert name here.
Date: Insert date here.
-----------------------------------------------------------------------------"""
変数に名前を付けるときは、Python では大文字と小文字が区別されることに注意してください。つまり、clipFeatures と ClipFeatures は同じではありません。
GetParameterAsText() は、引数を取得するために使用します。定義済みのデータセット名とパラメータ値をスクリプトで使用する場合は、GetParameterAsText() 関数の使用が不要になることもあります。
コロンで終わるステートメントは、インデントされたコードが始まることを意味します。Python ではコード ブロックの最初や最後を示すための中括弧、角括弧、セミコロンは使用しません。代わりにブロックをインデントして、その境界を示します。これにより、読み書きしやすいコードになります。
完成したスクリプトは次のようになります。
"""-----------------------------------------------------------------------------
Script Name: Clip Multiple Feature Classes
Description: Clips one or more shapefiles
from a folder and places the clipped
feature classes into a geodatabase.
Created By: Insert name here.
Date: Insert date here.
-----------------------------------------------------------------------------"""
# Import ArcPy site-package and os modules
import arcpy
import os
# Set the input workspace
arcpy.env.workspace = arcpy.GetParameterAsText(0)
# Set the clip featureclass
clipFeatures = arcpy.GetParameterAsText(1)
# Set the output workspace
outWorkspace = arcpy.GetParameterAsText(2)
# Set the XY tolerance
clusterTolerance = arcpy.GetParameterAsText(3)
try:
# Get a list of the featureclasses in the input folder
fcs = arcpy.ListFeatureClasses()
for fc in fcs:
# Validate the new feature class name for the output workspace.
featureClassName = arcpy.ValidateTableName(fc, outWorkspace)
outFeatureClass = os.path.join(outWorkspace, featureClassName)
# Clip each feature class in the list with the clip feature class.
# Do not clip the clipFeatures, it may be in the same workspace.
if fc != os.path.basename(clipFeatures):
arcpy.Clip_analysis(fc, clipFeatures, outFeatureClass,
clusterTolerance)
except Exception as err:
arcpy.AddError(err)
print err