FAQ
ArcPy (ArcMap) で多重ループを行う方法

ナレッジ番号:2933 | 登録日:2023/05/29 | 更新日:2024/11/21

概要

Python スクリプトを使用して、フォルダ内に格納されている複数のワークスペースに対してループ処理を行い、さらに各ワークスペースに格納されているフィーチャクラスにアクセスしてループ処理を行う方法をご紹介します。

Python を使用して ArcGIS で使用するデータに対して繰り返し処理を行うには、Python の for 文 と ArcPy の List 関数を使用します。List 関数は、ファイル ジオデータベースに格納されているすべてのフィーチャクラスやフォルダに格納されている指定した複数のシェープファイルなどを Python のリストとして取得します。リストは複数のデータを格納しておくことができる Python のデータ型です。取得した複数のデータそれぞれに対して for 文を使用してループ処理を実行します。for 文は入れ子にすることができるので、for 文の中でさらに for 文を用いることで多重ループを行うことができます。

List 関数の詳細や種類については下記「ArcGIS ヘルプ」を参照ください。

データのリストの作成

サンプル コード

「政令指定都市」フォルダ内の「札幌市.gdb」、「新潟市.gdb」、「仙台市.gdb」ファイル ジオデータベースに格納されている各区のフィーチャクラスにアクセスして処理を実行しています。各フィーチャクラスに新規フィールドを追加し、フィールド演算を実行して面積を算出します。さらに、各ファイル ジオデータベースに格納されているフィーチャクラスすべてをマージして新規フィーチャクラスを作成します。

Image

# coding:cp932

# ArcPy サイト パッケージ、os モジュールをインポートします。
import arcpy, os

# ループさせたいワークスペースが格納されているフォルダを env クラスの workspace プロパティに設定します。
path = r"D:\政令指定都市"
arcpy.env.workspace = path

# フォルダ内に格納されているワークスペースを List 関数を使用してリスト化します。
# ここでは、名前に「市」が付くファイル ジオデータベースのみを取得します。
wsList = arcpy.ListWorkspaces("*市*", "FileGDB")

# 多重ループ処理
# 「D:\政令指定都市」フォルダ内に格納されている各ファイル ジオデータベースごとに処理を行います。
for ws in wsList:
    print ws
    # 取得したファイル ジオデータベースを env クラスの workspace プロパティに設定します。
    arcpy.env.workspace = ws
    # ファイル ジオデータベースに格納されているフィーチャクラスを List 関数を使用してリスト化します。
    fcList = arcpy.ListFeatureClasses()
    # ファイル ジオデータベースに格納されている各フィーチャクラスごとに処理を行います。
    for fc in fcList:
        print "\t" + fc
        # フィーチャクラスからフィーチャ レイヤを作成します。
        layer = arcpy.MakeFeatureLayer_management(fc, arcpy.Geometry())
        # 新規フィールドを作成します。
        addField = "ADD_area"
        arcpy.AddField_management(layer, addField, "DOUBLE")
        # 作成したフィールドでフィールド演算を行い、面積を算出します。
        exp = "!Shape.area@SQUAREKILOMETERS!"
        arcpy.CalculateField_management(layer, addField, exp, "PYTHON_9.3")
        # フィールド演算の結果をデータアクセス モジュールの SerchCursor を使用して読み込みます。
        cur = arcpy.da.SearchCursor(fc, [addField])
        for row in cur:
            # フィーチャクラスのフィールドを List関数を使用してリスト化します。
            fieldList = arcpy.ListFields(fc)
            for field in fieldList:
                # 各フィーチャクラスのフィールド演算を実行したフィールド名と演算結果を取得します。
                if field.name == addField:
                    print "\t\t" + field.name + ": " + str(row[0])
    # ファイル ジオデータべ―スに格納されているフィーチャクラスをマージして新規フィーチャクラスを作成します。
    fcMerge = arcpy.Merge_management(fcList, ws + os.sep + os.path.basename(ws)[:3]).getOutput(0)
    print "マージ結果のフィーチャクラス: " + fcMerge.encode("cp932")

# オブジェクトを削除して参照を開放します。
del cur

免責事項

こちらのサンプルはあくまでもコーディングの見本であり、実行時に発生したエラーの対処方法につきましては、サポート対象外とさせていただきます。また、操作方法やソースコードに関するご質問は別途有償の開発者サポート契約にてご対応させていただきます。なお、コードを実行して生じたいかなる損害についても弊社では責任を負いかねます。

メタデータ

種類

製品