GISコミュニティフォーラム開催報告:ArcGISでデータサイエンスしよう ~GIS 解析とそのプロセスの新しい共有方法~

Document created by wakana_satoesrij-esridist Employee on Jul 5, 2019Last modified by masanobu_hiranoesrij-esridist on Jul 5, 2019
Version 4Show Document
  • View in full screen mode

はじめに

 

2019 5 22 () 24 ()、東京ミッドタウン 六本木にて第 15 回 GIS コミュニティフォーラム及びプレフォーラム・セミナーが開催されました!

公開可能なセッションの発表資料はESRIジャパンのサポート サイトで公開しております。また、GeoNet ブログでは開発者向けのセッションで使用したコードなどをご紹介していきます。発表資料や GeoNet 記事、GitHub へのリンクなどの詳細は第15回GISコミュニティフォーラム開催報告記事をご覧ください。

 

この記事では「ArcGIS でデータサイエンスしよう~GIS 解析とそのプロセスの新しい共有方法~」のセッションでご紹介した ArcGIS の新しい製品である ArcGIS Notebook Server と、Notebook Server 上でコーディングした ArcPy ArcGIS API for Python のデモを解説します。

 

注意!
ArcGIS Notebook Server
は現在、国内サポート対象外製品となっています。ただいまサポート検討中です。ご了承ください。

 

ArcGIS Notebook Server とは

 

ArcGIS Notebook Server ArcGIS Enterprise のオプショナルサーバー製品で、GIS を扱ったデータサイエンスを可能にする“基盤“をご提供する製品です。

ArcGIS の各“Python”ライブラリの実行環境としてサポートしている“Jupyter Notebook”を、ArcGIS Enterprise のポータル上で操作することを可能にします。

 

※ Web GIS は、ArcGIS Online(クラウド GIS)ArcGIS Enterprise(オンプレミス)といった ArcGIS 製品で実現できる、「組織内でオンライン マップ(Web マップ)を共有し、さまざまな部門や業務で横断的に活用できる技術」です。詳細は「GIS 基礎解説」を参照してください。

※ ArcGIS Enterprise のオプショナルサーバーは、より高度な GIS 機能をサーバーベースで利用したい場合に導入していただく製品です。

 

ArcGIS Notebook Server では次のことが可能です。

 

Python 実行環境の共有

Web 上で Python コードを実行できる環境を提供する

 

ArcGIS Enterprise のポータル上で解析処理を実行する

ArcGIS で公開しているデータに簡単にアクセスして、配信している背景地図を利用したり、GIS 解析サービスを実行したりできる

・汎用的に使用する Python のライブラリがあらかじめインストールされており、話題の機械学習や深層学習などに必要なライブラリ・パッケージも利用することができる

ArcPy および ArcGIS API for Python が利用できる(ただし、ArcPyの実行には、有償ライセンスが必要となります)

 

結果の共有

Python のコードなど実行結果を保存できる“ノートブック”という形式で Python のコードや解析結果を保存・共有できる

 

ArcGIS Notebook Server は、デスクトップ製品で馴染み深い“ArcPy”も利用する環境をご提供できるため、例えば ArcGIS デスクトップ製品をインストールしていないユーザーでも、Web 上で ArcPy を利用した高度な GIS 解析を実行することができます。

 

セッションでは、ArcGIS における“共有”をテーマに解説しました。

資料はEsriジャパンのサポートサイト(要ログイン)にございますので、是非ご覧ください。

 

ArcPy ArcGIS API for Python を使って浸水域に位置する避難所を抽出する

 

ここからは、セッションでご紹介したデモについて解説します。

 

ArcGIS Notebook Server では、デスクトップ製品で高度な GIS 解析を提供する ArcPy と、Web GIS を操作できる ArcGIS API for Python(以下、Python API)を活用することが可能です。

セッションでは、その両方と、ArcGIS 以外の汎用 Python ライブラリを使用して「浸水域に位置する避難所を抽出」し、グラフにしてみました。手法とコードを解説します。

 

 

概要

基盤地図情報(国土地理院)で提供されるデータを用いて、避難所ポイントに標高データを付与し、標高別のポイントの割合を求めます。

 

使用データ

 ・数値標高モデルデータ(基盤地図情報(国土地理院)よりダウロード

 ・千葉県千葉市の避難所のデータESRIジャパンオープンデータポータルより)

 

結果

 数値標高モデルから作成したラスターと重なる避難所ポイントを標高別に分けてグラフ化しました。

 

解析方法とコード解説

以下の内容で最終的に標高値毎にグラフで表現できるように複数の GIS 解析を行います。

実際にグラフにするところは Pandasデータの参照や操作について汎用的に用いられるライブラリ)を使用します。

 

  1. ArcGIS オープンデータポータルにある千葉県千葉市の避難所のデータの呼び出し(Python API)
  2. 数値標高モデルデータをラスターにする(ArcPy)
  3. 避難所ポイントのデータに標高データを付与する(ArcPy)
  4. サービスの作成と地図への出力(Python API)
  5. 解析結果をグラフおよび標高値によるクラス分けをしてグラフで表現する(Pandas)

 

下準備

今回はシェープファイルからラスターを作成したいので、数値標高モデル(GML)は、同じく基盤地図情報ダウンロードサービスより提供される「基盤地図情報ビューア」を使用してシェープファイル形式に変換します。

 

解析開始

1.千葉県千葉市の避難所のデータの呼び出し(Python API)

ArcGIS Online 上でホストされている避難所データを Python API で 呼び出します

キーとなるのはアイテム ID と呼ばれる、Web 上の ArcGIS にあるアイテムを一意に識別するためのランダムな文字列です。ArcGIS Notebook Server で使用する ArcGIS ノートブックでは、これを UI から選択して入力することができます。

※ ArcGIS Enterprise の ポータルで ArcGIS Online のデータを参照する設定を行うことにより可能となります。

 

# Item Added From Toolbar
# Title: 千葉市 避難場所・避難所・広域避難場所・津波避難ビル | Type: Feature Service | Owner: ESRIJ_OpenData
agol_gis = GIS(set_active=False)
chiba_esc_item = agol_gis.content.get("60ef62a433ee4be0b21324c86793e5a8")
chiba_esc_item

 

2.数値標高モデルデータをラスターにする(ArcPy)

ここでは、ArcPy ポイント → ラスター (Point to Raster) ツールを実行します。シェープファイルをラスターのデータソースとして設定します。

valField’は、出力ラスターに値を割り当てるために使用するフィールドです。

 

# arcpyの作業ディレクトリを設定する
env.workspace = myworkspace

# 実行のためのパラメータを設定する
inFeatures ="\\chibademshp\\chibadem.shp"
valField = "dem"
outRaster = myworkspace + "\\chibademp2r"
assignmentType = "MAXIMUM"
priorityField = "dem"

# ポイント->ラスターツール実行
p2r_result = arcpy.PointToRaster_conversion(inFeatures, valField, outRaster,assignmentType, priorityField, 0.00037)

 

3.避難所ポイントのデータに標高データを付与する(ArcPy)

Python API で取得したポイントの内容を ArcPy で使用できる形に変換して、ポイントデータに標高値を付与します。

抽出値 → ポイント (Extract Values to Points)ツールを実行します。

 

# フィーチャサービスから、標高値を付加するポイントデータを呼び出しする
baseURL= chiba_esc_item.layers[0].url + '/query'
where = '1=1'
query = "?where={}&returnGeometry=true&outFields=*&f=json".format(where)
fsURL = baseURL + query
pointfs = arcpy.FeatureSet()
pointfs.load(fsURL)

 

#抽出値 → ポイント (Extract Values to Points)ツールを実行します。
#引数の設定
inPointFeatures = pointfs #避難所のポイントデータ
inRaster = "chibademp2r" #シェープファイルから作成したラスターデータ
outPointFeatures =str(add_dem2esc_gdb) + '/add_esc2dem_point' # 解析結果出力先のファイルジオデータベース
# 実行
exreslit = ExtractValuesToPoints(pointfs, inRaster, outPointFeatures)

 

4.サービスの作成と地図への出力(Python API)

これでポイントデータに標高値が付与できましたので、共有できるデータにするためにホスト フィーチャ サービスとして公開します。先ほど解析結果として出力したファイル ジオデータベースを、zip 形式にしてサーバーへアップロードすることで、サービスとして内容を公開することができます。

# ファイルジオデータベースをzipにする
compFile = zipfile.ZipFile('./add_esc2dem_point.zip', 'w', zipfile.ZIP_STORED)

files = glob.glob('./add_esc2dem.gdb/*')
for file in files:
    compFile.write(file)
   
compFile.close()

# ファイルジオデータベースの内容をホストフィーチャサービスとして公開する
add_dem2esc_point_item = gis.content.add({ 'type': 'File Geodatabase'},data=compFile.filename)
add_escapedem_Service = add_dem2esc_point_item.publish()

 

5.解析結果をグラフおよび標高値によるクラス分けをしてグラフで表現する

公開したフィーチャサービスの属性情報の内容を読み込んでグラフを作成します。Python API は属性情報に対する検索結果を DataFlame としてシームレスに扱えるようになっています。

 

#属性情報をクエリで取得する
analysiseddata = add_escapedem_Service.layers[0].query(as_df=True)

#取得した属性情報のうち、標高値が定義されているもののみを取り出す
rastervalu = analysiseddata[analysiseddata['rastervalu'] > 1]
rastervalu['rastervalu']

# 標高別のクラス分けを適用する
cutedpd = pd.cut(rastervalu['rastervalu'], bins=[0,1,5,10,15,20,50]).value_counts()
cutedpd.index = ["1m=<5m","20m=<50m","15m=<20m","5m=<10m","10m=<15m","<1m"]
#円グラフを描画するための設定
data=cutedpd.values #描画するデータの指定
label=cutedpd.index #凡例の作成

#各種パラメータ
plt.style.use('ggplot')
plt.rcParams.update({'font.size':15})
size=(9,5)
col=cm.cool(np.arange(len(data))/float(len(data)))

#円グラフを描画する
plt.figure(figsize=size,dpi=100)
plt.pie(data,colors=col,counterclock=False,startangle=90,autopct=lambda p:'{:.1f}%'.format(p) if p>=5 else '')
plt.subplots_adjust(left=0,right=0.7)
plt.legend(label,fancybox=True,loc='center left',bbox_to_anchor=(0.9,0.5))
plt.axis('equal')
plt.title('rastervalu')

 

全体のコードは ESRIジャパン GitHub をご覧ください。

 

おわりに

ArcGIS Notebook Server は、この記事でご紹介したような解析プロセスも、まるごとメンバーと共有することができます。結果だけでなくプロセスも共有できるというのは、解析の再現や知見の共有という点において大きな魅力のひとつです。

何か少しコーディングしてみたい!といった場面でも、開発環境のセットアップで躓いたことがある方もいらっしゃるのではないでしょうか。ArcGIS Notebook Server は、GIS データに触れることや少しだけコーディングしてみたいといったことの敷居を低くしてくれました。

高度な GIS 解析をあなたのデータサイエンスに取り入れる準備をして期待していてください! 

 

関連リンク集

ArcGIS 関連ページ

ArcGIS API for Python(ESRIジャパン製品ページ)

ArcGIS for Developers(ESRIジャパン製品ページ)

ArcGIS Online(ESRIジャパン製品ページ)

ArcGIS for Developers 開発リソース集

ESRIジャパン オープンデータポータル

ArcGIS API for Python(米国Esri ページ(英語))

シリーズブログ 関連ページ

ArcGIS API for Python を使ってみよう:できることや使いどころ

ArcGIS API for Python を使ってみよう ①:Jupyter Notebook で使うための環境構築

ArcGIS API for Python を使ってみよう:ArcGIS Pro からの環境構築 (ArcGIS Pro 2.1)

ArcGIS API for Python を使ってみよう ローカル端末から ArcGIS Online へデータを作成してみよう

ArcGIS API for Python を使ってみよう :ArcGIS Online のアイテムを検索してみよう

ArcGIS API for Python を使ってみよう :ArcGIS Online 上のアイテムを削除してみよう

ArcGIS API for Python を使ってみよう ⑤:Web マップを作成してみよう

ArcGIS API for Python を使ってみよう ⑥:解析ツールを使ってみよう

ArcGIS API for Python を使ってみよう ⑦:ユーザーやアイテムの管理作業を一括で処理してみよう

ArcGIS 開発リソース集

ArcGIS for API for Pythonコンセプト

インストールガイド

ArcGIS for API for Pythonための基礎環境:conda入門

Attachments

    Outcomes