フィーチャサービス/フィーチャクラスから添付ファイル(アタッチメント)を一括でダウンロードするサンプルツールを作成しました!

2279
0
04-29-2021晚上11:41
标签(1)

フィーチャサービス/フィーチャクラスから添付ファイル(アタッチメント)を一括でダウンロードするサンプルツールを作成しました!

はじめに

ArcGIS职业では,アタッチメント(添付ファescル画像、PDF,テキスト文書,その他すべての種類のファescルフィ,チャクラスの各フィ,チャに追加することができ,またエクスポ,トしてロ,カルに保存することもできます。なお,エクスポ,トは1のフィチャに対してのみしか行うことができません。

そこで,今回はフィチャクラスのすべてのフィチャから添付ファルを一括でエクスポトするルをArcPyを使用して作成しました。

さらに,ArcGIS API for Pythonを組み合わせることで,ArcGIS在线に公開しているホストフィーチャサービスに対しても同様に,添付ファイルを一括でエクスポートできます。

toolbox_scripttool.png

tooldialog.png

今回は,さらにPythonスクリプトをオリジナルのジオプロセシングルとして使用できるスクリプトルも作成しています。スクリプトルとして作成しておくことで,Pythonのコ,ディングに不慣れな方もオリジナルの機能をArcGIS职业用户界面からジオプロセシングルとして利用していただくことができます。

ルは下記の記事を参考に作成しています。

使用している製品

  • ArcGIS Pro 2.7.3(基本ラaapl .センス. exe
  • ArcGIS API for Python 1.8.3

処理の流れ

  1. モジュルのンポト
  2. パラメ,タ,の設定
  3. ArcGIS Onlineにアクセス
  4. デ,タを分割するためのOBJECTIDのリストを取得
  5. レプリカを作成する際の条件式を作成
  6. フィチャサビスからファルジオデタベスのレプリカを作成しロカルにダウンロド
  7. ダウンロ,ドしたレプリカ(邮政编码ファereplicationルからアタッチメントテ,ブルを取得
  8. アタッチメントテブルから添付ファルを抽出

各処理のコ,ド

1.モジュルのンポト

実行に必要なモジュルをンポトします。ArcPyモジュ,ル(arcpy)ArcGIS API for Pythonモジュ,ル(arcgis.featuresなどを▪▪ンポ▪▪トしてPythonから地理信息系统の機能にアクセスします。

进口arcpy
进口arcgis.features
进口arcgis.features.managers
进口arcgis.gis
进口操作系统
进口zipfile
从datetime导入datetime

2.パラメ,タの設定

arcpy.GetParameterAsText ()関数を使用してスクリプトを設定します。

agol_flag = arcpy.GetParameterAsText(0)
user_name = arcpy.GetParameterAsText(1)
密码= arcpy.GetParameterAsText(2)
feature_service_url = arcpy.GetParameterAsText(3)
replica_layers = arcpy.GetParameterAsText(4)
attachment_table = arcpy.GetParameterAsText(5)
dtime = datetime.now().strftime("%Y%m%d%H% m% S")
Replica_name = "replica_%s" % (dtime)
output_folder = os.path.join(arcpy.GetParameterAsText(6), replica_name)

3.ArcGIS Onlineにアクセス

ArcGIS API for Pythonのarcgis.gis.GISクラスを使用してArcGIS在线にアクセスします。

AccessAgol(user_name, password):
gis = arcgis.gis.GIS("https://www.arcgis.com", user_name, password)
返回gis

4.デ,タを分割するためのOBJECTIDのリストを取得

大量のデ,タに対して一度にレプリカを作成できないため,デ,タを最大5000年レコドずに分割するためのOBJECTIDのリストを取得します。
※ルの実行に失敗する場合は,分割するレコド数を小さく設定して試してください

def SplitObjectIds (object_id):
N = 5000
Sort_object_ids = sorted(object_ids)
对于I在range(0, len(sort_object_ids), n):
生成sort_object_ids[i:i + n]

5.レプリカを作成する際の条件式を作成

目标のリストをもとに,レコ,ドを分割して処理するための条件式を作成します。

def CreateWheres(replica_layers, feature_layer_collection):
#フィチャサビスの各レヤに対して処理
对于replica_layers.split(",")中的id:
对于feature_layer_collection.layers中的feature_layer:
如果feature_layer。Url [-1] == id:
Query = feature_layer。查询(= 1 = 1,return_ids_only = True)
#レコドを分割して処理するための条件式を作成
split_object_ids = SplitObjectIds(查询["objectIds"])
对于split_object_ids中的object_ids:
sql_Where = "{“% s”:{“地方”:“(OBJECTID > = % d和OBJECTID < = % d)”、“useGeometry”:假}}“% (id、object_id [0], object_id [1])
收益率sql_Where

6.フィチャサビスからファルジオデタベスのレプリカを作成しロカルにダウンロド

条件式をもとに,ArcGIS API for Pythonarcgis.features.FeatureLayerCollectionクラスarcgis.features.managers.SyncManage.create()関数を使用してホストフィーチャサービスからファイルジオデータベースのレプリカを作成し,指定したフォルダーにダウンロードします。
※レプリカの作成にはフィ,チャサ,ビスの同期とエクスポ,ト機能が有効化されている必要があります

def CreateReplicaAndDownroad(feature_service_url, gis, replica_name, replica_layers, output_folder):
#処理対象のフィチャサビスを取得
Feature_layer_collection = arcgis.features。FeatureLayerCollection (feature_service_url gis)
#フィチャサビスがレプリカの作成に対応しているかチェック
如果“提取”在feature_layer_collection.properties。feature_layer_collection.properties.capabilities中的“Sync”:
#指定したフォルダが存在しない場合は作成
if os.path.exists(output_folder) == False:
os.mkdir (output_folder)
#条件式ごとにレプリカを作成
layer_queries = CreateWheres(replica_layers, feature_layer_collection)
对于layer_queries中的layer_query:
复制= feature_layer_collection.replicas.create(replica_name=replica_name,
层= replica_layers,
layer_queries = layer_query,
return_attachments = True,
return_attachments_databy_url = False,
异步= True,
attachments_sync_direction =“双向”,
sync_model = "没有",
data_format = " filegdb ",
等= True,
out_path = output_folder)
收益率复制品
其他:
arcpy。AddError(">対象のフィ,チャサ,ビスがレプリカの作成に対応していません. "フィ,チャサ,ビスの同期とエクスポ,ト機能を有効化して再度試してください。")

7.ダウンロ,ドしたレプリカ(邮政编码ファereplicationルからアタッチメントテ,ブルを取得

ArcPyのarcpy.da.Walk()関数を使用して,指定したフォルダ,からアタッチメントテ,ブルを取得します。

def GetAttachmentTable (zip_file):
# zipファ邮箱ルを解凍
Extract_path = os.path.splitext(zip_file)[0]
用zipfile.ZipFile(zip_file)作为z:
z.extractall (extract_path)
os.remove (zip_file)
#解凍したファ@ # @ #
Walk = arcpy.da。Walk(extract_path, topdown=True, datatype="FeatureClass")
对于dirpath, dirnames, walk中的文件名:
对于文件名中的文件名:
attachment_table = "%s__ATTACH" %(os.path. path. exe)加入(dirpath文件名)
返回attachment_table

8.アタッチメントテブルから添付ファルを抽出

ArcPyのarcpy.da.SearchCursorクラスを使用して,アタッチメントテーブルの各レコードにアクセスし格納されている添付ファイルを指定したフォルダーに抽出します。

(attachment_tables, dtime, output_folder)
对于attachment_tables中的attachment_table:
#入力テブルからパスを取得して,ワクスペスを設定
Workspace_path = os.path.dirname(attachment_table)
Arcpy.env.workspace =工作空间路径
#入力テブルから,テブル結合に使用するための結合先となるテブルを取得
Input_table_name = os.path.basename(attachment_table)
Join_featureclass_name = input_table_name.split("__")[0]
#テブル結合を行うためのデタを作成
Input_table_view = arcpy。MakeTableView_management(attachment_table, "inTableView_%s" %(dtime))
Join_feature_layer = arcpy。MakeFeatureLayer_management(join_featureclass_name, "featureLayer_%s" % (dtime))
#アタッチメントテブルのGUIDフィ,ルド名を取得
for arcpy.ListFields中的view_field (input_table_view):
如果view_field.type.lower() == "guid":
Guid_field_name = view_field.name
打破
#フィチャクラスの全球IDフィ,ルド名を取得
for字段在arcpy.ListFields(join_feature_layer):
如果field.type.lower() == "globalid":
Globalid_field_name = field.name
Elif field.type.lower() == "oid":
Oid_field_name = field.name
#テブル結合の実行
Join_layer = arcpy。AddJoin_management (
input_table_view, guid_field_name, join_feature_layer, globalid_field_name, KEEP_ALL)
#結合テブルから添付ファルを抽出して出力
与arcpy.da.SearchCursor (join_layer、
[" % s。数据“% (input_table_name),
“% s。ATT_NAME“% (input_table_name),
“% s。%s" %(join_featureclass_name, oid_field_name)])作为游标:
对于游标中的行:
binaryRep = row[0]
文件名=行[1]
OID = row[2]
open(“% s / / % s_ % s”% (output_folder OID,文件名),“世界银行”).write (binaryRep)
德尔行
德尔binaryRep
德尔文件名
arcpy.Delete_management (join_layer)
arcpy.Delete_management (input_table_view)
arcpy.Delete_management (join_feature_layer)

最後に

Pythonを使用することで,ArcGIS上で地理空間データを操作する便利なプログラムを開発することができ,今回のように添付ファイルを一括でエクスポートするなど,作業の効率化が図れます。また,Web GIS (ArcGIS Online /ArcGIS企业)に共有しているデ,タは,様々なユ,ザ,がアクセスして,参照·編集が可能なため,ArcGIS职业の機能を扱うArcPyと,网络地理信息系统の機能を扱うArcGIS API for Pythonを組み合わせることで,网络地理信息系统に共有しているデ,タに対して効率的に作業を行うことができ,よりデ,タを有効活用することができます。

参考

标签(1)
版本历史
最后更新:
‎08-18-202106:31点
更新:
匿名用户
贡献者