「さわって覚える ArcGIS API for Python」シリーズブログは、 ArcGIS API for Python のガイドやサンプル、API リファレンスなどのリソースを最大限ご活用いただく第一歩として、ガイドの中で紹介されている主要なモジュールを中心に、実際にさわって覚えていただくようなノートブックと共に、全 5 回のシリーズとして紹介していく予定です。
前回のネットワーク解析編(前編)の記事では、ネットワーク解析のコンセプトを解説と、ルート検索での、
・必要なデータの準備
・arcgis.network.analysis.find_routes を使ったルート検索
・arcgis.features.use_proximity.plan_routes を使ったルート検索
の主要なコードと解説を行いました。
今回は、「パート3:到達圏の作成」のノートブックをもとに、主要な処理を解説していきます。
紹介している翻訳済みのノートブックは、GitHub にも公開しますので、ご参照ください。
ArcGIS API for Python の環境構築がまだお済みでない方は、開発リソース集のインストールガイドにインストール方法を掲載しておりますので、ご参照ください。
本記事では以下の内容でネットワーク解析についてご紹介します。
【ネットワーク解析編(後編)】
・到達圏の作成
今回の「到達圏の作成」のノートブックでは、カリフォルニア州サンバーナーディーノ郡の病院施設からの到達圏の作成がテーマです。
コードとしては大きく、次に分かれています。
・データ(入力に使用するデータセットの準備)
・arcgis.network.analysis.generate_service_areas による到達圏の作成
・arcgis.features.use_proximity.create_drive_time_areas による到達圏の作成
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.solve、generate_service_areas、create_drive_time_areas の3つのメソッドを提供しています。
解析の種類 network.analysis features.use_proximity
Route (ルート検索) | find_routes | plan_routes |
Service Area (到達圏) | generate_service_areas | create_drive_time_areas |
Closest Facility (最寄りの検索) | find_closest_facilities | find_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 で定義された病院に対して到達圏を作成し、それらのプロセスの違いを詳細に説明しています。
generate_service_areas ツールは、 facilites で定義された施設(病院)周辺のネットワーク到達圏を作成します。ネットワーク到達圏は、1 つもしくは複数の施設から、任意の距離や移動時間内でアクセス可能な全ての道路を包含する領域です。
例えば、ある施設から 10 分の到達圏は、その施設から 10 分以内で行くことができる全ての道路を含んでいます。到達圏はアクセスのしやすさを可視化したり、計測するためによく使われます。また、食料品店から運転時間 3 分以内を表すポリゴンは、どの住民が 3 分以内で店舗にたどり着けるかを明確にし、その店で買い物をする可能性が高いかどうかの判断材料にすることができます。
以降の例で用いられるパラメーターは次のものを含みます。
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 に格納された結果の確認、テーブルや地図での可視化、さらにより高度な時間帯ごとの到達圏の作成と可視化については、ノートブックをご参照ください。
create_drive_time_areas メソッドは任意の運転時間や距離内で到達できるエリアを作成します。このツールは以下のような質問に答えるのに役立ちます。
以降の例で用いられるパラメーターは次のものを含みます。
ノートブックでの実行部分のコードは、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 を実行する場合、
の2つ記載しているように、結果のハンドリングの仕方も異なってきます。詳細なハンドリングの方法や解説はノートブックをご参照ください。
今回は「ネットワーク解析編(後編)」として、到達圏の作成に必要なデータセットの準備と、arcgis.network.analysis.generate_service_areas と arcgis.features.use_proximity.create_drive_time_areas を到達圏作成のツールとして利用するまでの主要なコードと解説を取り上げて紹介しました。
パート3のノートブックでは、この記事で取り上げた内容に加え、到達圏作成の必要性や、到達圏を計算するときに必要となる「近さ」の基本的な考え方についても紹介しています。また、解析結果のテーブル形式や地図での可視化の方法や、より高度な時間帯別の到達圏解析などについても触れていますので、より詳しく確認したい方は、ノートブックをご参照ください。
次回は「マッピング、可視化編」として、マップ ウィジェットの使用方法や、可視化手法としてスマートマッピングについて紹介する予定です。