ArcGIS ブログでお知らせしたように、ArcGIS Online の2020年 6月のアップデートからリリース版としてArcGIS Notebooks が利用できるようになり、環境を構築することなく、より手軽にArcGIS API for Python を利用可能な環境が整ってきています(詳細は「ArcGIS Online (2020 年 6 月アップデート) の新機能」をご参照ください)。
また、ArcGIS Online ヘルプから「ノートブックの基本操作」が参照できたり、Learn ArcGIS のレッスンギャラリーに「ArcGIS Notebooks を使用した教育」のレッスンが公開されたことにより、ArcGIS API for Python を使った空間データ サイエンスを学びはじめる、オンラインの情報が充実してきています。
今回は、先日の「第29回 地理情報システム学会 学術研究発表大会GIS:【ハンズオンセッション】A25-2:ArcGIS API for Python 体験」用に、上記レッスン資料の「② Notebook の紹介」と「③ ArcGIS Notebooks を使用して、Web GIS を教える」のPDFを日本語化したものをもとに、記事を掲載しております。
GIS で使用するための Python プログラミングを学習する際には、まず手動でのワークフローを見てから、Python コードを使用してどのように完了するかを確認すると便利です。このレッスンでは、ArcGIS Online でコンテンツ アイテムを見つけ、そのコンテンツを Web マップに追加し、そのコンテンツ レイヤーで空間分析を実行するというワークフローに沿って学習します。このワークフローを手動で実行した後、Python コードと ArcGIS API for Python を使ってArcGIS Notebooks を使ってワークフローを再現します。
最初に、ArcGIS Online でワークフローをテストします。空のマップに ArcGIS Online のデータを追加します。
ArcGIS Online の組織アカウントにサインインします。
リボンで マップ をクリックします。 空のマップが開きます。次に、マップにコンテンツを追加します。フォルダ、組織、ArcGIS Living Atla、および ArcGIS Online からコンテンツを追加できます。
リボン上で、追加 をクリックします。
ドロップダウン メニューから レイヤーの検索 を選択し、マイ コンテンツ をクリックして、ArcGIS Online を選択します。
Pasadena Block Groups と入力して、Enter キーで検索します。
Learn_ArcGIS が所有する一番上に表示されている結果で、追加 をクリックします。
次に、Pasadena Traffic Collisions と入力して、Enter キーで検索し、Learn_ArcGIS が所有しているTraffic Collisions で、追加 をクリックします。
リボンで、詳細 をクリックし、コンテンツ タブをクリックします。
コンテンツ ウィンドウには、マップ内のすべてのレイヤーが一覧で表示されます。マップには、カリフォルニア州パサデナのブロック グループ(Pasadena Block Groups)と、交通事故(Traffic Collisions)を含む 2 つのレイヤーがあります。交通事故 レイヤーの各赤い点は、2008 年から 2018 年の間に発生した自動車が関与する交通事故を 1 件ずつ表しています。
Step1 で作成した地図データは カリフォルニア州パサデナの交通事故を示しています。現在のシンボルでは、これらの交通事故には識別可能なパターンがありません。このデータの空間的な分布を理解する1つの方法は、ブロック グループごとにデータを集約することです。ブロック グループとは、米国国勢調査局がデータ収集方法で使用している地域の一つで、集計することで各ブロック グループで発生した交通事故の数がわかります。
リボンで、解析 ボタンをクリックします。
解析の実行 で、データの集約 を展開し、ポイントの集約 を選択します。
分析の実行 をクリックします。 分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。
コンテンツ ウィンドウで、Traffic Collisions のチェック ボックスを外して表示をオフにします。
集約されたレイヤーは、等級シンボルで示されています。ブロック グループ内で発生した衝突が多いほど、そのブロックの円が大きくなります。
次に、同じジオプロセシング ツールを実行しますが、ブロック グループごとに集約するのではなく、1kmの六角形ごとに集約します。ブロック グループは、道路や都市の境界から水域に至るまで、多くの文化的・物理的要因に基づいて描かれています。地図を見ればわかるように、これらは同じ大きさや形ではありません。より均一な方法でデータを集計するには、六角形のビンを使用します。
解析 ウィンドウには、最初に使用した ポイントの集約 ツールのパラメータ設定が表示されます。
六角形のビンのサイズの選択 で、1 キロメートル を選択します。
結果レイヤーの名前 にPasadena_Collisions_Hex_Aggregation と入力し、レイヤー名が一意となるように、あなたのイニシャルを後ろに追加します。
分析の実行 をクリックします。
分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。
六角形の集合体を見ると、高速道路 210号線と 710号線の交差点付近でほとんどの交通事故が発生していることがよくわかります。 最後に、Web マップを保存します。
リボン上で、保存 をクリックし、名前を付けて保存 を選択します。
マップの保存 ウィンドウで、タイトル にPasadena Collisions Aggregation Map と入力します。タグ に、交通事故 と入力し、マップの保存 をクリックします。 Web マップとレイヤが ArcGIS Online の Content フォルダに保存されます。
空間データを集約して、2 つの異なるポリゴン レイヤーを使用して分布を表示しました。それでは、このワーク フローを ArcGIS API for Python を使用して ArcGIS Notebooks で再現します。最初のセクションで使用した空の Web マップと同様に、空のノートブックを作成し、分析に必要なデータを追加します。
ArcGIS Notebooks でノートブックが作成されます。
コードを実行する前に、ノートブックに名前を付けて保存します。
リボン上で、保存 をクリックし、名前を付けて保存 を選択します。
タイトルにPasadena Collisions Aggregated Notebook と入力します。タグには、交通事故と入力し、ノートブックの保存 をクリックします。 これでノートブックの準備ができたので、マークダウン セルを作成し、分析のコンテキストを提供するヘッダーと説明をセルに追加します。マークダウン構文では、ヘッダーはシャープ記号(#)を使用します。
ノートブックの下部にあるコード セル(Now you are ready to start! の下部)をクリックして、そのセルをマークダウン セルに変更します。
## Aggregating Data Using ArcGIS Notebooks
このノートでは、パサデナブロック群別、六角形別に点の特徴を集約していきます。
次から GIS モジュールを呼び出し、ArcGIS Online の組織に接続します。このセルは、ノートブックを使用するたびに最初に実行する必要があります。
from arcgis.gis import GIS
gis = GIS("home")
コード セルが正常に実行されたことは、入力領域の括弧内に数字が表示され、In [1] と表示されたときにわかります。次に、パサデナの交通事故データを見つけ、ノートブックに追加します。
ノートブックの最後のセルをクリックします。
リボン上で、追加 をクリックします。
マイ コンテンツ をクリックし、ArcGIS Online を選択し、Traffic Collisions と入力して、Enter キーで検索し、Learn_ArcGIS が所有しているTraffic Collisions のアイテムのノートブックに追加 をクリックします。
# Item Added From Toolbar
# Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS
item = gis.content.get("79d3e458dcaf486f81c5591a67538179")
item
上記に記載されている、ArcGIS API for Python を使用してコンテンツ アイテムを取得するコードが、ノートブックのコード セルに追加されます。
# Item Added From Toolbar
# Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS
traffic = gis.content.get("79d3e458dcaf486f81c5591a67538179")
traffic
コンテンツ アイテムが読み込まれ、ArcGIS Online でアイテムへのアクティブなリンクが生成されます。次に、国勢調査ブロック グループ レイヤを追加します。
同様に、Pasadena Block Groups と入力して、Enter キーで検索し、Learn_ArcGIS が所有するアイテムで、 ノートブックに追加 をクリックします。
アイテム変数名を block_groups の名前を変更し、セルを実行します。
次に、マップを作成します。 注: セルを実行するたびに、新しいセルがその下に追加されます。セルを手動で追加するには、リボン上の追加 ボタンをクリックして、アクティブなセルの下にセルを挿入します。
traffic_map = gis.map('Pasadena, CA')
これにより、カリフォルニア州パサデナを中心とした地図が定義されますが、変数が呼び出されるまではノートブックに地図は作成されません。
このコード セルは、ノートブックでマップを描画しています。 次に、traffic とblock_groups を呼び出して、データを追加します。
traffic_map.add_layer(block_groups)
これにより、block_groups レイヤーがマップに追加されます。
traffic_map.add_layer(traffic)
セルを実行すると、ノートブックに描画されているマップは、ArcGIS Online で最初に作成したマップ(Step1での操作)と一致するようになります。
# 8. from arcgis.gis import GIS gis = GIS("home") # 11. , 12. # Item Added From Toolbar # Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS traffic = gis.content.get("79d3e458dcaf486f81c5591a67538179") traffic # 14. , 15. # Item Added From Toolbar # Title: Pasadena Block Groups | Type: Feature Service | Owner: Learn_ArcGIS block_groups = gis.content.get("af363700f8f84c11a02f084e78a296aa") block_groups # 16. , 17. traffic_map = gis.map('Pasadena, CA') traffic_map # 18. , 19. traffic_map.add_layer(block_groups) traffic_map.add_layer(traffic)
分析したいレイヤを特定してプレビューを行ったら、ArcGIS Notebooks でジオプロセシング タスクを実行に移ります。前回と同様に、ポイントの集約 ツールを使用して、国勢調査ブロックの地理情報データをまとめます。ArcGIS API for Python を使用して、パラメータを定義します。
リボンで、分析 をクリックします。
解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。
ArcGIS API for Python から features モジュールをインポートし、aggregate_points() 関数を呼び出す新しいコード ブロックがノートブックに追加されます。 コードを実行する前に、関数シグネチャを確認して、 aggregate_features 関数に必要なパラメータを確認します。各パラメータは、関数が期待する通りに正確に入力する必要があり、そうしないとエラーが発生します。
関数シグネチャは、 aggregate_points 関数が入力として使用するすべてのパラメータを表示します。これらの中にはオプションのものもあることに注意してください。 ここで、解析を実行するための適切な入力パラメータを関数に入力します。関数のシグネチャから、入力point_layer とpolygon_layer を定義する必要があります。また、オプションのoutput_name を設定します。さらに、この解析では、データのないブロック グループが結果レイヤーから削除されるように、keep_boundaries_with_no_points = False を設定します。
from arcgis import features
collisions_by_block_group = features.summarize_data.aggregate_points(
point_layer=traffic,
polygon_layer=block_groups,
output_name="collisions_by_block_group_YOURINITIALS",
keep_boundaries_with_no_points=False
)
関数のシグネチャを閉じて、セルをもう一度実行します。 処理の実行には数分かかる場合があります。処理中のセルでは、カッコの中にアスタリスクが入っています( Inと表示される)。今回は、collisions_by_block_group という名前の集約レイヤーを作成しています。
前のセルの下の新しいセルに、collisions_by_block_groupと入力してセルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。最初の集計を実行したので、ブロック グループ集計をマップに追加して結果を比較します。
traffic_map_1 という名前の別のマップを作成し、次のように map 変数を呼び出して 2 番目のマップを描画します。
traffic_map_1 = gis.map('Pasadena, CA')
traffic_map_1
traffic_map_1.add_layer(collisions_by_block_group)
このマップは、以前に ArcGIS Online で作成した、ブロック グループごとに交通事故を集約したマップと同じものです。
# 4. , 5. from arcgis import features collisions_by_block_group = features.summarize_data.aggregate_points( point_layer=traffic, polygon_layer=block_groups, output_name="collisions_by_block_group_YOURINITIALS", keep_boundaries_with_no_points=False ) # 7. traffic_map_1 = gis.map('Pasadena, CA') traffic_map_1 # 8. traffic_map_1.add_layer(collisions_by_block_group)
六角形のビンで集約する処理は ArcGIS Online では 1 つのステップでしたが、API を使用すると 2 つのステップが必要になります。まず、テッセレーションの生成 ツールを使用して六角形レイヤを生成します。次に、六角形のテッセレーションをフィーチャとして使用し、ポイントを集約します。
テッセレーションの生成 の、コードスニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをインポートし、generate_tessellation() を呼び出す方法を示す新しいコード ブロックがノートブックに追加されます。前のステップで aggregate_points() で行ったように、関数のシグネチャを表示することも可能です。パラメータを入力して実行できるようにします。
結果を保持するための変数 hexbins を作成し、以下のように、テッセレーションの範囲、ビン サイズ、ビン サイズの単位、ビン タイプ、結果レイヤー名、集約するポリゴンレイヤー、境界レイヤーを定義するためのパラメータをコード セルに追加します。output_name 引数には、YOURINITIALS プレースホルダを自分のイニシャルに置き換えて、組織内で一意のレイヤ名にします。
from arcgis import features
hexbins = features.manage_data.generate_tessellation(
extent_layer=block_groups,
bin_size=1,
bin_size_unit='SquareKilometers',
bin_type='HEXAGON',
output_name='Pasadena_CA_Hexbins_YOURINITIALS'
)
セルを実行します。
次のセルでは、hexbins 変数を呼び出してセルを実行します。 これにより、ArcGIS Online アカウントにテッセレーションの生成結果のプレビューが生成されます。最後に、hexbins を使用してトラフィックの衝突ポイントを集約します。
解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをノートブックにインポートする新しいコード ブロックが追加され、 aggregate_points() を呼び出す方法が示されます。今回は、集約するフィーチャとしてhexbins を使用します。入力ポイント レイヤーにはtraffic フィーチャーを選択します。集約に使用するポリゴンには Hexbins を選択し、境界線はポイントを含まないエリアを維持のままにしておきます。
新しい集計を保持する変数 collisions_by_hexbin を作成し、必要なパラメータを以下のように入力します。出力名の引数には、YOURINITIALS プレースホルダを自分のイニシャルに置き換えて、組織内でレイヤー名が一意になるようにします。
from arcgis import features
collisions_by_hexbin = features.summarize_data.aggregate_points(
point_layer=traffic,
output_name='collisions_by_1km_hexbin_YOURINITIALS',
polygon_layer=hexbins,
keep_boundaries_with_no_points=True
)
セルを実行します。
処理が完了したら、前のセルの下にセルを作成し、collisions_by_hexbin と入力して、セルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。ポイントを六角形のビンごとに集約したので、結果を視覚化します。
ノートブックの collisions_by_hexbin 結果の下にコード セルを作成します。
traffic_map_2 という名前の別のマップを作成し、次のように変数を呼び出します。
traffic_map_2 = gis.map('Pasadena, CA')
traffic_map_2
このコード セルは、traffic_map_2 を定義し、ノートブックにマップが描画されます。
traffic_map_2.add_layer(collisions_by_hexbin)
結果として得られるマップには、以前 ArcGIS Online で作成したマップと同様に、六角形で集約された交通事故地点が表示されています。
# 3. , 4. , 5. from arcgis import features hexbins = features.manage_data.generate_tessellation( extent_layer=block_groups, bin_size=1, bin_size_unit='SquareKilometers', bin_type='HEXAGON', output_name='Pasadena_CA_Hexbins_YOURINITIALS' ) hexbins # 6. ,7. ,8. ,9. from arcgis import features collisions_by_hexbin = features.summarize_data.aggregate_points( point_layer=traffic, output_name='collisions_by_1km_hexbin_YOURINITIALS', polygon_layer=hexbins, keep_boundaries_with_no_points=True ) collisions_by_hexbin # 12. traffic_map_2 = gis.map('Pasadena, CA') traffic_map_2 # 13. traffic_map_2.add_layer(collisions_by_hexbin)
このレッスンでは、ArcGIS Notebooks と ArcGIS API for Python を使用して、一般的な Web GIS ワークフローを Python プログラミング レッスンに変換する方法を学びました。Web マップにコンテンツを追加し、ArcGIS Online で空間分析を実行し、ArcGIS Notebooks で同じタスクを完了しました。ArcGIS Notebooks で自分のノートブックを作成しました。最終的なプロジェクトを見るには、こちらからアクセスしてください。
ArcGIS Online ヘルプ
Learn ArcGIS
Esri Canada | Education & Research
シリーズ ブログ