概要
Python スクリプトを使用して、ジオデータベースのアタッチメント テーブルから添付ファイルを一括して抽出する方法をご紹介します。
※本ツールは、米国 Esri の Technical Article で紹介されているサンプルを、重複したファイル名でも出力できるよう改良したものです。改良前のツールに関しては下記ページをご参照ください。
HowTo: Batch export attachments from a feature class
今回はフィーチャクラスとアタッチメント テーブルを関連付ける ID に Global ID を使用していますが、データによって ObjectID の場合もあります。使用する場合は、フィールド名を確認の上スクリプトを変更してください。
ArcGIS Pro 3.3 以降のバージョンをご利用の場合は、[アタッチメントのエクスポート] ツールの [入力データセット] でフィーチャ レイヤー選択することで、フィーチャ レイヤーから直接添付ファイルを抽出することができます。
ダウンロード
アタッチメント テーブルから添付ファイルを出力(ArcGIS Pro 版)
アタッチメント テーブルから添付ファイルを出力(ArcMap 版)
内容
アタッチメントを使用すると、個々のフィーチャにファイル(画像、PDF、テキスト文書、その他すべての種類のファイル)を添付できます。フィーチャクラスまたはテーブル上のアタッチメントを有効にすることでアタッチメント ファイルを格納する新しいテーブル、およびアタッチされたファイルにフィーチャを関連付ける新しいリレーションシップ クラスが作成されます。フィーチャへファイルを添付する方法は、編集セッションを実行しているときに行うか、または [アタッチメントの追加(Add Attachments)] ジオプロセシング ツールを使用して行います。本ツールでは、アタッチメント テーブルに添付したファイルを一括して指定したフォルダ内に出力します。
[入力アタッチメント テーブル] には、テーブル、テーブル ビュー(アクティブなデータ フレームに追加されているテーブル)のどちらのデータを追加しても実行できます。テーブルを指定した場合は、アタッチメント テーブルに格納されているすべての添付ファイルを抽出して出力します。任意の添付ファイルのみを抽出したい場合には、データ フレームにアタッチメント テーブルとフィーチャクラスを追加して、取り出したい添付ファイルが追加されているフィーチャを選択した状態で、パラメータのドロップダウン リストからテーブル ビューを選択して実行します。
使用手順
- zip ファイルをダウンロードし、任意のフォルダに解凍します。
- [カタログ] ウィンドウで解凍により作成されたフォルダを展開します。
- フォルダ内の「ExportAttachments」ツールボックスを展開し、[アタッチメント テーブルから添付ファイルを抽出] ツールをダブルクリックします。
- パラメータを入力し、ツールを実行します。
入力パラメーター
- [入力アタッチメント テーブル] : アタッチメント テーブル、もしくは現在アクティブなデータ フレームに追加されているアタッチメント テーブル ビュー
- [入力フィーチャクラス]:アタッチメントに対応するフィーチャクラス
- [出力フォルダ] : ファイルを出力するフォルダ
注意事項
本ツールはサンプル プログラムであり、ツールの動作を保証するものではありません。ツールの操作方法やソースコード、実行時のエラーなどに関するお問い合わせは、サポート対象外となります。また、 新規バージョンに対応したツールを継続的に提供することを保証するものでもないこともあらかじめご了承ください。なお、ツールを利用して生じたいかなる損害についても弊社では責任を負いかねますことをご了承ください。 ArcPy サイト パッケージに関するプログラム固有のご質問につきましては開発者サポートにて承ります。
また、以下の免責事項についてもご確認をお願いいたします。
Python ソース コード
# coding:utf-8
# Purpose : アタッチメント テーブルから添付ファイルを抽出します。
# Author : ESRIジャパン
# ArcPy サイト パッケージ、os モジュールをインポートします。
import arcpy, os
from arcpy import da
from os import path
# パラメータを設定します。
inTable = arcpy.GetParameterAsText(0)
inFC = arcpy.GetParameterAsText(1)
fileLocation = arcpy.GetParameterAsText(2)
# 入力テーブルからパスを取得して、ワークスペースを設定します。
workspacePath = path.dirname(inTable)
arcpy.env.workspace = workspacePath
# 入力テーブルから、テーブル結合に使用するための結合先となるテーブルを取得します。
inTableName = path.basename(inTable)
FeatureClassName = path.basename(inFC)
# テーブル結合を行うためのデータを作成します。
arcpy.MakeTableView_management(inTable, 'inTableView')
arcpy.MakeFeatureLayer_management(FeatureClassName, 'FeatureLayer')
# テーブル結合
# 必要に応じて、キーの名称を書き換えてください。
arcpy.AddJoin_management('inTableView', 'REL_GLOBALID', 'FeatureLayer', 'GLOBALID', 'KEEP_ALL')
# 結合テーブルから添付ファイルを抽出して出力します。
with da.SearchCursor('inTableView', [inTableName + '.DATA', inTableName + '.ATT_NAME', FeatureClassName + '.OBJECTID']) as cursor:
for row in cursor:
binaryRep = row[0]
fileName = row[1]
OID = row[2]
open(fileLocation + os.sep + (str(OID) + '_' + fileName), 'wb').write(binaryRep)
# オブジェクトの参照を削除し、解放します。
del row
del binaryRep
del fileName
del cursor
変更履歴
2018/9/20 Portal for ArcGIS で作成したデータに対しても処理ができるよう、ツールを改修しました。