J-SHIS + PLATEAU + e-Statで地震建物被害を可視化する release 0.0.5α(静岡駅周辺を検証)
はじめに
地震被害を地図上で確認できる仕組みは、自治体の防災計画、応急活動の事前検討、避難所や資機材の配置検討など、さまざまな場面で役に立ちます。
前回は、震源位置、マグニチュード、震源深さ、地盤増幅係数、建物構成比を画面から入力し、地震時の揺れと建物被害を簡易計算するプロトタイプのWebGIS地図を作りました。
r004 は、地震被害推定の処理イメージを説明するデモとしては使いやすい構成でした。一方、地盤条件や建物密度を画面で一律設定していたため、実際の地域差を表現するところまでは踏み込んでいません。
そこで r005 では、対象地域を静岡駅周辺に固定し、次の公開データを取り込める構成へ進めました。
バックエンドにはFastAPIとDuckDBを追加し、公開データの取得、250mメッシュ集計、3ケースの事前計算、OpenLayers表示をDocker環境でまとめています。
今回は、まず静岡駅周辺で、データ取得から地図表示までを一度つなぎ、どの部分に欠損や不確実性が残るかを確認するためのプロトタイプを作成して、全国へ拡張していきます。
本記事で扱う結果は、公開データ連携と画面表示を検証するための説明用結果です。国や自治体が公表する公式な地震被害想定、個別建物の耐震診断、避難判断、行政判断には使用できません。
r005で作成したもの
今回の実装範囲は次のとおりです。
| 項目 | r005の内容 |
|---|---|
| 対象地域 | 静岡駅周辺 |
| 対象範囲 | 経度138.3720~138.4060、緯度34.9600~34.9840 |
| 計算単位 | JIS X 0410の10桁地域メッシュ、約250m四方 |
| 地震動 | J-SHISの「震源断層を特定した地震動予測地図」から1シナリオを選択 |
| 建物 | PLATEAU建築物MVTを優先し、CityGMLにも対応 |
| 人口・世帯 | 令和2年国勢調査の250m地域メッシュ統計 |
| 被害要因 | 揺れのみ |
| 被害区分 | 全壊、半壊のみ、全壊・半壊 |
| 比較ケース | 現況、旧耐震木造30%耐震化、60%耐震化 |
| データベース | DuckDB |
| API | FastAPI |
| Web地図 | OpenLayersによる2D表示 |
| 実行環境 | Ubuntu 24.04、Docker Compose |
今回の対象外は、液状化、津波、火災、斜面崩壊、道路閉塞、人的被害です。被害要因を一度に増やすと、入力データと計算結果の関係が分かりにくくなるため、最初は揺れによる建物被害だけに絞りました。
「3ケース」の意味を整理する
別の検討では、J-SHISの異なる想定地震を3件用意し、case_a、case_b、case_c として切り替える構成も考えていました。
ただし、現在の r005 で実装した3ケースは、異なる3地震ではありません。
地震動は1つに固定し、旧耐震木造の耐震化率だけを変えています。
| ケース | 地震動 | 建物条件 |
|---|---|---|
| ケース1 | 同じJ-SHISシナリオ | 現況 |
| ケース2 | 同じJ-SHISシナリオ | 旧耐震木造の30%を新耐震相当へ振替 |
| ケース3 | 同じJ-SHISシナリオ | 旧耐震木造の60%を新耐震相当へ振替 |
地震動と建物対策を同時に変えると、結果の差が「地震の違い」なのか「耐震化の違い」なのか分かりにくくなります。そこで r005 では、地震動を固定し、対策ケースだけを比較する構成にしました。
異なるJ-SHIS想定地震を3ケース用意する機能は、後続版で追加する予定です。
全体構成
処理は、公開データの取得、正規化、メッシュ集計、被害計算、DuckDB保存、API配信、Web表示の順に進みます。
r005 は静岡駅周辺の小範囲を対象としているため、メッシュと建物をGeoJSON APIで返しています。
将来、静岡市全域、静岡県、全国へ広げる段階では、個別建物をGeoJSONで配信する方式は重くなります。その段階でGeoParquet、DuckDB Spatial、PMTilesを追加する計画です。
フォルダー構成
データ取得、計算、API、画面を分け、後から機能を追加しやすい構成にしています。
earthquake_damage_webmap_r005/
├─ app/
│ ├─ api/
│ │ └─ routes.py FastAPIのREST API
│ ├─ domain/
│ │ ├─ mesh.py 250mメッシュ処理
│ │ ├─ intensity.py 計測震度と震度階級
│ │ └─ damage.py 被害率補間と期待棟数計算
│ ├─ etl/
│ │ ├─ jshis.py J-SHIS取得
│ │ ├─ plateau_catalog.py PLATEAUデータセット解決
│ │ ├─ plateau_mvt.py 建築物MVT取込
│ │ ├─ plateau_citygml.py CityGML取込
│ │ ├─ estat.py e-Stat取込
│ │ ├─ demo_snapshot.py 説明用データ生成
│ │ ├─ build_database.py DuckDB作成
│ │ └─ refresh_public_data.py 公開データ更新CLI
│ ├─ services/
│ │ ├─ data_service.py
│ │ └─ geojson.py
│ ├─ config.py
│ ├─ db.py
│ └─ main.py
├─ config/
│ ├─ app.yml
│ ├─ scenarios.yml
│ ├─ fragility_curves.yml
│ └─ data_sources.yml
├─ frontend/
│ ├─ index.html
│ ├─ css/app.css
│ └─ js/app.js
├─ data/
│ ├─ raw/
│ │ ├─ jshis/
│ │ ├─ plateau/
│ │ └─ estat/
│ ├─ cache/
│ │ ├─ jshis/
│ │ └─ plateau_mvt/
│ ├─ demo/
│ └─ processed/
├─ docs/
│ ├─ DATA_SOURCES.md
│ ├─ MODEL.md
│ ├─ OPERATIONS.md
│ ├─ DEMO_SCRIPT.md
│ └─ VERIFICATION.md
├─ scripts/
├─ tests/
├─ Dockerfile
├─ docker-compose.yml
└─ README.md
data/raw には取得した原本を置き、data/cache にはAPIレスポンスやMVTを保存します。公開データの元ファイルは、配布ZIPには入れていません。
使用する公開データ
J-SHIS
J-SHISは、防災科学技術研究所が提供する地震ハザード情報基盤です。
r005 では、メッシュ別被害地震検索APIを次の条件で利用します。
jshis:
version: "Y2024"
case: "AVR"
period: "P_T30"
ijma_threshold: "45"
request_interval_seconds: 0.35
APIパラメータの mode は S とし、「震源断層を特定した地震動予測地図」を検索します。
処理手順は次のとおりです。
- 静岡駅を含む250mメッシュを求める
- そのメッシュでJ-SHISの地震候補を検索する
-
ijmaが最大の候補を1件選ぶ - 同値の場合は
scoreが大きい候補を選ぶ - 対象範囲の各メッシュで、同じ
ltecodeとltecaseの計測震度を取得する
eqcode だけで追跡すると、同じ地震に含まれる別の発生パターンを誤って選ぶ可能性があります。そのため、ltecode と ltecase の組み合わせを一致させています。
発表や比較で地震シナリオを固定したい場合は、CLIからコードを指定できます。
--scenario-code '<ltecode>'
発生パターンまで固定する場合は次です。
--scenario-code '<ltecode>:<ltecase>'
J-SHIS APIへ連続アクセスしないよう、応答はJSONキャッシュへ保存し、実リクエスト間隔も設けています。
PLATEAU
PLATEAUは、国土交通省が整備・公開している3D都市モデルです。静岡市もオープンデータの対象に含まれています。
r005 では、次の2つの読込方法を用意しました。
| 読込方法 | 用途 |
|---|---|
| 建築物MVT | 最初の動作確認。対象範囲だけを取得しやすい |
| CityGML | 建築年、構造、階数、高さ等の属性を詳しく確認する場合 |
通常はPLATEAUのデータカタログから、静岡市・葵区・駿河区・清水区に対応する最新の建築物MVTを解決します。
plateau:
city_code: "22100"
ward_codes: ["22101", "22102", "22103"]
preferred_format: "MVT"
preferred_lod: "0"
MVTはタイル境界で同じ建物が分割されることがあります。r005 では同一建物IDの断片を union し、1棟へ戻してから保存します。
ただし、PLATEAUの属性は、都市、整備年度、建物によって収録状況が異なります。建築年や構造が入っていない建物を、確定属性として扱わないことが重要です。
e-Stat
人口と世帯数には、令和2年国勢調査の地域メッシュ統計を使用します。
r005 の既定列は次のとおりです。
人口総数 T001102001
世帯総数 T001102034
CSV、TXT、ZIPを読み込めます。文字コードは、UTF-8、UTF-8 BOM付き、CP932、Shift_JISを考慮しています。
統計表によって列名が異なる場合は、CLIで変更できます。
--population-field <人口列名> \
--households-field <世帯列名>
人口と世帯数は、今回の建物被害率そのものには使用しません。地図上の参考情報、被害が大きいメッシュの人口確認、将来の人的被害推計へ進むための基礎データとして保持します。
データ状態を画面に表示する
公開データの取得に失敗しているのに、画面だけ正常に見える状態は避けたいところです。
そこで r005 では、DBと画面に data_status を保存しています。
data_status |
状態 |
|---|---|
demo_snapshot |
すべて説明用データ |
mixed_public_and_demo |
公開データと説明用補完が混在 |
public_inputs_illustrative_damage_model |
J-SHIS・PLATEAU・e-Statは公開入力。ただし被害率曲線は説明用 |
説明用DBを表示している場合は、画面上部に「説明用スナップショット」と表示します。
公開データを一部だけ取り込めた場合も、mixed_public_and_demo として区別します。説明用補完を使った結果を、公開データだけで計算した結果のように見せないためです。
建物属性を3区分へ整理する
r005 の被害計算では、建物を次の3区分へ整理します。
wood_pre1981 木造・1980年以前
wood_post1981 木造・1981年以降
nonwood 非木造
PLATEAUの構造属性に木造、RC、SRC、鉄骨等が含まれる場合は、その属性を優先します。建築年が取得できる木造建物は、1980年以前と1981年以降に分けます。
構造属性がない場合は、階数と高さを補助情報として使います。
4階以上、または高さ13m以上 → 非木造と推定
それ以外 → 木造と推定
建築年がない低層建物は、いったん wood_post1981 として登録し、品質区分を estimated にします。メッシュ集計時には、その建物を次の割合へ按分します。
旧耐震木造 25%
新耐震木造 75%
この25%・75%は、欠損建物をすべて新耐震扱いする偏りを避けるための説明用補完規則です。静岡市の実際の建築年代構成を表す公的な確定値ではありません。
実務へ進める場合は、住宅・土地統計調査、自治体保有データ、用途地域、建物形状等を使い、地域別に補完方法を見直す必要があります。
建物レコードには、分類結果だけでなく、次の情報も残します。
structure_type
construction_year
inventory_class
classification_quality
source_status
plateau_dataset_id
plateau_year
観測属性と推定属性を同じ扱いにしないことが重要です。
250mメッシュへ建物を割り当てる
一般的な建物は、建物ポリゴンの代表点が含まれる250mメッシュへ割り当てます。
凹形状では単純な重心が建物外へ出る場合があるため、Shapelyの representative_point() を使用しています。
# 凹形状やMultiPolygonでも、建物内部に入る代表点を求めます。
representative = clipped.representative_point()
center_lon = float(representative.x)
center_lat = float(representative.y)
mesh_code = latlon_to_mesh250(center_lat, center_lon)
r005 の対象範囲は小さいため、代表点方式から開始しています。
大型施設や長い建物が複数メッシュへまたがる場合は、将来、重複面積による加重平均へ切り替えます。
I_{building}
= \frac{\sum_m Area(B \cap M_m) \times I_m}
{\sum_m Area(B \cap M_m)}
面積、距離、IoU等を本格的に計算する段階では、緯度経度のまま処理せず、静岡県に対応するJGD2011平面直角座標系VIII系(EPSG:6676)へ変換する予定です。
被害期待棟数の計算
建物区分を k、メッシュを m、計測震度を I(m) とすると、被害期待棟数は次で計算します。
E[D_{m,d}]
= \sum_k N_{m,k} \times P(d \mid I(m), k)
-
N(m,k):メッシュ内の建物区分別棟数 -
I(m):J-SHISから取得した計測震度 -
P(d | I(m), k):被害率曲線から求める被害確率 -
d:全壊または半壊の被害区分
config/fragility_curves.yml には、次の2種類の率を設定しています。
complete 全壊率
half_or_worse 全壊または半壊となる率
半壊のみの率は差分で求めます。
P_{half}
= P_{full+half} - P_{full}
計測震度が設定点の間にある場合は、線形補間します。
@dataclass(frozen=True, slots=True)
class DamageExpectation:
"""メッシュ内の全建物に対する被害期待棟数。"""
complete: float
half_only: float
@property
def half_or_worse(self) -> float:
"""全壊・半壊を合わせた期待棟数を返す。"""
return self.complete + self.half_only
個々の建物を「全壊する」「全壊しない」と0・1へ分類するのではなく、地域全体の期待棟数は確率の合計として扱います。
E[N_{full}] = \sum_i P_{full,i}
そのため、集計結果は小数になります。画面上で小数第1位に丸めても、DBとAPIでは小数のまま保持します。
被害率曲線の位置付け
同梱する被害率曲線は、次の処理を確認するための説明用設定です。
- YAMLから被害率を読み込めるか
- 計測震度の線形補間が動くか
- 全壊率が半壊以上率を超えないか
- 耐震化率を上げたとき期待被害棟数が減るか
- メッシュ集計、全体集計、CSV出力が一致するか
係数表を公式値として掲載することは避けています。実務用に差し替える場合は、採用資料、版、建物区分、被害区分、地震動指標、補間方法、適用条件を記録します。
3ケースの計算方法
ケース定義は config/scenarios.yml へ分離しています。
scenarios:
- scenario_id: "current"
name: "ケース1:現況"
retrofit_ratio: 0.0
- scenario_id: "retrofit_30"
name: "ケース2:旧耐震木造30%耐震化"
retrofit_ratio: 0.30
- scenario_id: "retrofit_60"
name: "ケース3:旧耐震木造60%耐震化"
retrofit_ratio: 0.60
30%耐震化の場合は、旧耐震木造の30%を新耐震相当の被害率曲線へ振り替えます。
旧耐震木造の70% × 旧耐震木造の被害率
旧耐震木造の30% × 新耐震木造の被害率
既存の新耐震木造 × 新耐震木造の被害率
非木造 × 非木造の被害率
建物棟数そのものを削除したり増やしたりするのではなく、適用する被害率だけを変えています。
実装部分には、計算意図が追いやすいようにdocstringを付けています。
def expectation(
self,
*,
ijma: float,
wood_pre1981: float,
wood_post1981: float,
nonwood: float,
retrofit_ratio: float,
) -> DamageExpectation:
"""メッシュ別の全壊・半壊期待棟数を計算する。
耐震化ケースでは、旧耐震木造の指定割合だけを
``wood_post1981`` 曲線へ振り替えます。
建物そのものの棟数は変えず、被害率だけを変更します。
"""
DuckDBの作り直しは一時ファイル経由にする
公開データの取込途中で処理が失敗し、運用中のDuckDBが壊れることは避けたいところです。
r005 では、次の順に更新します。
- 公開データを取得する
- 一時DBへ3ケースを書き込む
- 必要なテーブルがあるか確認する
- 3ケースがそろっているか確認する
- 対象メッシュ件数が想定どおりか確認する
- 検査に成功した場合だけ運用DBと置き換える
WebコンテナからDuckDBを参照している間に、ETLコンテナが同じファイルを書き換えないよう、更新時はWebコンテナを停止します。
docker compose stop earthquake-web
更新完了後に再起動します。
docker compose up -d earthquake-web
将来、更新停止時間をなくす場合は、世代別DBを作成し、シンボリックリンクやリリースディレクトリを切り替える方法へ発展させられます。
FastAPIで用意したAPI
主なAPIは次のとおりです。
| URL | 内容 |
|---|---|
/api/health |
コンテナ、DB、データ状態 |
/api/config |
対象範囲と画面設定 |
/api/scenarios |
3ケース一覧と集計値 |
/api/scenarios/{id}/summary |
ケース別KPI |
/api/scenarios/{id}/meshes |
250mメッシュ結果GeoJSON |
/api/buildings |
表示範囲の建物GeoJSON |
/api/sources |
データ出典と取込状態 |
/api/export/{id}.csv |
メッシュ計算結果CSV |
/api/docs |
Swagger UI |
例えば、現況ケースのメッシュを取得する場合は次です。
curl http://localhost:8000/api/scenarios/current/meshes \
-o current.geojson
CSVを取得する場合は次です。
curl http://localhost:8000/api/export/current.csv \
-o current.csv
CSVはExcel等で開きやすいように、UTF-8 BOM付きで返します。
APIルートにも、用途と例外条件が分かるdocstringを入れています。
@router.get("/scenarios/{scenario_id}/meshes")
def scenario_meshes(...):
"""シナリオ別250mメッシュ計算結果をGeoJSONで返す。"""
OpenLayers画面
画面では、3ケースと表示指標を切り替えられます。
表示指標
- 計測震度
- 全壊期待棟数
- 全壊・半壊期待棟数
- 人口
- 建物棟数
背景地図
- 国土地理院 淡色地図
- 国土地理院 標準地図
- 国土地理院 全国最新写真
- OpenStreetMap
メッシュをクリックしたときの表示
250mメッシュコード
計測震度
震度階級
人口
世帯数
建物総数
旧耐震木造
新耐震木造
非木造
全壊期待棟数
半壊期待棟数
全壊・半壊期待棟数
データ品質
建物レイヤー
建物外形はズーム15以上で表示します。
地図を移動するたびに対象範囲全体を読み直すのではなく、現在の表示範囲をBBOXとしてAPIへ渡します。
GET /api/buildings
?min_lon=...
&min_lat=...
&max_lon=...
&max_lat=...
APIの返却上限は6,000棟です。静岡駅周辺の小規模デモでは扱えますが、市全域以上へ広げる段階ではPMTilesへ移行します。
建物とメッシュが重なっている場合は、建物のクリックを優先してポップアップを表示します。
Ubuntu 24.04のDocker環境で起動する
Docker EngineとDocker Composeプラグインが導入済みのUbuntu 24.04を想定しています。
ZIPを展開します。
unzip earthquake_damage_webmap_r005.zip
cd earthquake_damage_webmap_r005
環境設定ファイルを作ります。
cp .env.example .env
起動します。
docker compose up --build -d
状態を確認します。
docker compose ps
docker compose logs -f earthquake-web
ヘルスチェックです。
curl --fail http://localhost:8000/api/health
同じUbuntu PCで確認する場合は、ブラウザから次へ接続します。
http://localhost:8000/
LAN内の別PCから確認する場合は、UbuntuサーバーのIPアドレスを指定します。
http://192.168.x.x:8000/
Swagger UIは次です。
http://localhost:8000/api/docs
Dockerfile
基底イメージはUbuntu 24.04です。
FROM ubuntu:24.04
RUN apt-get update \
&& apt-get install -y --no-install-recommends \
ca-certificates \
curl \
python3 \
python3-pip \
python3-venv \
tini \
&& rm -rf /var/lib/apt/lists/*
コンテナ内でもPython仮想環境を作り、OS管理Pythonへ直接pipインストールしない構成です。
tini をPID 1として使用し、停止・再起動時のシグナルをUvicornへ正しく渡します。
Docker Compose
常時起動するWebコンテナと、公開データ更新時だけ使うETLコンテナを分けています。
services:
earthquake-web:
build:
context: .
dockerfile: Dockerfile
ports:
- "${WEB_PORT:-8000}:8000"
volumes:
- ./data:/app/data
restart: unless-stopped
earthquake-etl:
profiles: ["tools"]
build:
context: .
dockerfile: Dockerfile
volumes:
- ./data:/app/data
DuckDBは単一ファイルDBのため、Webサーバーは1 workerで起動します。
初回起動時は説明用スナップショットを使う
公開データをまだ配置していない状態でも、画面とAPIを確認できるようにしています。
data/demo/r005.duckdb が存在しない場合は、決定的な乱数を使って説明用スナップショットを生成します。同じバージョンであれば、毎回同じデータになります。
説明用データの規模は次のとおりです。
250mメッシュ 143件
建物 5,275棟
説明用DBの集計値は次のとおりです。
| ケース | 全壊期待棟数 | 全壊・半壊期待棟数 |
|---|---|---|
| 現況 | 173.988750 | 815.014776 |
| 旧耐震木造30%耐震化 | 159.247228 | 783.403480 |
| 旧耐震木造60%耐震化 | 144.505705 | 751.792190 |
これらはJ-SHIS、PLATEAU、e-Statの公開データから算出した値ではありません。画面、API、ケース比較、CSV出力を確認するための架空データです。
説明用DBを作り直す場合は次です。
docker compose stop earthquake-web
docker compose --profile tools run --rm earthquake-etl \
python -m app.etl.build_database
docker compose up -d earthquake-web
公開データ版へ更新する
1. e-Statファイルを配置する
令和2年国勢調査の250m人口・世帯データを、次へ配置します。
data/raw/estat/r2_population_250m.zip
ZIPのまま読み込めます。
2. Webコンテナを停止する
docker compose stop earthquake-web
3. 公開データを取得してDBを作り直す
PLATEAU MVTを使用する場合は次です。
docker compose --profile tools run --rm earthquake-etl \
python -m app.etl.refresh_public_data \
--plateau-mode mvt \
--estat-input /app/data/raw/estat/r2_population_250m.zip
このコマンドで次を行います。
- 静岡駅メッシュでJ-SHIS候補を検索
- 使用する地震シナリオを選択
- 対象143メッシュの計測震度を取得
- PLATEAU建築物MVTを取得
- 対象範囲の建物を抽出
- 建物属性を3区分へ整理
- e-Stat人口・世帯を結合
- 現況、30%、60%耐震化を計算
- 一時DBを検査
- 成功時だけ運用DBと置換
4. Webコンテナを起動する
docker compose up -d earthquake-web
データ状態を確認します。
curl http://localhost:8000/api/health | python3 -m json.tool
curl http://localhost:8000/api/sources | python3 -m json.tool
3つの公開入力を使用できた場合は、次の状態になります。
public_inputs_illustrative_damage_model
公開入力を使っていても、被害率曲線は説明用です。公式な被害想定になったわけではありません。
一部を説明用データで補う場合
公開データ取得の問題箇所を確認する目的で、次のオプションを使用できます。
--allow-demo-fallback
この場合、状態は次になります。
mixed_public_and_demo
公開データ版として発表する場合は、mixed_public_and_demo のまま使用しない方が安全です。
J-SHISシナリオを固定する
通常は、静岡駅を含む250mメッシュで ijma が最大の候補を自動選択します。
説明対象を固定する場合は、ltecode または ltecode:ltecase を指定します。
docker compose stop earthquake-web
docker compose --profile tools run --rm earthquake-etl \
python -m app.etl.refresh_public_data \
--scenario-code '<ltecode:ltecase>' \
--plateau-mode mvt \
--estat-input /app/data/raw/estat/r2_population_250m.zip
docker compose up -d earthquake-web
記事や発表資料では、次の情報を記録しておきます。
J-SHISデータ版
ltecode
ltecase
地震名
マグニチュード
使用した地震動指標
取得日
PLATEAU CityGMLを使用する
MVTでは取得できない属性を確認したい場合は、CityGMLを使用します。
静岡市の最新CityGML URLをデータカタログから解決して取得します。
docker compose --profile tools run --rm earthquake-etl \
python -m app.etl.download_plateau
取得したZIPを使ってDBを作り直します。
docker compose stop earthquake-web
docker compose --profile tools run --rm earthquake-etl \
python -m app.etl.refresh_public_data \
--plateau-mode citygml \
--plateau-input /app/data/raw/plateau/22100_shizuoka_latest_citygml.zip \
--estat-input /app/data/raw/estat/r2_population_250m.zip
docker compose up -d earthquake-web
CityGML ZIPは大きくなるため、最初はMVT方式で画面を確認し、属性調査へ進む段階でCityGMLへ切り替える方が扱いやすいです。
現状の問題点
建物属性の欠損
PLATEAUの建築年、構造、階数、高さは、すべての建物へ入っているわけではありません。
r005 では説明用の補完規則を用意していますが、これは実測属性ではありません。画面とDBに classification_quality を残し、推定であることを区別します。
被害率曲線
同梱曲線は処理確認用です。地域、構造、年代、耐震改修、被害区分の定義が異なれば結果も変わります。
公開データを取り込んだだけでは、公式な被害想定にはなりません。
250mメッシュ内のばらつき
同じ250mメッシュ内でも、地盤や建物条件は一様ではありません。J-SHISのメッシュ値を個別建物へ付与する処理は、メッシュ内を同一条件とみなす近似です。
データ年度の違い
J-SHIS、PLATEAU、国勢調査は同じ時点のデータではありません。記事、画面、出力ファイルに、データ版と取得日を残す必要があります。
人的被害は計算していない
人口を表示していますが、死傷者数は計算していません。
人的被害を推計するには、昼夜人口、発災時刻、在宅率、建物用途、避難行動、倒壊時の滞在位置等が必要です。建物被害期待値だけから死傷者数を作ると、根拠の弱い数値になります。
公式な被害認定とは異なる
本プロトタイプの「全壊」「半壊」は、被害率曲線上の計算区分です。罹災証明等で使用される実地調査の被害認定とは異なります。
公開データの利用条件
ソースコードはMIT Licenseで提供していますが、外部データにはそれぞれの利用条件が適用されます。
- J-SHISは、防災科学技術研究所の利用規約を確認する
- PLATEAUは、PLATEAU Data Licenseと各データセットの表示を確認する
- e-Statは、利用規約と統計表の注記を確認する
- 国土地理院タイルは、国土地理院コンテンツ利用規約を確認する
- OpenStreetMapを使う場合は、著作権表示を残す
配布ZIPには、J-SHIS、PLATEAU、e-Statの原データを同梱していません。
取得スクリプト、設定ファイル、説明用スナップショット、計算処理を配布する構成にしています。
今後の進め方
今回、広域展開を見据えた設計も合わせて整理しました。
r006:静岡駅周辺の公開データパイプラインを固める
- 実際に採用するJ-SHIS想定地震名を確定
- 異なるJ-SHIS地震動3ケースを事前計算
- J-SHIS、PLATEAU、e-Statのデータ版と取得日を記録
- 建物属性の存在率レポート
- JGD2011平面直角座標系VIII系への統一
- 無効ジオメトリの検査と修復記録
- 建物と地震動の空間結合結果を検証
- メッシュ別集計CSVと処理レポートを出力
- 入力ファイルのSHA-256を保存
この段階では、現在の耐震化3ケースに加え、地震動ケースという別の軸を持たせます。
地震動シナリオ
├─ scenario_a
├─ scenario_b
└─ scenario_c
建物対策ケース
├─ current
├─ retrofit_30
└─ retrofit_60
組み合わせると9通りになるため、画面上では地震動と建物対策を別々の選択欄にします。
r007:GeoParquetとPMTilesへ移行する
対象を静岡市全域へ広げると、建物GeoJSONの配信が重くなります。
そこで、分析用と配信用を分けます。
分析用
GeoParquet
DuckDB + Spatial
配信用
市区町村集計JSON
250mメッシュPMTiles
建物PMTiles
ズームレベルに応じて表示単位を変えます。
| ズーム | 表示単位 |
|---|---|
| Z5~10 | 市区町村 |
| Z11~14 | 250mまたは500mメッシュ |
| Z15以上 | 個別建物 |
PMTilesは可視化用とし、正式な集計値はDuckDBから作成したAPIを使用します。タイル生成時の間引きによって、集計値が変わらないようにするためです。
r008:属性欠損と不確実性を扱う
- 建築年・構造の属性取得率を表示
- 観測属性と推定属性を分離
- 木造確率、旧耐震確率を確率値として保持
- 市区町村統計と整合するよう属性を補完
- 被害確率を属性確率で加重平均
- 推定信頼度を建物ポップアップへ表示
建物属性を1つの区分へ無理に決めるのではなく、次のように確率で保持します。
p_wooden = 0.72
p_nonwood = 0.28
p_pre1981 = 0.35
p_post1981 = 0.65
r009:PLATEAU未整備地域へ広げる
- 国土地理院の基盤地図情報・建築物外周線を追加
- PLATEAU建物とのIoU・面積比・代表点包含による対応付け
- 対応結果を自動採用、要確認、対応なしへ分類
- 属性推計モデルを未学習地域で検証
- 実測属性と推定属性を分けて配信
r010:静岡県・全国処理へ広げる
- 都道府県、市区町村単位のGeoParquetパーティション
- DuckDBによる列選択と集計
- バッチ再開機能
- 失敗チャンクの再実行
- PMTilesの地域分割
- データ版、モデル版、計算日の公開
- 処理件数、欠損率、処理時間、最大メモリの実行レポート
最初から全国データを1ファイルへまとめず、都道府県、市区町村、一次メッシュ等で分割して処理します。
まとめ
r005 では、ブラウザ内の簡易計算だけだった r004 から一歩進め、J-SHIS、PLATEAU、e-Statを取り込めるデータパイプラインを追加しました。
今回のポイントは次のとおりです。
- 静岡駅周辺を250mメッシュで整理
- J-SHISの公開シナリオを1件選択
- PLATEAU建物をMVTまたはCityGMLから取得
- e-Stat人口・世帯をメッシュへ結合
- 現況、30%、60%耐震化を事前計算
- DuckDBへ保存しFastAPIから配信
- OpenLayersでメッシュと建物を表示
- 公開データ、混在、説明用データを画面で区別
- 被害値を確定判定ではなく期待棟数として扱う
現段階では、被害率曲線と属性補完規則が説明用です。そのため、公開データを取り込んでも公式な地震被害想定にはなりません。
次は、Ubuntu 24.04のDocker環境で実際の公開データを取り込み、取得件数、属性欠損率、空間結合結果、処理時間を確認します。その後、異なるJ-SHIS地震動3ケース、GeoParquet、PMTilesへ進める予定です。
ソース一式
参考のため、配布のZIPファイルをダウンロードして、解凍してください。
公開データの元ファイルは含めていません。READMEの手順に従い、利用者側で取得してください。
参考資料
- 前回の記事:WebMAPで作る地震ハザード・建物被害推定デモ release0.0.4α
- J-SHIS 地震ハザードステーション
- J-SHIS Web API一覧
- J-SHIS メッシュ別被害地震検索API
- J-SHIS 利用規約
- 2024年基準の地震動予測地図(NIED作成版)
- Project PLATEAU オープンデータ
- PLATEAU サイトポリシー
- e-Stat 統計地理情報システム
- 総務省統計局 令和2年国勢調査に関する地域メッシュ統計
- 地域メッシュ統計
- OpenLayers
- FastAPI
- DuckDB
- DuckDB Spatial Extension
- GeoParquet Specification
- PMTiles
- Docker Compose Specification

