データのリストの作成
バッチ処理スクリプトにおいて最も重要なタスクの 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 から返される、List 関数の実行結果のタイプは、すべて 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
リストの内容は簡単に表示できます。sort、append、reverse など、さまざまなメソッドを使用してリストを操作できます。
>>> import arcpy
>>> arcpy.env.workspace = "c:/data/water.gdb"
>>> fcs = arcpy.ListFeatureClasses()
>>> print fcs
[u'water_pipes', u'water_services', u'water_stations']
>>> fcs.sort(reverse=True)
>>> print fcs
[u'water_stations', u'water_services', u'water_pipes']
リストは順序付きのコレクションなので、インデックス作成とスライスも可能です。
>>> print fcs[0]
water_stations
>>> print fcs[1:]
[u'water_services', u'water_pipes']
ディレクトリとサブディレクトリの検索
ArcPy List 関数は、単一のディレクトリまたはワークスペースを反復処理するために使用できますが、場合によっては、他のサブフォルダやワークスペースの反復処理が必要なこともあります。ファイルの場合、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 が移動する最初の開始(トップ)ワークスペースは、最初の引数 top で指定されます。
以下の例では、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")
デフォルトでは、SDE 接続ファイルは、リモート データセットを意図せず開くことのないよう、反復処理されません。SDE 接続ファイルを意図的に反復処理するには、followlinks を True に設定します。