pydeckで2011年東北地方太平洋沖地震の津波高を可視化してみた
はじめに
pydeckは、地理空間情報の可視化に強みをもつdeck.glのPythonバインディングライブラリです。この記事では、Google Colab上でpydeckを使用することで、津波の高さ分布をインタラクティブに確認できるか試してみました。
出典:東北地方太平洋沖地震津波合同調査グループデータ, 2024/05/10参照
動作環境
- Google Colaboratory
- Python 3.10.12
- cmcrameri 1.9
- pandas 2.0.3
- pydeck 0.9.0
- numpy 1.25.2
データの特徴
東北地方太平洋沖地震津波の痕跡高データセット[1]を使用します。今回は、遡上高や浸水高などの区別や信頼度でのフィルタリングはせず、すべてのデータを描画するため、おおまかな傾向しか捉えられていないことに留意してください。
データの取り込み
pandasライブラリを使ってデータを取り込みます。
import pandas as pd
DATA_URL = "https://www.coastal.jp/ttjt/index.php?plugin=attach&refer=%E7%8F%BE%E5%9C%B0%E8%AA%BF%E6%9F%BB%E7%B5%90%E6%9E%9C&openfile=ttjt_survey_29-Dec-2012_tidecorrected_web.csv"
df = pd.read_csv(DATA_URL, encoding="cp932", header=1) # 2行目がヘッダー
前処理
型の変換、欠損値の削除、カラム名の変更を行います。まとめて処理するように書いていますが、実際はinfo()
メソッドなどでデータを確認して試行錯誤しながら加工しました。こういう場合に対話的な環境は便利ですね。
df_clean = (
df.assign(
**{
"lon [deg]": pd.to_numeric(df["lon [deg]"], errors="coerce"),
"lat [deg]": pd.to_numeric(df["lat [deg]"], errors="coerce"),
"height from TP[m]": pd.to_numeric(df["height from TP[m]"], errors="coerce")
}
)
.dropna(subset=["lon [deg]", "lat [deg]", "height from TP[m]"])
.rename(columns={
"lon [deg]": "lon",
"lat [deg]": "lat",
"height from TP[m]": "height"
})
)
カラーマップの作成
津波の高さごとに色を変えたいので、Scientific colour maps[2]を使用してカラーマップを作成します。
!pip install cmcrameri
from cmcrameri import cm
import numpy as np
colors = cm.hawaii_r(np.linspace(0, 1, 256))
rgb_colors = (colors[:, :3] * 255).astype(int).tolist()
min_height = df_clean["height"].min()
max_height = df_clean["height"].max()
df_clean["color"] = df_clean["height"].apply(
lambda h: rgb_colors[int(255 * ((h - min_height) / (max_height - min_height)))]
)
hawaii_r
は今回使用するカラーマップの名称で、このような色合いです。
データの描画
pydeckのサンプルページを参考に、ColumnLayerを作成して描画します。パラメータが色々あるので、試行錯誤しながら値を決めていきました。
つまづいた点として、Google Colab上ではエラーが出ていないのにデータが正しく描画されないことが何回かありました。内部的に使用されているdeck.glでの処理に失敗していることがあるので、デベロッパーツールでエラーメッセージを確認すると良さそうです。
!pip install pydeck
import pydeck as pdk
# レイヤー
layer = pdk.Layer(
"ColumnLayer", # レイヤータイプ
data=df_clean, # 使用するデータ
get_position=["lon", "lat"], # 経度・緯度のカラム名
get_elevation="height", # 高さのカラム名
elevation_scale=2000, # 高さ方向のスケール
radius=500, # 円柱の半径
get_fill_color="color", # 色のカラム名
get_line_color=[0, 0, 0], # 枠線の色
pickable=True, # ツールチップを表示したいのでtrueにする
auto_highlight=True, # ホバーした円柱をハイライトする
)
# ツールチップ
tooltip = {
"html": "{location}<br>{height} m from TP",
"style": {"background": "grey", "color": "white", "font-family": '"ヒラギノ角ゴ Pro W3", "Meiryo", sans-serif', "z-index": "10000"},
}
# 視点・ズームレベルの設定
view = pdk.data_utils.compute_view(df_clean[["lon", "lat"]]) # 適当な視点の算出
view.pitch = 90 # 傾斜角
view.bearing = 120 # 方位角
view.zoom = 6 # ズームレベル
# マップの作成
r = pdk.Deck(
layer,
tooltip=tooltip,
initial_view_state=view
)
# HTML形式で出力
r.to_html("2011_tsunami_height.html")
実行するとこのように描画されます。デフォルトだとCartoのマップを背景に使用しますが、APIキーを使ってMapboxを利用することもできます。
マウスでインタラクティブに操作でき、円柱をホバーするとツールチップを表示することができます。
HTMLファイルが出力されているので、ダウンロードしてローカルで確認したりすることも可能です。
おわりに
この記事では、pydeckを使用することで津波の高さ分布を可視化しました。実際に出力されたマップを操作することで、全体的な傾向をつかんだり、自分の知りたい情報をクローズアップして確認したりすることができそうです。今回はGoogle Colabを使用しましたが、JupyterLabやJupyter Notebook上でも利用でき、探索的なデータ分析と親和性が高いと感じました。
-
東北地方太平洋沖地震津波合同調査グループデータ, 2024/05/10参照 ↩︎
-
Crameri, F. (2018). Scientific colour maps. Zenodo. http://doi.org/10.5281/zenodo.1243862 ↩︎
Discussion