ArcGIS Online のほとんどのコンテンツ (フィーチャ レイヤーや Web マップなど)は、ArcGIS Assistant(ベータ版)を使用して複製することができますが、より複雑なコンテンツには、ArcGIS API for Python の利用が必要になります。
本記事では、ArcGIS API for Python を使用してダッシュボード、Web アプリ、Survey123、等のコンテンツを別のアカウントへ複製する方法についてご紹介します。
まずは複製したいアイテムを特定します。
ArcGIS Online にアクセスし、複製したいコンテンツを所有するArcGIS アカウントでサインインします。コンテンツ タブをクリックし、複製したいアイテムを探します。アイテム名をクリックすると、アイテム詳細ページが表示されます。
ブラウザのアドレスバーから URL の最後 id= 以降に表示されるアイテム ID をコピーして控えておきます。
その他にも複製させたいアイテムがあればそれぞれのアイテム ID を控えておいてください。
アイテムによっては、他のアイテムを参照している場合があります。例えば、ダッシュボードはWebマップを参照し、さらにその Webマップはフィーチャ レイヤーを参照しています。ダッシュボード、Web マップ、フィーチャ レイヤーは3つの異なるアイテムですが、ダッシュボードだけ複製を行うと、参照されているアイテムも自動的に一緒に複製されます。
ArcGIS Online や ArcGIS Pro のノートブックや Jupyter Notebook などで アイテムを複製する Python のコードを作成していきます。
ArcGIS Pro をお使いの場合、挿入タブから新しい Notebook を選択しノートブックを開きます。ArcGIS Online をお使いの場合はノートブック タブをクリックし、新しいノートブックを選択し、ノートブックを開きます。
最初のセルに以下のコードを入力し、Run ボタンで実行します。
username = input("Enter username of origin organization: ")
from arcgis.gis import GIS
gis1 = GIS("https://arcgis.com", username)
表示されるテキストボックスにユーザー名を入力し、Enter キーを押します。
次に表示されるテキストボックスにパスワードを入力し、Enter キーを押します。
続いて、アイテムの複製先の ArcGIS アカウントに接続します。
ノートブックの次のセルに以下のコードを入力し、実行します。
username_2 = input("Enter username of target organization: ")
gis2 = GIS("https://arcgis.com", username_2)
同様に表示されるテキストボックスに複製先のアカウントのユーザー名とパスワードを入力します。
続いて、複製するアイテムを特定し、複製先の ArcGIS Online アカウントにコピーします。
次のセルに以下のコードを入力します。
items = gis1.content.get("アイテムID")
print(str(len(items)) + " item will be cloned:")
items
get(“アイテムID”) に最初に控えておいたアイテム ID を入力します。
複数のアイテムがある場合は以下のように複数指定することも可能です。
items = gis1.content.search(query= "id:(5f3b5c9325314fc3a11c1d649d37461e OR fc1b539234f44ee89845ea926e5e393f)")
アイテム ID を入力したら、セルを実行します。
実行すると対象のアイテムのタイトルやタイプなどが表示されるので正しいことを確認します。
最後に、アイテムを対象のアカウントに複製します。
次のセルに、以下のコードを入力し、セルを実行します。
def deep_copy_content(input_list):
for item in input_list:
try:
print("Cloning " + item.title)
copy_list = []
copy_list.append(item)
gis2.content.clone_items(copy_list,copy_data=True, search_existing_items=True)
print("Successfully cloned " + item.title)
except Exception as e:
print(e)
print("The function has completed")
deep_copy_content(items)
完了すると “The function has completed” というテキストが表示されます。
ArcGIS Online に移動し、対象のアカウントでサインインします。
コンテンツ タブをクリックして、アイテムが複製されたことを確認します。
他のアイテムを参照しているアイテムを複製した場合は、参照しているすべてのアイテムが表示されます。同じアイテムを参照している異なる複数のアイテムを複製する場合は、参照しているアイテムが重複して複製されることはありません。
clone_items() メソッドの copy_data パラメータを False にすることで、参照するアイテムを複製しないことも可能です。clone_items() メソッドの詳細については API リファレンスをご参照ください。
一度に複数のアイテムを複製する場合は、複製するアイテムを特定する段階で以下のようなコードを入力します。max_items パラメータで取得するアイテムの上限を設定することができます。デフォルトでは 10 が設定されています。
items = gis1.content.search(query="owner: {}".format(username), max_items=10, sort_field='id', sort_order='desc')
items
複数のアイテムを取得した状態でアイテムを複製する関数を定義した以下のセルを実行すると取得したアイテムを一括で複製することができます。
def deep_copy_content(input_list):
for item in input_list:
try:
print("Cloning " + item.title)
copy_list = []
copy_list.append(item)
gis2.content.clone_items(copy_list,copy_data=True, search_existing_items=True)
print("Successfully cloned " + item.title)
except Exception as e:
print(e)
print("The function has completed")
deep_copy_content(items)
アイテムの取得については search() メソッドで対象のアイテムを絞り込むこともできます。
詳細は search() メソッドの API リファレンスや REST API の Search Reference をご参照ください。
本記事で紹介した方法は ArcGIS StoryMaps を複製することはできません。ArcGIS StoryMaps を複製する方法については本記事とは別の手順で Esri のサンプルノートブックが公開されておりますのでご参考にしていただければと思います。
本記事では ArcGIS API for Python を使用した別のアカウントへのコンテンツの複製方法についてご紹介しました。組織間のデータの移行や共有、開発段階から本番段階への移行など、コンテンツの複製が必要な際にお役立てください。また、ArcGIS API for Python のガイドページには、複製できるアイテムの形式など詳細が記載されていますのでそちらもご参考にしてください。
ESRIジャパン Web サイト:
米国 Esri 社 Web サイト:
・ArcGIS API for Python:API リファレンス
・ArcGIS API for Python:Cloning Content
・Esri Community:How to copy content from one ArcGIS Online account to another using Python