Jupyter Notebook上で3Dコロプレスマップを描写
はじめに
- 値に応じて市区町村および都道府県が浮き上がる3DコロプレスマップをNotebook上で描写してみた
- 参考資料が少なくちょっと手間取ったので備忘録としてまとめておく
- 今回使用したコードはgithubにアップロードしておく
ポイント
- cesiumpyというラッパーを使うことでNotebook上でCesimu.jsを利用
- Cesimu.jsにより下記のサイトのGeoJsonを読み込み高さを設定して描写
描写例
動かしてみた
- 今回の動作環境
- クライアント(Windows 10 Pro)
- ブラウザ : Google Chrome 68.0.3440.106
(Microsoft Edge, Firefoxでは動作しなかった)
- サーバ(Ubuntu 18 on VMware Workstation 12 Player)
- JupyterLab : 0.33.11
- python : 3.6
- cesiumpy : 0.3.3
準備
- cesiumpyのインストール
- GeoJsonのダウンロード
- (Jupyter Notebookの環境は構築済みとする)
! pip install cesiumpy
import cesiumpy
群馬県を描写(デフォルト設定)
#群馬
v = cesiumpy.Viewer()
#geojsonを読み込み座標棟を取得
res = cesiumpy.io.read_geojson('./geojson/prefectures/10.json')
#グラフの値をextrudedHeightとすることで値に応じてポリゴンを浮き出させる
myExtrudedHeight = 10e3
#エンティティーへ設定
v.entities.add(res, extrudedHeight=myExtrudedHeight)
#描写
v
- クライアント(Windows 10 Pro)
- ブラウザ : Google Chrome 68.0.3440.106
(Microsoft Edge, Firefoxでは動作しなかった)
- ブラウザ : Google Chrome 68.0.3440.106
- サーバ(Ubuntu 18 on VMware Workstation 12 Player)
- JupyterLab : 0.33.11
- python : 3.6
- cesiumpy : 0.3.3
! pip install cesiumpy
import cesiumpy
#群馬
v = cesiumpy.Viewer()
#geojsonを読み込み座標棟を取得
res = cesiumpy.io.read_geojson('./geojson/prefectures/10.json')
#グラフの値をextrudedHeightとすることで値に応じてポリゴンを浮き出させる
myExtrudedHeight = 10e3
#エンティティーへ設定
v.entities.add(res, extrudedHeight=myExtrudedHeight)
#描写
v
群馬県を描写(カスタム)
- 本家のCesium.jsと同様に各種プロパティを変更可能
- ラッパーが対応していない機能も一部あるようなので注意
#ウィジェットの有無は辞書型で渡すので注意
options = dict(\
animation=False,\
timeline=False,\
fullscreenButton=False,\
)
#グンマ
v = cesiumpy.Viewer(**options)
res = cesiumpy.io.read_geojson('./geojson/prefectures/10.json')
myExtrudedHeight = 10e3
#各種プロパティの設定
myName = '群馬県'
myDescription = 'I love Gunma'
myMaterial = cesiumpy.color.Color.fromCssColorString('pink').withAlpha(0.8)
myOutlineColor = cesiumpy.color.Color.fromCssColorString('#FF0000')
v.entities.add(\
res,\
name = myName,\
#おそらくdescriptionは非対応
description=myDescription,\
extrudedHeight = myExtrudedHeight,\
material = myMaterial,\
outline =True,\
outlineColor = myOutlineColor,\
)
v
群馬県を描写(市区町村別)
- 市区町村単位でGeoJsonを読み込めばよい
- 元データは行政区域単位で用意されており、行政区域コードがファイル名である
- 市区町村名と行政区域コードを対応付けたJsonファイルを用意しておくと管理しやすい
import json
import os
import random
#市区町村名と行政区域コードを対応付けたJsonファイルを読み込む
with open('./myList.json') as f:
ml = json.load(f)
f.close()
#行政区域コードからディレクトリを判別する関数
def setDir(code):
n = int(code)
if (n > 1000):
return code[0:2]
else:
return "mergedPrefectures"
#Entitiyを1つ追加する関数(引数:行政区域コード,値,色,輪郭色)
def setEntitiy(code,val,rgb1,rgb2):
path = './geojson/'+setDir(code)+'/'+code+'.json'
res = cesiumpy.io.read_geojson(path)
myName = ml[code]
myMaterial = cesiumpy.color.Color.fromCssColorString(rgb1)
myOutlineColor = cesiumpy.color.Color.fromCssColorString(rgb2)
v.entities.add(res,\
name=myName,\
extrudedHeight=val,\
material=myMaterial,\
outline=True,\
outlineColor=myOutlineColor)
#ディレクトリ内のgeojsonをすべて描写する関数(値も色もランダム)
def setRandomEntities(code):
list = []
path = 'geojson/'+code
for file in os.listdir(path):
base, ext = os.path.splitext(file)
if ext == '.json':
list.append(base)
list.sort()
for i in list:
val = random.randrange(10e3)
clr = '#C'+str(val).zfill(5)
setEntitiy(i,val,clr,clr)
#グンマー
v = cesiumpy.Viewer(**options)
setRandomEntities('10')
v
日本全国を描写
描写失敗
GeoJsonのサイズダウン
A) 都道府県境のみを抽出
- 都道府県のグラフであれば市区町村の区分は不要
- QGISというGISソフトウェアを利用して結合
- 手順
B) GeoJsonの簡素化
- 結合してもデータ量は大きい
- ポリゴンの点数そのものを減らすことで処理速度の向上
- mapshaperサイトというが目視して調整でき利用しやすい(QGISでも簡素化可能)
描写成功
#日本
v = cesiumpy.Viewer(**options)
for i in range(1,48):
val = random.randrange(10e4)
clr = '#E'+str(val).zfill(5)
setEntitiy(str(i).zfill(2),val,clr,clr)
v
終わりに
- GeoJsonをサイズダウンすることで3Dコロプレスマップを描写することができた
- Notebook上で動作することが最大のメリットである
- スクレイピングなどと併用するとその真価が発揮する
- 集計から整形、描写までNotebook(Python)で完結する
- スクレイピングなどと併用するとその真価が発揮する
- 集計から整形、描写までNotebook(Python)で完結する
Author And Source
この問題について(Jupyter Notebook上で3Dコロプレスマップを描写), 我々は、より多くの情報をここで見つけました https://qiita.com/Dr_Sin1/items/d8fdee795d7785e8a310著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .