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 では、エラーが初回だけ表示されます。
もう一度実行すると、問題なく地図が表示されます。
![スクリーンショット 2017-12-03 7.52.47.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F53918%2F7d5a521b-ebc5-eddf-5edc-e3d0bbc03498.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=c6333a7e6f04b6cfa3a07f09b59db34e)
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
![スクリーンショット 2017-12-03 16.12.09.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F53918%2F7a75ac95-fbfa-765e-051c-7290f1187238.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=37f2bfef141d8f9b1658ab61d6eda558)
表示
![スクリーンショット 2017-12-03 16.40.10.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F53918%2Fc2af3399-de3a-e316-8fa0-1bd02c4a016f.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=99205197c6ebe2e2f4735b788ab1adab)
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
![スクリーンショット 2017-12-03 18.33.48.png](https://qiita-user-contents.imgix.net/https%3A%2F%2Fqiita-image-store.s3.amazonaws.com%2F0%2F53918%2Fa769d3a3-087f-744f-8e61-3cdbcdc24d69.png?ixlib=rb-4.0.0&auto=format&gif-q=60&q=75&s=d9d4ef6aab825a0836aabd5d64c9fe86)
まとめ
jupyter notebookの基本である、データの読み込みから、可視化まで実施してみました。
3D地図を簡単に表示出来るcesiumpyはとても魅力的に思えました。
今回のコードは、githubに公開しておりますので、参考にして下さい。