さわって覚える ArcGIS API for Python : ネットワーク解析編 (後編)

1791
0
07-01-2020 07:46 PM

さわって覚える ArcGIS API for Python : ネットワーク解析編 (後編)

はじめに

「さわって覚える ArcGIS API for Python」シリーズブログは、 ArcGIS API for Python ガイドサンプルAPI リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心に、実際にさわって覚えていただくようなノートブックと共に、全 5 回のシリーズとして紹介していく予定です。

 

  1. 基本編 (GIS モジュール編)
  2. フィーチャ データ編
  3. 場所検索、ジオコーディング編
  4. ネットワーク解析編(前編)/  ネットワーク解析編(後編)
  5. マッピング、可視化編
  6. ラスター編

 

前回のネットワーク解析編(前編)の記事では、ネットワーク解析のコンセプトを解説と、ルート検索での、

・必要なデータの準備

arcgis.network.analysis.find_routes を使ったルート検索

arcgis.features.use_proximity.plan_routes を使ったルート検索

の主要なコードと解説を行いました。

今回は、「パート3:到達圏の作成」のノートブックをもとに、主要な処理を解説していきます。

紹介している翻訳済みのノートブックは、GitHub にも公開しますので、ご参照ください。

 

ArcGIS API for Python の環境構築がまだお済みでない方は、開発リソース集のインストールガイドにインストール方法を掲載しておりますので、ご参照ください。

本記事では以下の内容でネットワーク解析についてご紹介します。

【ネットワーク解析編(後編)】

   ・到達圏の作成

 

1. 到達圏の作成

今回の「到達圏の作成」のノートブックでは、カリフォルニア州サンバーナーディーノ郡の病院施設からの到達圏の作成がテーマです。

コードとしては大きく、次に分かれています。

・データ(入力に使用するデータセットの準備)

arcgis.network.analysis.generate_service_areas による到達圏の作成

arcgis.features.use_proximity.create_drive_time_areas による到達圏の作成

 

1.1 データ(入力に使用するデータセットの準備)

generate_service_areas ツールは、施設 フィーチャ セットを入力パラメーターとして指定する必要があります。元のノートブックでは、Living Atlas を参照する方法と、カリフォルニア州サンバーナーディーノ郡の病院のCSV を自組織内で公開する方法のコードが含まれています。それぞれの詳細な実行ステップと解説はノートブックを参照いただくこととし、本記事では後者の方法でのフィーチャ セット(FeatureSet)を準備するコードを抜粋して示しています。

 

[ データセットの準備のコード ]

from arcgis.gis import GIS
import arcgis.network as network
from arcgis.features import FeatureLayer, Feature, FeatureSet, use_proximity
import pandas as pd
import datetime as dt
import time

my_gis = GIS(profile="your_online_profile")

# 施設レイヤーの定義
# print("Trying to publish from csv...")
import requests
import csv
import os


# サンバーナーディーノ郡の病院のCSVを取得し自組織で公開
out_file_name = 'hospitals_SB_county.csv'
url = "https://data.chhs.ca.gov/datastore/dump/641c5557-7d65-4379-8fea-6b7dedbda40b?q=&sort=_id+asc&fields=OSHPD_ID%2CFACILITY_NAME%2CLICENSE_NUM%2CFACILITY_LEVEL_DESC%2CDBA_ADDRESS1%2CDBA_CITY%2CDBA_ZIP_CODE%2CCOUNTY_CODE%2CCOUNTY_NAME%2CER_SERVICE_LEVEL_DESC%2CTOTAL_NUMBER_BEDS%2CFACILITY_STATUS_DESC%2CFACILITY_STATUS_DATE%2CLICENSE_TYPE_DESC%2CLICENSE_CATEGORY_DESC%2CLATITUDE%2CLONGITUDE&filters=%7B%22COUNTY_CODE%22%3A+%5B%2236%22%5D%7D&format=csv"
download = requests.get(url)

with open(out_file_name, 'w') as out_file:
    out_file.writelines(download.text)
    print(out_file_name)
csv_item = my_gis.content.add({}, out_file_name)
hospital_item = csv_item.publish()

# クエリで抽出するためにFeatureLayer クラスのオブジェクトを作成
hospital_fl = FeatureLayer(hospital_item.url + "/0")

# クエリで抽出(オリジナルのノートブックの except ブロック)
facilities = hospital_fl.query(where="Dba_city='REDLANDS' or Dba_city='LOMA LINDA'", as_df=False)
‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

 

前編の記事と同様、ここからが、「到達圏の作成」のノートブックで最も理解していただきたい  ポイントなので、本記事でも取り上げます。

ArcGIS API for Python は到達圏の作成の方法として、ServiceAreaLayer.solvegenerate_service_areascreate_drive_time_areas の3つのメソッドを提供しています。

 

解析の種類 network.analysis features.use_proximity

Route (ルート検索)find_routesplan_routes
Service Area (到達圏)generate_service_areascreate_drive_time_areas
Closest Facility (最寄りの検索)find_closest_facilitiesfind_nearest

 

これら 3 つのメソッドは異なるモジュールで定義されており、裏側では異なる REST API を呼び出しています。 

ServiceAreaLayer.solve と generate_service_areas は, 独自もしくは高度なネットワーク解析のワークフローを想定しており、独自のネットワーク解析レイヤーを公開する必要があります。create_drive_time_areas は、ArcGIS Online 上でホストされているルート検索 サービスに対して動作します。プロキシ サービスを介して ArcGIS Enterprise 上で利用することもできます。利用にはクレジット消費が必要となります。

今回は、同一の問題をnetwork.analysis.generate_service_areas() と features.use_proximity.create_drive_time_areas() で解析し、それらのワークフローについて facilites で定義された病院に対して到達圏を作成し、それらのプロセスの違いを詳細に説明しています。

 

1.2 arcgis.network.analysis.generate_service_areas による到達圏の作成

generate_service_areas ツールは、 facilites で定義された施設(病院)周辺のネットワーク到達圏を作成します。ネットワーク到達圏は、1 つもしくは複数の施設から、任意の距離や移動時間内でアクセス可能な全ての道路を包含する領域です。

例えば、ある施設から 10 分の到達圏は、その施設から 10 分以内で行くことができる全ての道路を含んでいます。到達圏はアクセスのしやすさを可視化したり、計測するためによく使われます。また、食料品店から運転時間 3 分以内を表すポリゴンは、どの住民が 3 分以内で店舗にたどり着けるかを明確にし、その店で買い物をする可能性が高いかどうかの判断材料にすることができます。

以降の例で用いられるパラメーターは次のものを含みます。

  • facilities: 施設 (FeatureSet)。必須パラメーター。周辺に到達圏が作成される施設。
  • break_values: ブレーク値 (string 型)。必須パラメーター。施設ごとに作成される到達圏ポリゴンのサイズと数を指定します。
  • break_units: ブレークの単位 (string 型)。必須パラメーター。ブレーク値パラメーターの単位。
  • time_of_day: 時刻 (datetime 型)。任意パラメーター。施設の出発時間、または到着時間。

generate_service_areas メソッドの詳細は API リファレンスをご参照ください。

 

[ generate_service_areas 実行部分のコード]

# ブレーク値を設定
list_of_breaks = [5,10,15]
if isinstance(list_of_breaks, list):
    string_of_breaks = ' '.join(map(str, list_of_breaks))
    # print(string_of_breaks)

# 5,10,15分の到達圏の作成
current_time = dt.datetime.now() 
result1 = network.analysis.generate_service_areas(facilities=facilities, break_values=string_of_breaks, 
                                                  break_units="Minutes", time_of_day=current_time)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

result1 に格納された結果の確認、テーブルや地図での可視化、さらにより高度な時間帯ごとの到達圏の作成と可視化については、ノートブックをご参照ください。

 

1.3 arcgis.features.use_proximity.create_drive_time_areas による到達圏の作成

create_drive_time_areas メソッドは任意の運転時間や距離内で到達できるエリアを作成します。このツールは以下のような質問に答えるのに役立ちます。

  • ここから 車で5 分でどこまで行けるか?
  • 自分の店から車で 3 マイル以内の範囲はどのエリアか?
  • うちの消防署から 4 分以内の地域は?

以降の例で用いられるパラメーターは次のものを含みます。

  • input_layer: 必須パラメーター。ポイント フィーチャ レイヤーを指定。このポイントの周囲に移動のモードに基づいた移動範囲が描画されます
  • break_values: 任意パラメーター (float 型を格納したリスト)。作成するポリゴンのサイズを規定します。break_values の単位は break_units パラメーターで指定します。
  • time_of_day: 任意パラメーター。datetime 型を指定。移動時間が交通の状況を考慮するかどうかを規定します。
  • context: 任意パラメーター (dict 型)。このパラメーターは、タスクの実行に影響する追加の設定を含みます。create_drive_time_areasには、次の extent (エクステント) と outSR (出力データの空間参照) の設定があります。
  • output_name: 任意パラメーター (str 型)。出力するフィーチャ サービスの名前。指定されなかった場合、フィーチャ コレクションが返却されます。

ノートブックでの実行部分のコードは、ouput_name の指定の有無により、次の通り異なります。

 

[ create_drive_time_areas 実行部分のコード]

output_name を入力パラメーターに指定する場合、create_drive_time_areas からの戻り値はFeature Layer のコレクションになります。

# output_name を指定する場合
"""ダウンロードした CSV から公開されたフィーチャ レイヤー コレクションを参照している場合
"""
hospital_layer = {'url': hospital_fl.url, 
                  'filter': "Dba_city='REDLANDS' or Dba_city='Loma Linda'"}

result2 = use_proximity.create_drive_time_areas(input_layer=hospital_layer, break_values=list_of_breaks, 
                                                time_of_day = current_time,
                                                context={'outSR': {"wkid": 4326}},
                                                output_name="Create Service Area from Hospitals in SB County 2")‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

result2 に格納された結果の確認や、テーブルや地図での可視化等については、ノートブックをご参照ください。

 

output_name を指定しない場合、 create_drive_time_areas からの戻り値はFeatureCollection オブジェクトになり、オンデマンドでの情報を取得するために詳細なパースが必要になります。

# output_name を指定しない場合
result2b = use_proximity.create_drive_time_areas(input_layer=hospital_layer, break_values=list_of_breaks, 
                                                time_of_day = current_time,
                                                context={'outSR': {"wkid": 4326}})‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

result2b に格納された結果の確認や、テーブルや地図での可視化等については、ノートブックをご参照ください。

また、arcgis.features.use_proximity.create_drive_time_areas を実行する場合、

  • output_name を指定する場合:解析結果を直接フィーチャ サービスとして出力することが可能です。
  • output_name を指定しない場合:解析結果が FeatureCollection で返却されるため、結果の可視化にはパース / 描画というアプローチを取る必要があります。

の2つ記載しているように、結果のハンドリングの仕方も異なってきます。詳細なハンドリングの方法や解説はノートブックをご参照ください。

 

おわりに

今回は「ネットワーク解析編(後編)」として、到達圏の作成に必要なデータセットの準備と、arcgis.network.analysis.generate_service_areasarcgis.features.use_proximity.create_drive_time_areas を到達圏作成のツールとして利用するまでの主要なコードと解説を取り上げて紹介しました。

パート3のノートブックでは、この記事で取り上げた内容に加え、到達圏作成の必要性や、到達圏を計算するときに必要となる「近さ」の基本的な考え方についても紹介しています。また、解析結果のテーブル形式や地図での可視化の方法や、より高度な時間帯別の到達圏解析などについても触れていますので、より詳しく確認したい方は、ノートブックをご参照ください。

次回は「マッピング、可視化編」として、マップ ウィジェットの使用方法や、可視化手法としてスマートマッピングについて紹介する予定です。

 

関連リンク

 

Version history
Last update:
‎11-12-2020 11:16 PM
Updated by: