この記事は、「ArcGIS API for Python を使ってみよう」シリーズその⑦です。
当シリーズでは、ArcGIS API for Python (以下、Python API) の使い方をご紹介しています。
前回の記事では、ArcGIS Online が提供する解析ツールとホストされたデジタル標高モデル (DEM) を利用して、ダムの集水域の作成及び下流解析を実行し、ダムにどこから水が流れ込んでいるのか、またダムから放水された水がどの流路を通っていくのかを地図上で可視化しました。
今回の記事では Web GIS の管理に関する作業を一括で処理する使い方をご紹介します。
ArcGIS Online の組織向けプランをご契約いただくか、ArcGIS Enterprise のコンポーネントの1つである Portal for ArcGIS をオンプレミス環境に構築すると、組織のアイテムやユーザーを管理するための組織専用のポータルサイト (以下、ポータル) を利用できるようになります。ポータルを利用することで、所属するユーザーアカウント毎に権限を割り当てたり、作成されたマップやアプリケーションの共有範囲を設定したりすることができます。これにより、各ユーザーの業務の必要性に応じた GIS 機能の提供や、機密性を保持しながら組織内のデータ共有が可能になります。
このような便利な機能を提供するポータルですが、ポータルを組織で運用する中では、どうしても時期的な作業が発生することが避けて通れないことは、他システムの運用と同様です。
例えば、これからの時期ですと、新入社員の入社や組織変更に伴う部署異動などで以下のような作業が発生するでしょう。
※ArcGIS Online と Portal for ArcGIS のバージョンによっては、ポータルの GUI や機能が異なる場合があります。本記事では執筆時点での ArcGIS Online のポータルを利用します。
新たに入社された方のために新規ユーザーを作成するケースを考えます。新たにユーザーを作成する方法はいくつかありますが、最も基本的なものは、管理者側でユーザーネーム等の情報を設定し作成する方法です。以下のようにポータルの GUI を使ってこの操作を実行する場合、管理者としてログインした後、組織タブの概要からメンバーの招待をクリックし、必要な情報を入力する作業を繰り返さなければいけません。CSVファイルを事前に用意して一括で取り込むことも可能ですが、定形の繰り返し作業になるため、プログラムで処理できると効率的です。
部署異動でポータル上にアイテムを大量に所有している人が他の部署に異動するため、別の方にアイテムの所有権を移す必要があると仮定しましょう。この時、ポータルの GUI を使って手動で変更しようとすると、ログイン後にコンテンツの画面を開き、アイテムのチェックボックスにチェックを入れて、所有者の変更ボタンを押し、所有権を渡す相手のユーザーを指定し、ようやく処理を確定するボタンをクリックすることになります。この作業も、アイテム数が大量にある場合は、マウス操作を繰り返すのではなくプログラムで一括処理をしたいところです。
Python API は以下の 4 つのタイプの利用者を想定して開発されている Web GIS のための API です。
組織の管理者が含まれているように、Python API を活用することで、上記のようなポータルの管理に係る作業をスクリプトで自動化したり、一括で処理したりすることが可能です。以降では、上記の作業を処理する具体的なコードについて紹介します。
また、今回は ArcGIS Developers Subscritpion を利用して作成した開発及び評価用途のための ArcGIS Online の組織サイト上で上記作業の一括処理を試行しました。ArcGIS Developer Subscription の Builder 以上の有償プランをご利用いただくと、開発及び評価用の ArcGIS Online 組織サイトを作成することが可能です。詳しくは ArcGIS for Developers の Web サイトを参照いただくか、ご不明な点があればお気軽にお問い合わせください。
開発及び評価用の ArcGIS Online 組織サイトでは、管理者のアカウントを含む Creator タイプのユーザーを 2つ、Viewer タイプのユーザーを 3 つ、合計 5 つのユーザーを作成可能です。今回は Viewer タイプのユーザーを 3 つ一括で作成します。ユーザータイプについては、ライセンス体系に関する記事を参照ください。
まずは Python API のモジュールを import して、管理者権限をもつアカウントで組織サイトにログインします。
# 必要なモジュールをインポート from arcgis.gis import * # 管理者としてログイン user_name = "管理者のユーザーネーム" my_gis = GIS("ポータルのURL", username = user_name) print(str(my_gis.properties.user.username) + "としてログインしました。")
新規ユーザーの一括作成する際にループ処理をかけるため、ユーザーネームの配列を作成します。
# 新規作成するアカウントのユーザーネームの配列 new_viewers = ["esrij_dev1", "esrij_dev2", "esrij_dev3"] new_viewers
作成した配列に対して、UserManager.create() メソッドを用い、アカウントを作成します。UserManager クラスは gis クラスのヘルパークラスです。ログインした際に作成した GIS オブジェクトから使用することができます。
# UserManager.create() メソッドを for 文で繰り返し、ユーザーを作成する # UserManager クラスは arcgis.gis クラスのヘルパークラスです。arcgis.gis.users で利用することができます。 for viewer in new_viewers: my_gis.users.create( username = viewer, password = viewer + '_test_pass', firstname = viewer.split("_")[0], lastname = viewer.split("_")[1], email = viewer + "@esrij.com", role = "viewer", user_type = "viewer" )
配列内のユーザーネームに対してループ処理をかけてユーザーを作成します。password は最初にログインする際に入力する一時的なパスワードです。新規ユーザーがログインした際に独自のパスワードに変更するよう要求されます。
氏名にあたる firstname、lastname には、ユーザーネームをアンダーバーで分割し、それぞれ使用しました。今回作成するユーザータイプは viewer なので、 role 及び user_type は viewerに設定します。その他 UserManager.create() の詳細については API リファレンス (英語) を参照下さい。
次にアイテムの所有者を一括で変更します。まずはアイテムの現所有者を検索します。UserManager.search() メソッドを使うことで、組織内のユーザーアカウントを検索することができます。結果は配列で返されます。
# アイテムの現所有者を検索 current_owner = my_gis.users.search("ads_enterprise_dev1")[0] current_owner
User.items() メソッドでそのユーザーが所有するアイテムを配列で取得できます。パラメーターとしてフォルダー名を指定しますが、何も指定しない場合はルート フォルダー内のアイテムが表示されます。
# ルート フォルダー内のアイテムの確認 current_owner.items()
次に、新たにアイテムの所有者となるユーザーも同じように検索します。
# アイテムの新たな所有者となるユーザーを検索 target = my_gis.users.search("nakamura_dev_org")[0] target
アイテムの所有者の一括変更には、User.delete() もしくは User.reassign_to() を使用します。
前者を用いると、元の所有者であるユーザーの削除と同時に、アイテムの所有権が指定したユーザーに移されます。アイテム所有者が組織から異動する等で、所有者のアカウントが不要になる際に用いると便利です。パラメーターの reassign_to = には新たにアイテムの所有権を移す先のユーザーネームを指定します。削除対象のユーザーがアイテムを所有しているにもかかわらず、reassign_to = が指定されていなかった場合は、エラーとなり処理は実行されません。
ユーザーを削除せずにアイテムの所有権だけを移したい場合は、後者を用いることでアカウントは削除せずにアイテムの所有者のみ変更できます。
# 現所有者の所持する全てのアイテム、グループの所有権を新たな所有者へ移すと同時に、現所有者のアカウントを削除する current_owner.delete(reassign_to = target) # アカウントを削除せずにアイテムの所有者のみを変更するメソッドもあります # current_owner.reassign_to(target)
User.items() メソッドを用いてアイテムの所有者が変更されているかを確認します。誰のアイテムであったのかがわかるよう、"前所有者のユーザー名" + "_フォルダー名"で新たなフォルダーが作成され、中にアイテムが格納されています。ルート フォルダーの場合、フォルダー名は root となるため、以下のようにフォルダーを指定します。
# アイテムの所有が移ったかを確認 target.items("ads_enterprise_dev1_root")
結果は以下のとおりです。
今回のブログでは、ポータル管理に係る作業の一括処理についてご紹介しました。組織が所有するアイテムの数やユーザーの数が大きくなるほど作業が増えていきがちです。Python API を活用して一括処理や自動化を進めることで、効率的なポータル管理を実現できます。
本稿で使用した全体のコードは ESRIジャパン GitHub でも公開しています。是非参考にしていただければと思います。
本ブログでは今後も Python API の便利な使い方や特徴についてご紹介していきます。
※ 本稿で表示したデータは ESRIジャパン オープンデータポータル内で公開されているデータを使用しました。当該データは、国内で ArcGIS Open Data を用いて公開された組織のデータ、または、全国都道府県・市区町村のオープンデータを ESRIジャパンにて収集・再公開したデータです。