はじめに
ArcGIS API for Python は Web GIS の自動化のための Python ライブラリーです。 第23回 GISコミュニティフォーラムで ArcGIS Online 操作の自動化を中心にセッションを実施しました。
セッションについて
2026 年 5 月 27 日(水)から 29 日(金)にかけて、東京ミッドタウン六本木にて「第23回 GISコミュニティフォーラム」が開催されました。
フォーラム全体の振り返りはこちらです。
最終日 29 日 15:55 ~の「ArcGIS API for Python 基礎講座:Web GIS の操作と自動化入門」セッションでは Web GIS の自動化のためのライブラリーである ArcGIS API for Python について基礎的な内容からいくつかの Tips を紹介しました。
Tips では実際に実行した内容を中心に紹介してきましたが、「同じようなことができるようにしてほしい」、「より多くのサンプルコードを見せてほしい」とのご意見がありましたので、本記事で解説しようと思います。
ArcGIS API for Python はArcGIS Online や ArcGIS Enterprise の操作を自動化できる Python ベースの APIです。
ArcGIS API for Python についての基礎的な説明はこちらのシリーズ記事を参照してください。
本記事で取り上げる内容
本記事ではセッションでデモを用いて紹介した Tips をこちらの順番で説明します。
- サイン イン (認証)
- フォルダーとアイテムの一括削除
定期実行
- 定期実行させる内容
- Feature Layer の用意
- Feature Layer を更新するスクリプト
- 確認用アイテムの準備
- タスクの設定
- 確認
- 共有する場合の注意点
サイン イン (認証)
まずはプライベートなアイテムやベースマップなどの ArcGIS の機能にアクセスするために必要なサイン イン(認証)です。以下のスライドで説明していました。
ArcGIS API for Python では認証をした後に公開コンテンツや自分のプライベートなコンテンツにアクセスして操作を行います。 以下のような ArcGIS に紐づいた環境で、あらかじめ ArcGIS Pro や ArcGIS Online にサイン インしている場合は、GIS("home") で簡単に認証できます。
・ArcGIS Pro の Python ウィンドウ
・ArcGIS Online / ArcGIS Enterprise のノートブック
・ArcGIS Pro のクローン環境の python.exe を使って実行している環境
これに該当しない Google Colab や ArcGIS Pro をインストールしていない環境などでは GIS(“home”) が使えないので ID とパスワードや、 API キーを使用した方法等で認証をする必要があります。認証方法はここで紹介している方法の他にも多く存在するので、気になる方は GIS モジュールのリファレンスをご参照ください。
以下に API キー認証でいくつかプライベートな情報を表示させる例を記載します。
#API キー認証
gis = GIS(api_key="<YOUR_API_KEY>",referer="https")
#GIS オブジェクトの表示
print(gis)
#ユーザー の表示
print(gis.users.me)
#プライベートなアイテムの表示
myItem = gis.content.get("<アイテム ID>")
myItem
フォルダーとアイテムの一括削除
続いて、フォルダーとアイテムの一括削除です。
セッションではフォルダーとその中身を一括で削除する方法を動画で紹介していましたが、次のコードのように Folders クラスや Folder クラスを使って実行していました。
ここではフォルダーを一つ一つ取得し、ルート フォルダーでなければフォルダー名を表示し削除を行い、削除ができないルート フォルダーは最後にアイテムの削除のみを行っています。
# 認証(ここでは ID とパスワードを使用)
from arcgis.gis import GIS, Item
gis = GIS("ポータルURL", "削除対象ユーザーネーム", "パスワード")
print(gis)
# フォルダ一一覧を取得
folders = gis.content.folders.list()
# フォルダー名をリストで取得
folder_names = [f.name for f in folders]
# 結果を表示
for name in folder_names:
#if name!='Root Folder':
print(f"フォルダーの名前は {name}")
folder_name = name
folder = gis.content.folders.get(folder_name)
if name!='Root Folder':
if folder is None:
print(f"フォルダー '{folder_name}' は見つかりませんでした。")
else:
# フォルダー内のアイテムも合わせて削除する
ok = folder.delete()
if ok:
print(f"フォルダー '{folder_name}' とその中身を削除しました。")
else:
print(f"フォルダー '{folder_name}' の削除に失敗しました。")
elif name=='Root Folder':
if folder is None:
print(f"フォルダー '{folder_name}' は見つかりませんでした。")
else:
root_items = gis.users.me.items()
for item in root_items:
try:
print(f"{item.title} ({item.type})を削除しました")
item.delete()
except Exception as e:
print(f"Error deleting {item.title}: {e}")
ここで紹介した方法以外にも GIS モジュールの search メソッドで所有アイテムを検索し、アイテムを全て削除してからフォルダーを削除する方法でも同様の作業が実行できます。
定期実行
定期実行させる内容
この項では以下のような流れで外部 API と連携した Feature Layer の更新を行います。
次のセクションから各手順を説明します。
Feature Layer の用意
最初の手順として、更新するための材料を用意します。 以下のようなスクリプトで API から取得した情報を処理し、更新用データを作成します。 ここでは ArcGIS Online のノートブックで実行することを想定しています。 ※ArcGIS Online のノートブックの詳しい使い方はこちらを参照してください。
実行する時は ArcGIS Online のノートブックで新しいノートブックを Standard で作成し、1 セル目に上書きするように貼り付けてください。
from arcgis.gis import GIS
from arcgis.features import FeatureLayerCollection
import requests
import time
# 1) 接続(ここでは home で認証する)
gis = GIS("home")
# 2) ISS API から取得
ISS_URL = "http://api.open-notify.org/iss-now.json" # [1](http://open-notify.org/Open-Notify-API/ISS-Location-Now/)
def fetch_iss():
r = requests.get(ISS_URL, timeout=30)
r.raise_for_status()
data = r.json()
lat = float(data["iss_position"]["latitude"])
lon = float(data["iss_position"]["longitude"])
ts_sec = int(data["timestamp"])
ts_ms = ts_sec * 1000
return lat, lon, ts_ms
# 3) Hosted Feature Service 作成
SERVICE_NAME = "ISS_Last3Points"
service_item = gis.content.create_service(
name=SERVICE_NAME,
service_type="featureService"
)
flc = FeatureLayerCollection.fromitem(service_item)
# 4) レイヤー定義
layer_def = {
"layers": [{
"name": "<作成する Feature Layer の名前>",
"type": "Feature Layer",
"geometryType": "esriGeometryPoint",
"spatialReference": {"wkid": 4326},
"objectIdField": "ObjectID",
"fields": [
{"name": "ObjectID", "type": "esriFieldTypeOID", "alias": "ObjectID"},
{"name": "latitude", "type": "esriFieldTypeDouble", "alias": "latitude"},
{"name": "longitude", "type": "esriFieldTypeDouble", "alias": "longitude"},
{"name": "obs_time", "type": "esriFieldTypeDate", "alias": "obs_time"},
]
}]
}
# 5) 定義をサービスに追加
flc.manager.add_to_definition(layer_def)
layer = flc.layers[0]
# 6) 初期 3 件投入(ISS API 推奨に考慮して 5 秒間隔)
adds = []
for i in range(3):
lat, lon, ts_ms = fetch_iss()
adds.append({
"geometry": {"x": lon, "y": lat, "spatialReference": {"wkid": 4326}},
"attributes": {"latitude": lat, "longitude": lon, "obs_time": ts_ms}
})
if i < 2:
time.sleep(5) # ポーリング過多を避ける [1](http://open-notify.org/Open-Notify-API/ISS-Location-Now/)
res = layer.edit_features(adds=adds)
print("作成したアイテム ID:", service_item.id)
print("レイヤーURL:", layer.url)
print("追加結果:", res)
実行が終わるとこのようにアイテムが作られます。スクリプトで指定した名前でアイテムが作成されていることを確認します。
これで更新用データの用意はできました。
Feature Layer を更新するスクリプト
先ほど作成したアイテムの ID を使って更新をします。 アイテム ページの [URL] の下の下矢印を開いてアイテム ID を探します。
次に、以下のスクリプトを使用してデータの更新を行います。 ここでは 3 件あるフィーチャのうち、最も古いものを削除し、取得したデータを新たに追加するように処理しています。新しく Standard でノートブックを作成し、データ作成時と同じように 1 セル目に上書きするように貼り付けてください。
from arcgis.gis import GIS
import requests
gis = GIS("home")
ITEM_ID = "<作成したアイテム ID>"
ISS_URL = "http://api.open-notify.org/iss-now.json"
def fetch_iss():
r = requests.get(ISS_URL, timeout=30)
r.raise_for_status()
data = r.json()
lat = float(data["iss_position"]["latitude"])
lon = float(data["iss_position"]["longitude"])
ts_sec = int(data["timestamp"])
ts_ms = ts_sec * 1000
return lat, lon, ts_ms
# 1) レイヤー取得
item = gis.content.get(ITEM_ID)
layer = item.layers[0]
# 2) 既存 3 件を時刻昇順で取得(古い順)
# order_by_fields は REST の orderByFields 相当の指定
fset = layer.query(
where="1=1",
out_fields="ObjectID,obs_time",
order_by_fields="obs_time ASC"
)
features = fset.features
# 3) 3 件以上なら最も古い 1 件を削除
if len(features) >= 3:
oldest_oid = features[0].attributes.get("ObjectID")
# edit_features の deletes は「OIDのカンマ区切り文字列」が基本 [10](https://gis.stackexchange.com/questions/278263/arcgis-api-for-python-delete-multiple-features)
del_res = layer.edit_features(deletes=str(oldest_oid))
print("削除:", del_res)
# 4) 新規 1 件追加
lat, lon, ts_ms = fetch_iss()
new_feature = {
"geometry": {"x": lon, "y": lat, "spatialReference": {"wkid": 4326}},
"attributes": {"latitude": lat, "longitude": lon, "obs_time": ts_ms}
}
add_res = layer.edit_features(adds=[new_feature])
print("追加:", add_res)
# 5) 現在件数を確認
cur_cnt = layer.query(where="1=1", return_count_only=True)
print("現在件数:", cur_cnt)
実行が成功すると以下のように削除と更新についてのメッセージが表示されます。
これで更新のためのスクリプトの準備が完了しました。 次に更新を確認するためのアイテムを作ります。
確認用アイテムの準備
まずは Web マップを作ります。 Feature Layer のアイテムを Map Viewer で開き、[保存と開く] から [名前を付けて保存] をクリックし、Web マップを作成します。
これで更新が行われると、マップをリロードして更新を確認できるようになります。 また、Web マップから、フィーチャ レイヤーの設定を開き、「レイヤーを自動的に更新」のチェックをオンにしておくとブラウザをリロードしなくても更新の反映を確認することができます。
以下は実行例です。
次から作成したポイントを定期的に更新させるための設定をします。
タスクの設定
※タスクの実行には、実行時間に応じてクレジットが消費されます。設定の際はご自身の保有クレジットを考慮することをおすすめします
ArcGIS Online のノートブックのタスク機能を利用して作成したデータを更新するノートブックを定期実行させます。
ノートブック上部の[タスク]タブを選択し、[タスクの作成] をクリックします。
タイトルを入力し [次へ] をクリックし、タスク スケジュールの詳細を設定の項目へ進みます。 繰り返しについて設定を行い、[作成] をクリックします。 これで、指定した間隔でノートブックが実行されるようになりました。
更新の確認
作成したタスクの名前をクリックするとタスクが実行された履歴を確認することができます。以下の図はセッションで紹介した 15 分間隔の実行を指定した場合の履歴です。
履歴から更新が行われていることを確認してから確認用 Web マップを開くと、15 分間隔の国際宇宙ステーションの位置ポイントが描画されていることがわかります。以下の実行例では事前に Map Viewer で Web マップのシンボルを編集したものを使用しています。
共有する場合の注意点
これまでの手順で定期更新される Feature Layer と Web マップを作成しましたが、この方法では、直接スクリプトから更新する Feature Layer を他の人に見せることができません。
ここでは表示と編集の役割を分けるためにレイヤー ビューを作成します。 レイヤー ビューは Feature Layer のアイテム ページ右側のメニューの「ビュー レイヤーの作成」から作成できます。詳しい作成方法はこちらの記事を参照ください。
ここで作成したレイヤー ビューの共有設定を所有者から組織またはパブリックに変更し、レイヤー ビューを使用して Web マップやダッシュボードを作成することで、他のユーザーに共有することができるようになります。 以下は、ダッシュボードの場合のアイテムと共有設定例です。
・ Feature Layer (共有設定は所有者)
・レイヤー ビュー (共有設定は組織またはパブリック)
・ Web マップ (共有設定は組織またはパブリック、データ ソースはレイヤー ビュー)
・ダッシュボード (共有設定は組織またはパブリック、データ ソースは Web マップ)
おわりに
本記事では第 23 回GISコミュニティフォーラムで実施した「ArcGIS API for Python 基礎講座:Web GIS の操作と自動化入門」セッションで紹介した Tips デモについて、実行していたスクリプトや付随する ArcGIS Online 上の設定を交えて紹介しました。タスクについては API だけでなく、Excel ファイル等 Web 上で共有されているファイルをデータ ソースとして定期更新を行うこともできます。ぜひ試してみてください。