はじめてのArcGIS API for Python : ArcGIS Notebooks を使用してWeb GIS を教える

227
0
a month ago

はじめてのArcGIS API for Python : ArcGIS Notebooks を使用してWeb GIS を教える

はじめに

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を日本語化したものをもとに、記事を掲載しております。

 

~ ArcGIS Notebooks を使用してWeb GIS を教える ~

概要

GIS で使用するための Python プログラミングを学習する際には、まず手動でのワークフローを見てから、Python コードを使用してどのように完了するかを確認すると便利です。このレッスンでは、ArcGIS Online でコンテンツ アイテムを見つけ、そのコンテンツを Web マップに追加し、そのコンテンツ レイヤーで空間分析を実行するというワークフローに沿って学習します。このワークフローを手動で実行した後、Python コードと ArcGIS API for Python を使ってArcGIS Notebooks を使ってワークフローを再現します。

 このレッスンを通じて、次のような方法を学びます。

  • ArcGIS Online でコンテンツ アイテムを検索する。
  • ArcGIS Notebooks でマップにレイヤを追加する。
  • ArcGIS Notebooks でジオプロセシング解析を実行する。

 Step 1: ArcGIS Online でマップを作成

最初に、ArcGIS Online でワークフローをテストします。空のマップに ArcGIS Online のデータを追加します。

  1. ArcGIS Online の組織アカウントにサインインします。

  2. リボンで マップ をクリックします。 空のマップが開きます。次に、マップにコンテンツを追加します。フォルダ、組織、ArcGIS Living Atla、および ArcGIS Online からコンテンツを追加できます。

  3. リボン上で、追加 をクリックします。

  4. ドロップダウン メニューから レイヤーの検索 を選択し、マイ コンテンツ をクリックして、ArcGIS Online を選択します。

  5. Pasadena Block Groups と入力して、Enter キーで検索します。

  6. Learn_ArcGIS が所有する一番上に表示されている結果で、追加 をクリックします。

  1. 次に、Pasadena Traffic Collisions と入力して、Enter キーで検索し、Learn_ArcGIS が所有しているTraffic Collisions で、追加 をクリックします。

  2. リボンで、詳細 をクリックし、コンテンツ タブをクリックします。

コンテンツ ウィンドウには、マップ内のすべてのレイヤーが一覧で表示されます。マップには、カリフォルニア州パサデナのブロック グループ(Pasadena Block Groups)と、交通事故(Traffic Collisions)を含む 2 つのレイヤーがあります。交通事故 レイヤーの各赤い点は、2008 年から 2018 年の間に発生した自動車が関与する交通事故を 1 件ずつ表しています。

 Step 2: ブロック グループ別の交通事故 ポイントの集約

Step1 で作成した地図データは カリフォルニア州パサデナの交通事故を示しています。現在のシンボルでは、これらの交通事故には識別可能なパターンがありません。このデータの空間的な分布を理解する1つの方法は、ブロック グループごとにデータを集約することです。ブロック グループとは、米国国勢調査局がデータ収集方法で使用している地域の一つで、集計することで各ブロック グループで発生した交通事故の数がわかります。

  1. リボンで、解析 ボタンをクリックします。

  2. 解析の実行 で、データの集約 を展開し、ポイントの集約 を選択します。

  1. ポイントの集約 ツールでは、次の操作を行います。
  • エリアに集約するポイントを含むレイヤーを選択 する場合は、Traffic Collisions を選択します。
  • 集計エリアを含むレイヤーを選択 するには、ポリゴン をクリックし、ポリゴン レイヤーを選択 で、Pasadena Block Groups を選択します。
  • 結果レイヤーの名前 には、Pasadena_Collisions_Aggregated と入力し、レイヤー名が一意となるように、あなたのイニシャルを後ろに追加します。 この場合、パラメータでグループ化するための統計情報の追加グループ化の基準にするフィールドを選択 は使用していません。これらは、選択したポリゴンレイヤー内のフィールドの統計情報を計算できるようにするオプションのパラメータです。
  1. 分析の実行 をクリックします。 分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。

  2. コンテンツ ウィンドウで、Traffic Collisions のチェック ボックスを外して表示をオフにします。

集約されたレイヤーは、等級シンボルで示されています。ブロック グループ内で発生した衝突が多いほど、そのブロックの円が大きくなります。

 Step 3: 六角形での集約

次に、同じジオプロセシング ツールを実行しますが、ブロック グループごとに集約するのではなく、1kmの六角形ごとに集約します。ブロック グループは、道路や都市の境界から水域に至るまで、多くの文化的・物理的要因に基づいて描かれています。地図を見ればわかるように、これらは同じ大きさや形ではありません。より均一な方法でデータを集計するには、六角形のビンを使用します。

  1. コンテンツ ウィンドウで、Pasadena_Collisions_Aggregated を選択して、解析の再実行をクリックします。

解析 ウィンドウには、最初に使用した ポイントの集約 ツールのパラメータ設定が表示されます。

  1. 表示されたポイントの集約 ツールで、集約エリアを含むレイヤーを選択 で、六角形 をクリックします。

  1. 六角形のビンのサイズの選択 で、1 キロメートル を選択します。

  2. 結果レイヤーの名前Pasadena_Collisions_Hex_Aggregation と入力し、レイヤー名が一意となるように、あなたのイニシャルを後ろに追加します。

  3. 分析の実行 をクリックします。

分析の実行には時間がかかる場合があります。完了すると、レイヤーが Web マップに追加されます。

  1. コンテンツ ウィンドウで、Pasadena Collisons Aggregated レイヤーのチェック ボックスを外して表示をオフにします。

六角形の集合体を見ると、高速道路 210号線と 710号線の交差点付近でほとんどの交通事故が発生していることがよくわかります。 最後に、Web マップを保存します。

  1. リボン上で、保存 をクリックし、名前を付けて保存 を選択します。

  2. マップの保存 ウィンドウで、タイトルPasadena Collisions Aggregation Map と入力します。タグ に、交通事故 と入力し、マップの保存 をクリックします。 Web マップとレイヤが ArcGIS Online の Content フォルダに保存されます。

 Step 4: ArcGIS Notebooks を使用したWeb GIS ワークフローの作成

空間データを集約して、2 つの異なるポリゴン レイヤーを使用して分布を表示しました。それでは、このワーク フローを ArcGIS API for Python を使用して ArcGIS Notebooks で再現します。最初のセクションで使用した空の Web マップと同様に、空のノートブックを作成し、分析に必要なデータを追加します。

  1. マップ タイトルの横にある ホーム をクリックし、ノートブック を選択します。

ArcGIS Notebooks でノートブックが作成されます。

  1. ArcGIS Notebooks へようこそ ウィンドウで、ArcGIS Notebook Python 3 Standard - 4.0 を選択し、開く をクリックします。

コードを実行する前に、ノートブックに名前を付けて保存します。

  1. リボン上で、保存 をクリックし、名前を付けて保存 を選択します。

  2. タイトルPasadena Collisions Aggregated Notebook と入力します。タグには、交通事故と入力し、ノートブックの保存 をクリックします。 これでノートブックの準備ができたので、マークダウン セルを作成し、分析のコンテキストを提供するヘッダーと説明をセルに追加します。マークダウン構文では、ヘッダーはシャープ記号(#)を使用します。

  3. ノートブックの下部にあるコード セル(Now you are ready to start! の下部)をクリックして、そのセルをマークダウン セルに変更します。

  1. 新しいマークダウン セルで、以下を入力または貼り付けます。

## Aggregating Data Using ArcGIS Notebooks

このノートでは、パサデナブロック群別、六角形別に点の特徴を集約していきます。

  1. Shift+Enter キーを押すか、リボンのRun ボタンをクリックしてセルを実行します。

次から GIS モジュールを呼び出し、ArcGIS Online の組織に接続します。このセルは、ノートブックを使用するたびに最初に実行する必要があります。

  1. 最初のコード セルをクリックしてアクティブにし、セルを実行します。

from arcgis.gis import GIS

gis = GIS("home")

コード セルが正常に実行されたことは、入力領域の括弧内に数字が表示され、In [1] と表示されたときにわかります。次に、パサデナの交通事故データを見つけ、ノートブックに追加します。

  1. ノートブックの最後のセルをクリックします。

  2. リボン上で、追加 をクリックします。

  3. マイ コンテンツ をクリックし、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 を使用してコンテンツ アイテムを取得するコードが、ノートブックのコード セルに追加されます。

  1. アイテム変数名を traffic に変更します。

# Item Added From Toolbar

# Title: Traffic Collisions | Type: Feature Service | Owner: Learn_ArcGIS

traffic = gis.content.get("79d3e458dcaf486f81c5591a67538179")

traffic

  1. コード セルを実行します。

コンテンツ アイテムが読み込まれ、ArcGIS Online でアイテムへのアクティブなリンクが生成されます。次に、国勢調査ブロック グループ レイヤを追加します。

  1. 同様に、Pasadena Block Groups と入力して、Enter キーで検索し、Learn_ArcGIS が所有するアイテムで、 ノートブックに追加 をクリックします。

  2. アイテム変数名を block_groups の名前を変更し、セルを実行します。

次に、マップを作成します。 注: セルを実行するたびに、新しいセルがその下に追加されます。セルを手動で追加するには、リボン上の追加 ボタンをクリックして、アクティブなセルの下にセルを挿入します。

  1. 最後のコード セルで、traffic_map という名前の変数を定義し、次のようにカリフォルニア州パサデナを中心としたWeb マップを=で設定します。

traffic_map = gis.map('Pasadena, CA')

これにより、カリフォルニア州パサデナを中心とした地図が定義されますが、変数が呼び出されるまではノートブックに地図は作成されません。

  1. 次の行で、traffic_map 変数を呼び出しセルを実行します。

このコード セルは、ノートブックでマップを描画しています。 次に、traffic とblock_groups を呼び出して、データを追加します。

  1. マップの下にコードセルを作成し、以下のようにblock_groups 変数を呼び出し、ブロック グループを追加します。

traffic_map.add_layer(block_groups)

これにより、block_groups レイヤーがマップに追加されます。

  1. また、次のようにtraffic 変数を呼び出し、交通事故のデータをマップに追加します。

traffic_map.add_layer(traffic)

セルを実行すると、ノートブックに描画されているマップは、ArcGIS Online で最初に作成したマップ(Step1での操作)と一致するようになります。

  1. リボンで 保存 をクリックし、保存 を選択します。

 参考:Step 4 コードのみを記載

# 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)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍


 Step 5: ArcGIS Notebooks を使ったブロック グループ別の交通事故 ポイントの集約

分析したいレイヤを特定してプレビューを行ったら、ArcGIS Notebooks でジオプロセシング タスクを実行に移ります。前回と同様に、ポイントの集約 ツールを使用して、国勢調査ブロックの地理情報データをまとめます。ArcGIS API for Python を使用して、パラメータを定義します。

  1. リボンで、分析 をクリックします。

  2. 解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。

ArcGIS API for Python から features モジュールをインポートし、aggregate_points() 関数を呼び出す新しいコード ブロックがノートブックに追加されます。 コードを実行する前に、関数シグネチャを確認して、 aggregate_features 関数に必要なパラメータを確認します。各パラメータは、関数が期待する通りに正確に入力する必要があり、そうしないとエラーが発生します。

  1. 関数シグネチャを呼び出すには、()?に置き換えてセルを実行します。

関数シグネチャは、 aggregate_points 関数が入力として使用するすべてのパラメータを表示します。これらの中にはオプションのものもあることに注意してください。 ここで、解析を実行するための適切な入力パラメータを関数に入力します。関数のシグネチャから、入力point_layer とpolygon_layer を定義する必要があります。また、オプションのoutput_name を設定します。さらに、この解析では、データのないブロック グループが結果レイヤーから削除されるように、keep_boundaries_with_no_points = False を設定します。

  1. 関数を collisions_by_block_group 変数に追加し、以下のように必要なパラメータを追加します。output_name 引数には、レイヤー名が組織内で一意になるように YOURINITIALS プレースホルダを自分のイニシャルに置き換えます。

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

)

  1. 関数のシグネチャを閉じて、セルをもう一度実行します。 処理の実行には数分かかる場合があります。処理中のセルでは、カッコの中にアスタリスクが入っています( Inと表示される)。今回は、collisions_by_block_group という名前の集約レイヤーを作成しています。

  2. 前のセルの下の新しいセルに、collisions_by_block_groupと入力してセルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。最初の集計を実行したので、ブロック グループ集計をマップに追加して結果を比較します。

  3. traffic_map_1 という名前の別のマップを作成し、次のように map 変数を呼び出して 2 番目のマップを描画します。

traffic_map_1 = gis.map('Pasadena, CA')
traffic_map_1
  1. 次のようにマップに collisions_by_block_group を追加します。
traffic_map_1.add_layer(collisions_by_block_group)

このマップは、以前に ArcGIS Online で作成した、ブロック グループごとに交通事故を集約したマップと同じものです。

 参考:Step 5 コードのみを記載

# 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)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍


 Step 6: ArcGIS Notebooks を使った六角形での集約

六角形のビンで集約する処理は ArcGIS Online では 1 つのステップでしたが、API を使用すると 2 つのステップが必要になります。まず、テッセレーションの生成 ツールを使用して六角形レイヤを生成します。次に、六角形のテッセレーションをフィーチャとして使用し、ポイントを集約します。

  1. リボンで分析 をクリックします。データの管理 を展開し、テッセレーションの生成 を選択します。

  1. テッセレーションの生成 の、コードスニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをインポートし、generate_tessellation() を呼び出す方法を示す新しいコード ブロックがノートブックに追加されます。前のステップで aggregate_points() で行ったように、関数のシグネチャを表示することも可能です。パラメータを入力して実行できるようにします。

  2. 結果を保持するための変数 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'

)

  1. セルを実行します。

  2. 次のセルでは、hexbins 変数を呼び出してセルを実行します。 これにより、ArcGIS Online アカウントにテッセレーションの生成結果のプレビューが生成されます。最後に、hexbins を使用してトラフィックの衝突ポイントを集約します。

  3. 解析ツール ウィンドウで、データの集約 を展開します。ポイントの集約 の、コード スニペットの追加 ボタンをクリックします。 これにより、ArcGIS API for Python から features モジュールをノートブックにインポートする新しいコード ブロックが追加され、 aggregate_points() を呼び出す方法が示されます。今回は、集約するフィーチャとしてhexbins を使用します。入力ポイント レイヤーにはtraffic フィーチャーを選択します。集約に使用するポリゴンには Hexbins を選択し、境界線はポイントを含まないエリアを維持のままにしておきます。

  4. 新しい集計を保持する変数 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

)

  1. セルを実行します。

  2. 処理が完了したら、前のセルの下にセルを作成し、collisions_by_hexbin と入力して、セルを実行します。 これにより、ArcGIS Online アカウントに解析結果のプレビューが生成されます。ポイントを六角形のビンごとに集約したので、結果を視覚化します。

  3. ノートブックの collisions_by_hexbin 結果の下にコード セルを作成します。

  4. traffic_map_2 という名前の別のマップを作成し、次のように変数を呼び出します。

traffic_map_2 = gis.map('Pasadena, CA')

traffic_map_2

このコード セルは、traffic_map_2 を定義し、ノートブックにマップが描画されます。

  1. 次のように collisions_by_hexbin をマップに追加します。

traffic_map_2.add_layer(collisions_by_hexbin)

結果として得られるマップには、以前 ArcGIS Online で作成したマップと同様に、六角形で集約された交通事故地点が表示されています。

  1. リボンで保存 をクリックし、保存 を選択します。 ノートブックが保存されました。ArcGIS Online でこの項目に戻ってコードを再実行したり、ノートブックを修正したり、解析を拡張したりすることができます。

 参考:Step 6 コードのみを記載

# 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

シリーズ ブログ

Version history
Revision #:
3 of 3
Last update:
2 weeks ago
Updated by: