バッチ処理スクリプトにおいて最も重要なタスクの 1 つは、利用可能なデータをカタログ化してまとめ、反復処理できるようにすることです。ArcPy には、このようなリストを作成するために特別に用意された関数がいくつかあります。
ListFields(dataset, wild_card, field_type) | 入力値に含まれるフィールドのリストを返します。 |
ListIndexes(dataset, wild_card) | 入力値に含まれる属性インデックスのリストを返します。 |
ListDatasets(wild_card, feature_type) | 現在のワークスペース内にあるデータセットを返します。 |
ListFeatureClasses(wild_card, feature_type, feature_dataset) | 現在のワークスペース内にあるフィーチャクラスを返します。 |
ListFiles(wild_card) | 現在のワークスペース内にあるファイルを返します。 |
ListRasters(wild_card, raster_type) | 現在のワークスペースに含まれるラスターのリストを返します。 |
ListTables(wild_card, table_type) | 現在のワークスペースに含まれるテーブルのリストを返します。 |
ListWorkspaces(wild_card, workspace_type) | 現在のワークスペースに含まれるワークスペースのリストを返します。 |
ListVersions(sde_workspace) | 接続されているユーザーが使用許可を持っているバージョンのリストを返します。 |
これらの関数それぞれの結果はリスト、つまり値のリストです。リストには、どのようなデータ タイプも含めることもできます。たとえば文字列を使用して、テーブルにあるデータセット、フィールド、または行のパスを指定できます。必要な値が含まれたリストが作成されたら、スクリプトでそのリストの反復処理を行い、個々の値を処理することができます。
リスト関数のパラメーター
これらの関数のパラメーターは類似しています。ListFields などいくつかの関数には、入力データセット値を指定する必要があります。これらの関数は、リストを作成する対象の項目が特定のオブジェクトまたはデータセット内にあるためです。その他の関数は、環境設定に定義されている現在のワークスペース内のデータをリスト表示するため、入力データセットの指定は必要ありません。すべての関数にワイルドカード パラメーターがあり、これはリストに含めるオブジェクトまたはデータセットを名前で絞り込むために使用されます。ワイルドカードは名前フィルターを定義します。新しく作成されるリストの内容はすべて、このフィルターを通らなければなりません。たとえば、ワークスペース内のフィーチャクラスのうち、文字 G で始まるフィーチャクラスをすべて列挙したいとしましょう。次のコード例は、その方法を示しています。
import arcpy
# Set the workspace. List all of the feature classes that start with 'G'
#
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*")
リストは、ポリゴン フィーチャクラス、整数フィールド、カバレッジ データセットといった特定のデータ特性に一致するものだけに限定することもできます。タイプ パラメーターは、すべての関数でこの用途に使用されます。次のコード例では、ワークスペース内のフィーチャクラスをワイルドカードとデータ タイプでフィルタリングし、文字 G で始まるポリゴン フィーチャクラスだけが結果のリストに含まれるようにします。
# Set the workspace. List all of the polygon feature classes that
# start with 'G'
#
arcpy.env.workspace = "D:/St_Johns/data.gdb"
fcs = arcpy.ListFeatureClasses("G*", "polygon")
リストの使用
ArcPy から返されるリスト関数のすべての実行結果のタイプは Python リスト タイプです。これは、データ アクセスに必要な柔軟性と複数のデータ タイプがこのリストでサポートされているためです。for ループは、一度にリストにある 1 つの項目について順次処理できるので、リストの処理に最適です。for ループは、リストのそれぞれの項目を反復処理します。次に、前記の例で生成されたリストを反復処理するために使用される for ループの例を示します。
# For each feature class in the list of feature classes
#
for fc in fcs:
# Copy the features from the workspace to a folder
#
arcpy.CopyFeatures_management(fc, "D:/St_Johns/Shapefiles/" + fc)
次に示すのは、ArcPy リスト関数の使用法を示すもう 1 つの例です。このスクリプトは、フォルダーに含まれているラスターのうち、TIFF イメージであるラスターをすべて検索し、そのラスター ピラミッドを作成します。
# Set the workspace. List all of the TIFF files
#
arcpy.env.workspace= "D:/St_Johns/images"
# For each raster in the list of rasters
#
for tiff in arcpy.ListRasters("*", "TIF"):
# Create pyramids
#
arcpy.BuildPyramids_management(tiff)
リストは、リスト関数の結果をさまざまな方法で使用および管理するために便利です。リストは多用途の Python タイプで、情報の操作および抽出に使用できるさまざまなメソッド (append、count、extend、index、insert、pop、remove、reverse、sort) があります。
たとえば、ワークスペースに存在するフィーチャクラスの数を知りたい場合は、Python に組み込まれている len 関数を使用すればその数が分かります。
import arcpy
arcpy.env.workspace = "c:/St_Johns/Shapefiles"
fcs = arcpy.ListFeatureClasses()
# Use Python's built-in function len to reveal the number of feature classes
# in the workspace
#
fcCount = len(fcs)
print(fcCount)
ディレクトリとサブディレクトリの検索
ArcPy リスト関数は、単一のディレクトリまたはワークスペースの反復処理に使用できますが、場合によっては、他のサブフォルダーやワークスペースの反復処理が必要となります。ファイルの場合は、Python の os.walk 関数で実現できます。この関数を使用すると、フォルダーを反復処理またはウォーク スルーし、別のサブフォルダーとファイルを見つけることができます。ただし、os.walk は、ファイルベースであり、ArcGIS で重要であるデータベースやファイル以外のデータ タイプを認識しません。たとえば、os.walk は、ファイル ジオデータベース ワークスペースやフィーチャ データセットのラスター データセットや他のコンテンツを認識しません。
arcpy.da モジュールでは、Walk 関数は、ディレクトリの反復処理に使用したり、データベースを調べて ArcGIS データ タイプを識別するのに使用することもできます。
Walk(top, topdown, onerror, followlinks, datatype, type) | 上から下または下から上にツリーを操作することによって、カタログ ツリーでデータ名を生成します。ツリーの各ディレクトリ/ワークスペースから、3 つ (dirpath、dirnames、filenames) の組み合わせが得られます。 |
以下の例では、Walk 関数を使用して、カタログ ツリーを反復処理し、内蔵されるすべてのポリゴン フィーチャクラスを特定します。
ポリゴン フィーチャクラスを分類する Walk 関数を使用します。
import arcpy
import os
workspace = "c:/data"
feature_classes = []
for dirpath, dirnames, datatypes in arcpy.da.Walk(workspace,
datatype="FeatureClass",
type="Polygon"):
# Append all Polygon feature classes to a list for further processing
for datatype in datatypes:
feature_classes.append(os.path.join(dirpath, filename))
場合によっては、カタログ ツリーを移動する際に回避すべきサブディレクトリ (バックアップ ファイルのディレクトリなど) があることがあります。topdown 引数が True であるまたは指定されていない場合、ワークスペースを変更して、不要なワークスペースを回避したり別のワークスペースを追加したりすることができます。
ラスター データを分類する Walk 関数を使用します。back_up という名前のフォルダー内のラスターは無視されます。
import arcpy
import os
workspace = "c:/data"
rasters = []
for dirpath, dirnames, filenames in arcpy.da.Walk(
workspace, topdown=True, datatype="RasterDataset"):
# Disregard any folder named 'back_up' in creating list
# of rasters
if "back_up" in dirnames:
dirnames.remove('back_up')
for filename in filenames:
rasters.append(os.path.join(dirpath, filename))
例: arcpy.da.Walk を使用してデータを解析する
Walk 関数 (リスト関数も同様) は、一般にデータの一括処理に使用されます。以下のスクリプトは、arcpy.da.Walk 関数を利用して、SDE ワークスペースのすべてのデータセットを分析します。
import arcpy
import os
# SDE workspace to be used
admin_workspace = "Database Connections/tenone@sde.sde"
analyze_contents = []
for dirpath, workspaces, datatypes in arcpy.da.Walk(
admin_workspace,
followlinks=True,
datatype=['Table', 'FeatureClass', 'RasterDataset']):
# Create full path, and add tables, feature classes, raster datasets
analyze_contents += [
os.path.join(dirpath, datatype) for datatype in datatypes]
# create full path, add the feature datasets of the .sde file
analyze_contents += [
os.path.join(dirpath, workspace) for workspace in workspaces]
# Execute Analyze Datasets on the complete list
arcpy.AnalyzeDatasets_management(admin_workspace,
"SYSTEM",
analyze_contents,
"ANALYZE_BASE",
"ANALYZE_DELTA",
"ANALYZE_ARCHIVE")