Excel × Pythonの合わせ技 : ArcGIS Online / Portal のアイテム詳細を一括更新する方法

670
0
01-31-2022 08:26 PM
Labels (2)

Excel × Pythonの合わせ技 : ArcGIS Online / Portal のアイテム詳細を一括更新する方法

はじめに

ArcGIS OnlineArcGIS Enterprise Portal に登録したアイテムを広く組織で活用するためには、アイテムのタイトルの他、サマリー、説明、タグ、利用規約など詳細な情報の入力が必要となることがあります。

そうは言っても、アイテムの詳細な情報を入力するために一つ一つのアイテムを開いて、それらを入力・更新していく作業は、なかなか骨が折れる作業です。

米国Esri のパートナーであるGEO Jobe 社 のAdmin Tools の有償版だと、CSVからの一括更新が可能なようですが、今回はExcel × Python(ArcGIS API for Python)の合わせ技で、アイテム詳細を一括更新する方法をご紹介します。解説は不要ですぐにサンプルのExcel とPython のコードを確認したい方は、いつものようにGitHub で公開しておりますので、そちらをご参照ください。

※ この方法は、2021年に公開した「3D 都市モデルの ArcGIS における活用事例を集めた活用サイト」に掲載してあるファイル ジオデータベース (FGDB) のアイテム詳細を更新・公開したときに実践した方法です。この活用サイトはArcGIS Hub Basic で構築しているため、コード内では特定グループとして、ArcGIS Hub で予め作成したサイトの”国土交通省 3D都市モデル「Project PLATEAU」の活用のコンテンツ” のグループid を指定しています。グループid は下図のようにArcGIS Online 上で確認できますが、id はArcGIS Hub で作成したサイトのグループ以外でも、ユーザーが所属している任意のものを指定いただけます。

なお、ArcGIS Hub でのサイトの作成や利用開始の方法は、「ArcGIS Hub スタートアップガイド」もしくは「A quick start guide to ArcGIS Hub Basic」等をご参照ください。

Group_id.png

図 ー グループ id の例(弊社の「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」グループ)

 

1 アイテムの詳細を一括更新する仕組み

1.1 アイテムのプロパティ

まずは、ArcGIS API for Python でアイテム詳細を更新するAPI を確認してみます。API リファレンスによると、アイテム詳細の更新はarcgis.gis.Item クラスの

update(item_properties=None, data=None, thumbnail=None, metadata=None)

メソッドで可能なようで、item_properties で指定可能なディクショナリ key の一覧は、Helpにtype, typeKeywords, description, title, url, tags, text, snippet, extent, spatialReference, accessInformation, licenseInfo, culture, access, commentsEnabled と記載があります。

今回のサンプルでは、title, snippet, description, tags, licenseInfo, accessInformation を更新対象にしますが、より直感的に理解をしていただくために、item_properties に指定する key と実際の画面を対応させてみると、次のようになります。

  • id : アイテムのid
  • title : タイトル
  • snippet : サマリー
  • description : 説明(HTMLを利用可能)
  • tags : タグ(複数の場合は、カンマ区切り)
  • licenseInfo : 利用規約
  • accessInformation : 著作権

Item_properties.png

 

1.2 アイテム詳細の情報をExcel に整理

整理するアイテム詳細の情報がわかったので、Sheet1(サンプルのExcel ファイルの場合は、”更新用Sheet1”というシート名にしています) の1行目にそれぞれの item_properties の key を入力し、2行目以降にそれぞれのアイテムのプロパティを入力します(コード内で .to_dict() でディクショナリに変換したときのキーとして利用するため、1行目の列名はitem_properties のkey と厳密に一致させる必要があることに注意が必要です)。

なお、description 列はHTMLでより見やすい記述を統一して行うため、実際にはVBAマクロを使って更新しました。今回の公開にあたりマクロ付きExcel ファイルの配布は、セキュリティ上問題となる可能性があるため、マクロのコードを参考までに”UpdateDescription_SampleVBA.txt”として置いてありますので、必要に応じてご参照ください。

Sample_excel.png

図 ー Excel での整理例(サンプルのExcel ファイルでの入力例:開発テスト用の環境で使用したものです)

 

1.3 アイテムの詳細を一括更新するコードの解説

Excel に整理したら、後はノートブック に記載してあるコードをご自身の環境に合わせて少し変更して実行するだけです。具体的にはノートブックのセル内の、”your_xxx”、”new_owner_name”、”share_group_id”で記載している個所をご自身の環境に合わせて書き換えが必要です。

ノートブックにもコメントを記載してありますが、再度、ポイントとなる処理の解説をしておきます。

(1) Pandas のDataFrame にExcel データを読み込み

最初に、Pandas のDataFrame にExcel を読み込みます。

 

import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx" 
df = pd.read_excel(excel_file)

 

 

※ xlrdバージョン2.0.0 から対応フォーマットが"xls"のみに変更されたとのことで、環境によっては pd.read_excel で"xlsx"を読み込むときに、次のように、openpyxl をengine として指定する必要があります。ArcGIS Pro でクローンした環境の場合は、xlrdのバージョンは1.2.0 なので、基本的にはengine の指定は必要ありません(ArcGIS Pro でのクローン環境の作成方法は、[ArcGIS Developer 開発リソース集] - [arcgis パッケージをアップグレードする] - [ArcGIS Pro 2.3 以上の環境の場合] をご参照ください)。

 

import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx" 
df = pd.read_excel(excel_file,engine='openpyxl')

 

 

(2) ArcGIS Online の組織サイトに接続し、アイテム情報の更新と、特定グループに共有

次に、ArcGIS Online の組織サイトに接続し、それぞれの行に対してExcelの 'id' をもとにアイテムを取得し、そのアイテムの'title', 'snippet', 'description', 'tags', 'licenseInfo', 'accessInformation' をitem.update() で更新しています。ついでに、アイテムのprotect() で削除防止を有効に設定、さらにshare() で組織と特定グループにアイテムを共有する設定を行っています。

上記でも解説しましたが、item_properties で指定可能なディクショナリ key と、画面の文言の対応は、1.1 アイテムのプロパティ でご説明した通りです。

 

from arcgis.gis import GIS
gis = GIS("https://www.arcgis.com/", "your_username", "your_password")

for index, row in df.iterrows():
    item_id = row[0] # id を取得
    item_properties = row[1:7].to_dict() # title~accessInformation 列をdictionary として取得
    my_item = gis.content.get(item_id) # アイテムを取得
    my_item.update(item_properties) # item.update() で、アイテムのtitle~accessInformation の情報を更新
    my_item.protect(enable = True) # うっかり削除を防止するため、アイテムの削除防止を有効に設定
    my_item.share(org= True, groups=['share_group_id']) # 組織と特定グループに共有 - テスト環境;「Open Data 共有のコンテンツ」(id:f862b4f5d32f435596795947df012042)、本番環境;「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」(id:d568e2190c4f456f8bd812c8e07c719a)

 

 

2 ArcGIS Hub のカタログサイトに公開する仕組みのポイント解説

※ 本来、上記までの「アイテムの情報を一括更新する仕組み」とここからの仕組みは、操作する人が異なっていたり、業務上のプロセスも異なる場合があるため、別のノートブックに分けておいた方が得策かもしれません。今回は、便宜上同じノートブック ファイルに記載しており、その解説になっておりますので、ご了承ください。

仮にサンプルのノートブック ファイルを分割する場合は、ここからの仕組みのコードの前に必要な処理は、(1) Pandas のDataFrame にExcel データを読み込み で説明した、以下のコードとなります。

 

import pandas as pd
excel_file = r"your_folder_path\3D都市モデル_AGOLアイテム詳細_開発テスト用.xlsx" 
df = pd.read_excel(excel_file)

 

 

2.1 ArcGIS Hub のカタログサイトに公開するコードの解説

(3) 管理者でArcGIS Onlineの組織サイトに接続し、アイテム所有者の変更と、特定グループへの共有、パブリックに公開を実施

最後のステップとして、最初にreassign_to() でアイテムの所有者を変更し(所有者変更は必須ではありませんが、今回の場合は、個人から弊社の公開用アカウントに変更しています)、その後、新しい所有者がshare() で組織と特定グループにアイテムを共有にする設定とパブリック公開を実施しています。

 

gisadmin = GIS("https://www.arcgis.com/", "your_admin_username", "your_admin_password") # 管理者

for index, row in df.iterrows():
    item_id = row[0] # id を取得
    my_item = gisadmin.content.get(item_id)
    # 最初に所有者変更
    my_item.reassign_to("new_owner_name") # テスト環境;"kataya@dev3admin"、本番環境:"Esri_Japan"
    # ArcGIS Hubでの公開するコンテンツとして反映させるために、所有者変更の後に、再度、組織の特定グループ共有を行う
    my_item.share(everyone = True, org= True, groups=['your_share_group_id']) # 組織と特定グループに共有 - テスト環境;「Open Data 共有のコンテンツ」(id:f862b4f5d32f435596795947df012042)、本番環境;「国土交通省 3D都市モデル 「Project PLATEAU」の活用 のコンテンツ」(id:d568e2190c4f456f8bd812c8e07c719a)

 

 

更新後のイメージ

スクリプトを実行し終えると、単独のアイテムとしてはArcGIS Online 側からみると、次のようになっています。

Item_agol.png

図 ー 単独のアイテムの更新後の例(ArcGIS Online のアイテム詳細:開発テスト用の環境の「3D都市モデル (Project PLATEAU)宇都宮市 ファイルジオデータベース」)

また、ArcGIS Hub のカタログサイトでは、次のように見えます。

Item_hub.png

図 ー 単独のアイテムの更新後の例(ArcGIS Hub のカタログサイトのアイテム詳細:開発テスト用の環境のカタログサイト)

ここでカタログサイトの画面中央の「3D都市モデル 宇都宮市(Project PLATEAU)ファイルジオデータベース」に注目してみると、上記のArcGIS Online のアイテム詳細の説明 (Excel だとdescription 列)の107文字相当が表示されています。つまり、ArcGIS Hub でのデータ公開も視野に入れた時には、アイテム詳細の説明 の文章の最初の方に、必要な情報を優先して記載しておく事が、二重入力の手間を省いてデータを公開する一つのテクニックだということです。

 

まとめ

今回の記事で紹介したExcel × Python(ArcGIS API for Python)の組み合わせで、ArcGIS Online のアイテムの情報を一括更新するだけでなく、ArcGIS Hub 側での登録の手間を省いて、最終的には105 のアイテムを公開することが出来ました(参考:「3D都市モデル ファイルジオデータベース」のカタログ)。

・ノートブック ファイル、・Excel のサンプル、・description 列を更新するVBAマクロのサンプル の3ファイルをいつものようにGitHub で公開しておりますので、ご活用ください。

また、アイテムを組織内で活用する際のポイントとして、過去に「アイテム管理のポイントの紹介(前編後編)」を行った記事もありますので、あわせてご参照ください。

 

参考資料

GEO Jobe 社 のAdmin Tools

3D 都市モデルの ArcGIS における活用事例を集めた活用サイト

 

【ArcGIS Hub】

ArcGIS Hub Basic の概要

ArcGIS Hub スタートアップガイド

A quick start guide to ArcGIS Hub Basic

 

【ブログ記事】

アイテム管理のポイントの紹介 - 前編 -:タグを効果的に活用しましょう

アイテム管理のポイントの紹介 - 後編 -:カテゴリを活用しましょう

 

【コード、API】

Pure Python でCSV からREST API で更新するスクリプト

ArcGIS API for Python のガイド

ArcGIS API for Python のAPI リファレンス(class arcgis.gis.Item)

・アイテム情報の更新:update(item_properties=None, data=None, thumbnail=None, metadata=None)

・アイテムの共有:share(everyone=False, org=False, groups=None, allow_members_to_edit=False)

・所有者の変更:reassign_to(target_owner, target_folder=None)

 

 

Labels (2)
Version history
Last update:
‎01-31-2022 08:41 PM
Updated by:
Contributors