cesiumpy の紹介
cesiumpyとは、Jupyter Notebook上でCesiumを表示・制御を実現するライブラリです。sinhrks 様が作成し,HatenaBlogに詳細な説明が御座います。
- 紹介Blog Cesium.js を Python から使うパッケージを作った
- githubリポジトリ sinhrks/cesiumpy
- 英語ドキュメント Welcome to cesiumpy’s documentation!
Jupyter Notebook上で地図表示を行うライブラリは、LeafletをベースとしたFoliumがあります。手軽に地図上にデータを手軽に表示したい場合には非常に便利です。
Jupyter Notebookについて
Webブラウザ上にプログラムコードと実行結果の表示が可能で、データサイエンスに関わる人に広く使われています。有名なものなので、説明と環境構築手順は割愛させていただきます。
cesiumpyの導入
1.インストール
python のライブラリ管理ツールである、pipコマンドで簡単にインストール可能です。
$ pip install cesiumpy
2. Jupyter NotebookでCesiumの表示
コマンドライン上で、Jupyter Notebookを起動します。
$ jupyter notebook
Webブラウザ上に、Jupyter Notebookが表示されたら、新しいNotebookを作成します。
地図の表示
ライブラリのインポートしビューワの表示コマンド cesiumpy.Viewer()
を実行します。
私のPython 2.7.10 では、エラーが初回だけ表示されます。
もう一度実行すると、問題なく地図が表示されます。
CSVデータからバブルチャートの作成
CSVデータを読み込み、地図上に位置情報と値を半径で表示してみます。
今回は、埼玉県のオープンデータサイトから、埼玉県朝霞市の「【朝霞市】保育園・幼稚園情報」を用いて、地図上に施設位置と、収容人数を表現します。
下準備
このデータは、文字コードがShift-JISなのですが、pythonの文字コード変換でエラーが出たため、予めUTF-8に変換します。
CSVファイルのダウンロード
$ wget https://opendata.pref.saitama.lg.jp/data/dataset/69f4f927-221c-45f9-a4c1-cab5e073abce/resource/e2d31889-b457-48aa-8c16-8c4befb29aa4/download/07hoikuennyoutien-asakashi.csv
文字コードの変換
$ nkf -Sw 07hoikuennyoutien-asakashi.csv > 07hoikuennyoutien-asakashi_utf-8.csv
CSVデータの読み込み
データ解析を支援する機能を提供するライブラリであるpandasと、データを簡単に取り扱うためのライブラリである、numpyというライブラリを利用します。
pandasのpd.read_csv("ファイルパス")
関数でCSVファイルを、読み込みデータフレーム形式として、保存します。デフォルトでは、1行目がヘッダ行として列名として利用されます。下記のサイトが参考になります。
Pandas で CSV ファイルやテキストファイルを読み込む
import pandas as pd
import numpy as np
filename = '07hoikuennyoutien-asakashi_utf8.csv'
df = pd.read_csv( filename )
データの登録と地図表示
最初の行でcesiumpyを初期化した後に、for i, row in df.iterrows():
で、CSVから取り込んだデータの行数だけ繰り返し処理を実施します。
row['カラム名']
で該当行のカラムの値をアクセスしています。
v = cesiumpy.Viewer()
for i, row in df.iterrows():
l = row['施設_収容人数[総定員]人数']
p = cesiumpy.Point(position=[row['施設_経度'], row['施設_緯度'], 0]
, pixelSize=l/10, color='blue')
v.entities.add(p)
v
表示
3D棒グラフの描画
円柱(Cylinder)オブジェクトを追加し、3次元棒グラフを作成します。
データは、先程読み込んだデータを用います。
v = cesiumpy.Viewer()
for i, row in df.iterrows():
l = row['施設_収容人数[総定員]人数']
cyl = cesiumpy.Cylinder(position=[row['施設_経度'], row['施設_緯度'] ],
length=l*10,topRadius=50, bottomRadius=50, material='aqua')
v.entities.add(cyl)
v
まとめ
jupyter notebookの基本である、データの読み込みから、可視化まで実施してみました。
3D地図を簡単に表示出来るcesiumpyはとても魅力的に思えました。
今回のコードは、githubに公開しておりますので、参考にして下さい。