Lesson 72

緊急輸送道路 単独 3 研究例分析 — 4 階層 / 2789 km / BCP 脆弱箇所 (橋梁 1612 + トンネル 83 + 老朽橋 350) を読む

L72緊急輸送道路BCP事業継続計画災害脆弱区間バックアップルート第1次第2次第3次補完線RQ×3Format BgeopandasLineString (JSON)NDJSON 風 パーサL11連携 (警戒区域)L66連携 (橋梁)L67連携 (トンネル)L71連携 (法面)浸水想定急傾斜地崩壊土石流地すべり老朽橋耐震基準改定 (1980)
所要 50 分 / 想定レベル: 中級 / データ: DoBoX dataset 1247 (ZIP × 1, ~389 KB)

データ取得手順

⚠️ このスクリプトは自動取得に対応していません。以下のデータセットを DoBoX から手動でダウンロードし、data/extras/ 以下に保存してください。

IDデータセット名
#222dataset #222
#333dataset #333
#444dataset #444
#666dataset #666
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1247緊急輸送道路

実行コマンド:

cd "2026 DoBoX 教材"
python -X utf8 lessons/L72_emergency_road.py

DoBoX のオープンデータは申請不要・商用/非商用とも利用可。 data/extras/.gitignore 対象(約 57 GB のキャッシュ)。 スクリプト実行で自動再生成されます。

学習目標と問い

本記事の対象 — 「緊急輸送道路」 1 件 単独分析

本記事は DoBoX のデータセット 「緊急輸送道路」 (dataset 1247) 1 件を 単独で取り上げ、 広島県の緊急輸送道路ネットワーク 630 セグメント / 総延長 2789 km / 4 階層3 つの独立した研究角度で並列に分析する記事である。 他のシリーズ (橋梁 L66 / トンネル L67 / 道路法面 L71 / 道路規制 L50 / ハザード L11) と本記事は 合体しない。 RQ2 で警戒区域 (L11)、 RQ3 で橋梁・トンネル (L66/L67) を参照するが、 これは「緊急輸送道路の 災害脆弱性 + BCP 脆弱箇所」 を明らかにするための既扱データの従属的参照に 留め、 本記事の主軸はあくまで緊急輸送道路 1 dataset の分析である。

「緊急輸送道路」 とは:
災害発生直後から救助・救急・医療・消火活動および緊急物資・人員等の 輸送のために緊急車両が通行する重要な道路。 都道府県地域防災計画で 指定され、 災害時の「生命線 (ライフライン)」として通行確保が 最優先される。 道路法 (1952) 上の道路 (高速・国道・県道・市町道) のうち、 防災拠点 (病院・警察・消防本部・自衛隊基地・港湾・空港・物資集積所) を相互に結ぶネットワークが指定対象となる。

広島県の緊急輸送道路は4 階層で構成される:
  • 第 1 次緊急輸送道路: 高速自動車国道 + 主要幹線国道 (= 山陽自動車道・中国自動車道・国道 2 号など)。 県全体の骨格となる「国土幹線道路」級。
  • 第 2 次緊急輸送道路: 主要地方道 + 一般国道 (= 県内主要都市間と防災拠点を結ぶ「県内幹線」 級)。
  • 第 3 次緊急輸送道路: 一般県道 + 市町道 (= 上記を補強する 「補完路線」 級)。
  • 補完線: 上記 3 次を補強する追加路線 (= 短い区間)。
本記事の主要発見 (3 RQ):
  • RQ1: 県の緊急輸送道路は総延長 2789 km。 第 2 次が 1696 km (60.8%)と最大、 第 1 次は 470 kmのみで国土幹線骨格を形成、 第 3 次は 598 kmで補完。
  • RQ2: 緊急輸送道路の56.1% (1574 km)が浸水想定 or 土砂警戒区域に重なる。 浸水 43.2% / 土砂 25.1%。 災害時に通行不能となる可能性のある区間が広範に存在。
  • RQ3: 県内橋梁 4,203 のうち1612 件 (38.4%) が緊急輸送道路上に位置。 さらに架設 1970 年以前の老朽橋が 350 件存在 = BCP 脆弱箇所のリスト。

独自に定義する用語 (本記事限定)

研究の問い (3 RQ)

  1. RQ1 (主研究): 広島県の緊急輸送道路の構造 — 階層・延長・地理は どう描けるか? 4 階層 × 計 2789 km の LineString ネットワークを セグメント数 × 延長 × 市町別カバー × 地理クラスの 4 軸で集計し、 「県の生命線ネットワーク」 の物理的形状を初めて系統的に記述する。 H1 = 第 2 次が ≥ 50% を検証。
  2. RQ2 (副研究 1): 緊急輸送道路は災害脆弱性 — 浸水・土砂警戒に どれだけ晒されているか? 想定最大規模の浸水区域 + 土砂警戒区域 3 種に 対して点サンプリング sjoin で重なり延長を計算し、 「災害時通行不能 可能区間」 を同定する。 H2 = 第1次<10% / H3 = 浸水>土砂 を検証。
  3. RQ3 (副研究 2): 緊急輸送道路上の橋梁・トンネル・老朽橋は どう分布するか? 30m バッファで sjoin → 件数集計 → 老朽橋 (pre1970) を 抽出し、 BCP 脆弱箇所を同定。 H4 = 橋梁≥30% AND トンネル≥50% / H5 = 老朽橋≥200 を検証。

仮説 (5)

到達点

本記事を読み終えると、 (1) 県の緊急輸送道路 4 階層・総延長 2789 km・ 27 市町 のネットワーク構造を完全に俯瞰、 (2) 浸水想定 + 土砂警戒区域との重なり率 (浸水 43.2% / 土砂 25.1% / いずれか 56.1%) を定量把握、 (3) 緊急輸送道路上の橋梁 1612 件・ トンネル 83 件・老朽橋 350 件 の BCP 脆弱箇所リストを 特定できる、 という 3 段階の知識が獲得できる。 これにより県の地域防災計画 (BCP) における道路インフラ管理の優先順位が研究者視点で見えるようになる。

使用データ

本研究で使う 1 つの dataset (1 ZIP リソース) を以下の表に示す。 本データは緊急輸送道路 LineString を JSON 配列形式 (NDJSON 風) で公開しており、 4 階層を別ファイルに分けて配信している点が大きな特徴。

データセット仕様

項目
dataset_id 1247
公式名 緊急輸送道路
公式説明 広島県が管理する道路の緊急輸送道路情報
リソース数 1 (ZIP)
リソース ID 32491
ZIP サイズ 397,947 byte (~389 KB)
ZIP 内 ファイル 5 JSON (1 階層メタ + 4 階層 LineString)
配信日 2022-09-26 (公式 stamp)
座標系 (元) WGS84 (EPSG:4326) → 本記事 EPSG:6671 で処理
総延長 2789 km
総セグメント数 630
階層数 4 (本記事独自集約; 公式メタは 7 色)
第1次 (高速・幹線国道) 470 km / 52 セグ
第2次 (主要地方道・国道) 1696 km / 379 セグ
第3次 (一般県道・市町道) 598 km / 184 セグ
補完線 25 km / 15 セグ
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
URL https://hiroshima-dobox.jp/datasets/1247
作成主体 広島県 (土木建築局道路整備課・防災担当)

ZIP 内 5 JSON の内訳

ファイル役割形式件数延長 (km)
05_kinkyu_route.json 階層メタ (色 / 太さ / 線種) dict 配列 (NDJSON 風) 7 階層メタ ({name, color, weight, type})
05_kinkyu_route_01.json 第 1 次 (高速・幹線国道) line array (NDJSON 風) 52 セグ 470.3
05_kinkyu_route_02.json 第 2 次 (主要地方道・国道) line array (NDJSON 風) 379 セグ 1696.1
05_kinkyu_route_03.json 第 3 次 (一般県道・市町道) line array (NDJSON 風) 184 セグ 598.4
05_kinkyu_route_04.json 補完線 line array (NDJSON 風) 15 セグ 24.7

NDJSON 風の解読ポイント

各 JSON ファイルは厳密な JSON ではなく、 「dict / array」 が「,」 区切りで 複数並ぶ NDJSON 風の形式 (= JSON.parse でそのまま読めない)。 読み込みには「テキストを [] でラップして配列化 → json.loads」 という工夫が必要。

# NDJSON 風を JSON 配列としてパース
with open(path, "r", encoding="utf-8") as f:
    text = f.read()
arr = json.loads("[" + text + "]")

ファイルの中身: arr線セグメントの配列で、 各セグメントは [{"e": 経度, "d": 緯度}, ...] の点列。 e = easting (経度), d = degrees of latitude (緯度) と推定される。 これを shapely.LineString に変換する。

データの読み筋

ダウンロード

本記事の再現に必要なすべてを直リンクで提供する。 HTML だけ読めば学習者が完全再現できることが目標 (要件 A)。

生データ (DoBoX 1 件)

このスクリプト本体

中間 CSV (本記事生成、再利用可)

図 (PNG, 直 DL 可)

【RQ1】 緊急輸送道路の構造 — 4 階層 × 2789 km / 第2次 61% / 27 市町

狙い (RQ1)

RQ1 では「県の生命線ネットワーク」 の物理的構造を初めて系統的に記述する。 具体的には 630 セグメント / 総延長 2789 km の緊急輸送道路を 4 階層 × 市町 × 地理クラスの 3 軸で集計し、 「どの階層がどこを通過するか」 を 1 枚で俯瞰できるようにする。 H1 (第 2 次 ≥ 50%) は階層構造の中心仮説を検証する。

手法 — 4 ステップ

  1. STEP 1: ZIP 展開 + NDJSON 風 JSON パース
    ZIP を zipfile.ZipFile.extractall() で展開。 5 JSON のうち 4 つの線データ (_01〜_04) はNDJSON 風(= dict / array が コンマ区切りで並ぶ非標準形式) なので、 "[" + text + "]" で ラップしてから json.loads() で読み込む。
  2. STEP 2: LineString 構築
    各セグメント = [{"e": lon, "d": lat}, ...] の点列。 shapely.LineString([(pt["e"], pt["d"]) for pt in seg]) で LineString に変換。 1 点だけのセグメント (= 始点 = 終点)は除外。
  3. STEP 3: 階層 attr 付与 + 投影
    ファイル名末尾 (_01_04) を rank 列として保持。 EPSG:4326 (WGS84) → EPSG:6671 (JGD2011 第 III 系) に to_crs() で投影変換 (距離計算が m 単位で正確になる)。
  4. STEP 4: 階層 / 市町 / 地理クラス 集計
    length_m をセグメント長として持ち、 groupby("rank") で階層別 km、 50m 間隔点サンプリング → 行政界 sjoin で市町別 km、 市町名から地理クラス (沿岸島嶼 / 平野・沿岸都市 / 中山間山地) に分類。

実装 (主要部のみ抜粋)

L72_emergency_road.py 行 1593–1680

 1
 2
 3
 4
 5
 6
 7
 8
 9
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
import json, zipfile
from pathlib import Path
import geopandas as gpd
from shapely.geometry import LineString
import pandas as pd

DATA_DIR = Path("data/extras/L72_emergency_road")
extract_dir = DATA_DIR / "340006_emergency_transport_road_20220908T000000"

# (1) ZIP 展開 (既展開なら skip)
zf = zipfile.ZipFile(DATA_DIR / "emergency_road.zip")
zf.extractall(DATA_DIR)

# (2) NDJSON 風を JSON 配列としてパースする helper
def load_route_lines(idx):
    p = extract_dir / f"05_kinkyu_route_{idx}.json"
    with open(p, "r", encoding="utf-8") as f:
        text = f.read()
    arr = json.loads("[" + text + "]")  # [...,] でラップ
    lines = []
    for seg in arr:
        if len(seg) >= 2:  # 1 点だけは LineString にできない
            coords = [(pt["e"], pt["d"]) for pt in seg]  # e=経度, d=緯度
            lines.append(LineString(coords))
    return lines

# (3) 4 階層を読み込み GeoDataFrame に統合
records = []
for idx in ["01", "02", "03", "04"]:
    for ln in load_route_lines(idx):
        records.append({"rank": idx, "geometry": ln})
gdf_road = gpd.GeoDataFrame(records, crs="EPSG:4326").to_crs("EPSG:6671")
gdf_road["length_m"] = gdf_road.geometry.length

# (4) 階層別集計
T_rank = (gdf_road.groupby("rank")
                  .agg(セグメント数=("geometry", "count"),
                       延長_km=("length_m", lambda s: s.sum() / 1000))
                  .reset_index())
print(T_rank)

結果 1: 階層別 緊急輸送道路マップ (図 1)

なぜこの図か: 4 階層の緊急輸送道路がどこを通過するかを県全域地図に 重ねて一目で確認したい。 階層を色 (赤=1次, 青=2次, 緑=3次, 橙=補完) で 区別し、 線の太さも階層に対応させて「骨格 → 肉付け → 補完」の階層構造を 直感できるようにする。

図 1 (RQ1): 広島県 緊急輸送道路 4 階層マップ
図 1 (RQ1): 広島県 緊急輸送道路 4 階層マップ

図 1 から読み取れること:

結果 2: 階層別 延長 + セグメント + 地理クラス (図 2)

なぜこの図か: H1 (第 2 次 ≥ 50%) を直感検証するための階層別 km 棒、 セグメント数の比較、 地理クラスの分布 (沿岸都市 / 中山間 / 沿岸島嶼) を 1 枚で並べて、 県の緊急輸送道路の「形」 を 3 角度から把握する。

図 2 (RQ1): 階層別 延長 + セグメント + 地理クラス分布
図 2 (RQ1): 階層別 延長 + セグメント + 地理クラス分布

図 2 から読み取れること:

結果 3: 市町別 緊急輸送道路カバー (図 3)

なぜこの図か: 「自分の市町にどれだけ緊急輸送道路が走っているか」 を 学習者が直感したい。 choropleth + ランキング棒で市町ごとのカバー量を 2 角度から見せる。 第 1 次のみハイライトすることで「骨格」 路線の通り抜け先も 分かる。

図 3 (RQ1): 市町別 緊急輸送道路カバー
図 3 (RQ1): 市町別 緊急輸送道路カバー

図 3 から読み取れること:

結果 4: 階層別 + 市町別 サマリ表

階層別サマリ:

階層 rank_label セグメント数 延長_km シェア_%
01 第1次 (高速・幹線国道) 52 470.3 16.9
02 第2次 (主要地方道・国道) 379 1696.1 60.8
03 第3次 (一般県道・市町道) 184 598.4 21.5
04 補完線 (補強路線) 15 24.7 0.9

階層別 表から読み取れること: 第 2 次が 1696 km / 60.8%と最大、 第 1 次が 470 km / 16.9% と次。 セグメント数も第 2 次が 379 と最多で、 県内主要地方道としての細分化が見える。

地理クラス別サマリ:

地理クラス 延長_km 点数 シェア_%
中山間山地 918.9 18378 35.4
平野・沿岸都市 1626.7 32534 62.6
沿岸島嶼 51.0 1019 2.0

地理クラス 表から読み取れること: 沿岸都市 = "都市帯" として 緊急輸送道路の主要部を占める一方、 中山間 (人口疎) でも数百 km の延長を確保。 これは「人口集中地と中山間地の双方をカバーする」 防災設計の表れ。

市町別 ランキング (Top 15):

市町名 延長_km 点数 地理クラス シェア_%
庄原市 284.8 5695 中山間山地 11.0
三次市 209.6 4191 中山間山地 8.1
東広島市 205.6 4111 平野・沿岸都市 7.9
福山市 198.9 3978 平野・沿岸都市 7.7
三原市 195.6 3911 平野・沿岸都市 7.5
呉市 186.7 3734 平野・沿岸都市 7.2
尾道市 152.6 3052 平野・沿岸都市 5.9
安芸太田町 140.8 2815 中山間山地 5.4
安芸高田市 138.0 2761 中山間山地 5.3
廿日市市 119.6 2393 平野・沿岸都市 4.6
広島市安佐北区 119.0 2379 平野・沿岸都市 4.6
世羅町 81.2 1625 中山間山地 3.1
広島市佐伯区 76.9 1538 平野・沿岸都市 3.0
府中市 64.6 1291 中山間山地 2.5
江田島市 51.0 1019 沿岸島嶼 2.0

市町別 表から読み取れること: 県北部の中山間市町 (庄原・三次・東広島・ 安芸太田町) が km 上位に並ぶのは面積の広さが反映された結果。 一方、 広島市 (8 区合計) は最も人口集中地で道路密度が高く、 都市部の緊急輸送道路総延長は 区合算で大きい。

階層 × 市町 (Top 10) クロス:

市町名 1次_km 2次_km 3次_km 補完_km
庄原市 74.5 155.2 52.2 2.9
三次市 44.6 139.6 25.3 0.0
東広島市 50.3 122.4 32.8 0.0
福山市 27.4 124.2 47.2 0.0
三原市 22.8 145.2 23.4 4.2
呉市 10.0 101.5 70.4 4.7
尾道市 54.8 58.8 39.0 0.0
安芸太田町 35.0 49.6 56.2 0.0
安芸高田市 20.3 62.6 55.1 0.0
廿日市市 21.4 92.8 5.4 0.0

階層 × 市町 表から読み取れること: 中山間市町は第 2 次が支配的 (主要地方道 + 一般国道のみ)、 都市部は第 1 次 (高速・国道 2) が太く通過、 第 3 次は都市部の市町道として補完。 階層構造が地理に応じて使い分けられている ことが具体的に見える。

【RQ2】 災害脆弱性 — 浸水 43.2% / 土砂 25.1% / いずれか 56.1% (1574 km)

狙い (RQ2)

RQ1 で「緊急輸送道路がどこを通過するか」 は分かったが、 これは位置情報のみ。 RQ2 では「緊急輸送道路がどれだけ災害区域に晒されているか」を空間関係で見る。 具体的には浸水想定 (想定最大規模) + 土砂警戒区域 3 種に対して点サンプリング sjoin で重なり延長を計算し、 「災害時通行不能可能区間」 を同定する。 H2 (第 1 次 < 10%) と H3 (浸水 > 土砂) の 2 仮説を検証する。

手法 — 50m 間隔 点サンプリング × sjoin

狙い: LineString と Polygon の直接交差 (intersection)計算が重い (~30 秒)。 代わりに緊急輸送道路を50m 間隔で点に 離散化 (56,122 点) → sjoin (point-in-polygon) で災害区域内かを 判定 → 該当点数 × 50m で延長換算する。 これは1 秒未満で完了し、 誤差は ±50m 程度に留まる。

災害区分制度意味本研究との関連
浸水想定 (想定最大規模) 水防法 (改正 2015) 想定し得る最大規模降雨で起こる浸水 河川氾濫を通る平野部・沿岸部の道路面的脅威
急傾斜地崩壊警戒区域 土砂災害防止法 (2001) 30度以上の自然斜面の崩壊リスク区域 山岳道路の線的脅威。 法面 (L71) と直接対応
土石流警戒区域 土砂災害防止法 (2001) 渓流域での土石流リスク区域 渓流横断・並行路線で線的脅威
地すべり警戒区域 土砂災害防止法 (2001) 地すべりリスク区域 地質弱層を含む箇所の道路線的脅威

注意: 本記事は「重なり延長 (km, %)」を「災害時通行不能の可能性」 と 同定するが、 実際の通行可否は道路の構造 (高架 / 橋梁 / 路面標高)降雨 シナリオ (実時間水位) に左右される。 GIS の polygon-in-polygon 判定は 「リスク存在の有無」 のスクリーニングとして使う。

実装 (主要部)

L72_emergency_road.py 行 1778–1840

 1
 2
 3
 4
 5
 6
 7
 8
 9
1787
1788
1789
1790
1791
1792
1793
1794
1795
1796
1797
1798
1799
1800
1801
1802
1803
1804
1805
# 50m 間隔の点サンプリング → sjoin で災害区域内判定
points = []
for line_id, (_, row) in enumerate(gdf_road.iterrows()):
    L = row.geometry.length
    n = max(int(L / 50.0), 1)
    for i in range(n + 1):
        d = min(i * 50.0, L)
        pt = row.geometry.interpolate(d)
        points.append({"line_id": line_id, "rank": row["rank"],
                       "d_m": d, "geometry": pt})
gdf_pts = gpd.GeoDataFrame(points, crs="EPSG:6671")
print(len(gdf_pts))  # 例: 56,000+ pts

# 浸水想定 (想定最大規模) Shapefile を読込 → sjoin
fl = gpd.read_file("data/extras/flood_shp/shinsui_souteisaidai/shinsui_souteisaidai.shp",
                   encoding="utf-8")[["geometry"]].to_crs("EPSG:6671")
hits = gpd.sjoin(gdf_pts, fl, how="left", predicate="within")
hit_uniq = hits[hits["index_right"].notna()].drop_duplicates(["line_id", "d_m"])
flood_km = len(hit_uniq) * 50.0 / 1000  # 50m/点 × 点数 / 1000 = km
print(f"浸水重なり: {flood_km:.0f} km")

# 同様に土砂警戒区域 3 種 (急傾斜 / 土石流 / 地すべり) も sjoin
# ...省略 (本記事スクリプト参照)

# 階層別重なり率 = 各階層の hit 点数 / 総点数 × 100
rank_total = gdf_pts.groupby("rank").size()
flood_by_rank = (hit_uniq.groupby("rank").size().reindex(rank_total.index, fill_value=0))
print((flood_by_rank / rank_total * 100).round(1))

結果 1: 緊急輸送道路 + 浸水想定 + 土砂警戒 重ね合わせマップ (図 4)

なぜこの図か: H2 と H3 を地図上で同時に直感検証するため、 4 階層の緊急輸送道路を線で、 浸水想定 + 土砂警戒 (急傾斜 + 土石流) を半透明 色塗りで重ねる。 「どの階層がどの災害区域に重なるか」 が空間的に分かる。

図 4 (RQ2): 緊急輸送道路 + 浸水想定 + 土砂警戒区域 重ね合わせ
図 4 (RQ2): 緊急輸送道路 + 浸水想定 + 土砂警戒区域 重ね合わせ

図 4 から読み取れること:

結果 2: 階層別 + 全体 重なり率 (図 5)

なぜこの図か: H2 (第 1 次 < 10%) と H3 (浸水 > 土砂) を 1 枚で 直接判定する。 左で階層 × 災害種別の % を棒で並べ、 右で全体合算 (浸水 / 土砂 / いずれか) を比較する。 10% 閾値ラインを入れて H2 が直感判定できる。

図 5 (RQ2): 階層別 + 全体 災害区域 重なり率
図 5 (RQ2): 階層別 + 全体 災害区域 重なり率

図 5 から読み取れること:

結果 3: 階層別 災害区域重なり 詳細表

階層別 重なり (RQ2 中核データ):

階層 総延長_km 浸水_km 浸水_% 急傾斜_km 土石流_km 地すべり_km 土砂いずれか_km 土砂いずれか_% 災害いずれか_km 災害いずれか_%
第1次 (高速・幹線国道) 471.6 20.2 4.3 5.2 51.5 0.4 56.1 11.9 73.8 15.6
第2次 (主要地方道・国道) 1706.3 832.6 48.8 137.2 368.2 2.8 471.6 27.6 1063.2 62.3
第3次 (一般県道・市町道) 603.1 349.0 57.9 55.4 124.5 1.1 171.0 28.4 424.1 70.3
補完線 (補強路線) 25.0 10.1 40.3 2.0 3.4 0.0 5.0 20.2 13.2 52.5

階層別 重なり 表から読み取れること:

【RQ3】 構造物リスク — 橋梁 1612/4203 (38.4%) / トンネル 83/157 (52.9%) / 老朽橋 350

狙い (RQ3)

RQ2 で「災害区域との重なり」 という面的リスクを見たが、 BCP の もう一つの重要要素は「点的構造物リスク」 — 緊急輸送道路上にある橋梁・ トンネルが災害時に倒壊・通行不能となれば、 区域より広範な機能喪失を引き起こす。 RQ3 では緊急輸送道路 30m バッファ内に入る橋梁 + トンネル + 老朽橋を sjoin で同定し、 BCP 脆弱箇所のリストを定量化する。 H4 (≥30% 橋梁 + ≥50% トンネル) と H5 (老朽橋 ≥ 200) を検証する。

手法 — 30m バッファ + sjoin

狙い: 緊急輸送道路 LineString に対して30m バッファを作成 (= 道路敷地 + 構造物近接帯) し、 橋梁 POINT・トンネル POINT を gpd.sjoin(predicate="within") で重なり判定。 1 構造物が複数階層 バッファに重なる場合は最高階層 (= 数字最小)を採用。

項目意味
バッファ幅 30 m 道路敷地 (典型的に 4-15m) + 構造物近接帯 (橋台・取付道路) の上限
橋梁 POINT L66 既扱 4,203 件 架設年度・延長・幅員・点検年度・判定区分付き
トンネル POINT L67 既扱 157 件 建設年度・延長・幅員付き
老朽橋 (pre1970) 架設 < 1970 = 1100 件 耐震基準改定 (1980) 以前 + 高度成長期前の構造物
老朽橋 (pre1980) 架設 < 1980 = 1660 件 耐震基準改定 (1980) 以前の構造物 (= 旧耐震)

実装 (主要部)

L72_emergency_road.py 行 1923–1976

 1
 2
 3
 4
 5
 6
 7
 8
 9
1932
1933
1934
1935
1936
1937
1938
1939
1940
1941
1942
1943
1944
1945
# 緊急輸送道路 30m バッファを構築
gdf_road["geometry_buf"] = gdf_road.geometry.buffer(30)
buf = gpd.GeoDataFrame(gdf_road[["rank", "geometry_buf"]].rename(
    columns={"geometry_buf": "geometry"}), geometry="geometry", crs="EPSG:6671")

# L66 橋梁 + L67 トンネル CSV → POINT
df_b = pd.read_csv("lessons/assets/L66_all_bridges.csv", encoding="utf-8-sig")
df_b = df_b.dropna(subset=["緯度(10進数)", "経度(10進数)"])
df_b = df_b[df_b["緯度(10進数)"] < 50]
gdf_b = gpd.GeoDataFrame(df_b,
        geometry=[Point(x, y) for x, y in zip(df_b["経度(10進数)"], df_b["緯度(10進数)"])],
        crs="EPSG:4326").to_crs("EPSG:6671")

# sjoin: 橋梁 within 緊急輸送道路 30m バッファ
b_on = gpd.sjoin(gdf_b, buf[["rank", "geometry"]], how="left", predicate="within")
gdf_b["on_road"] = b_on.groupby(b_on.index)["rank"].apply(
    lambda s: s.notna().any())
print(f"橋梁 on 緊急輸送: {int(gdf_b['on_road'].sum())}/{len(gdf_b)}")

# 老朽橋 (架設 < 1970) on 緊急輸送
gdf_b["is_old_pre1970"] = gdf_b["架設年度"].astype(float) < 1970
n_old_on = int((gdf_b["is_old_pre1970"] & gdf_b["on_road"]).sum())
print(f"老朽橋 on 緊急輸送: {n_old_on}")

結果 1: 緊急輸送道路 + 橋梁 + トンネル マップ (図 6)

なぜこの図か: 「緊急輸送道路上にどれだけの橋梁・トンネルが乗っているか」 を 1 枚で把握したい。 橋梁 on (赤) / off (灰) を色分け、 トンネル on (紫菱形) / off (灰 菱形) を区別、 緊急輸送道路を背景線に置くことで「赤と紫が緊急輸送道路に乗る」 構図が直感できる。

図 6 (RQ3): 緊急輸送道路 + 橋梁・トンネル
図 6 (RQ3): 緊急輸送道路 + 橋梁・トンネル

図 6 から読み取れること:

結果 2: 階層別 BCP 構造物 + 老朽橋 (図 7)

なぜこの図か: H4 と H5 を 3 角度から検証する: 階層別 橋梁・トンネル数 + 階層別 橋梁密度 (件/km) + 階層別 老朽橋。 これで「どの階層に構造物が集中するか」 「どの階層が老朽橋を多く抱えるか」 が同時に分かる。

図 7 (RQ3): 階層別 橋梁・トンネル + 老朽橋 BCP
図 7 (RQ3): 階層別 橋梁・トンネル + 老朽橋 BCP

図 7 から読み取れること:

結果 3: 老朽橋 BCP 脆弱箇所マップ (図 8)

なぜこの図か: 「老朽橋がどこに集中しているか」 を地理的に見せる。 緊急輸送道路 on (赤) / off (灰) を色分けすることで、 BCP 観点で優先補強すべき 箇所を地図上で直接見られる。

図 8 (RQ3): 老朽橋 BCP 脆弱箇所マップ
図 8 (RQ3): 老朽橋 BCP 脆弱箇所マップ

図 8 から読み取れること:

結果 4: 階層別 BCP 構造物 詳細表

階層別 BCP 構造物 (RQ3 中核):

階層 延長_km 橋梁数 橋梁密度_件/km トンネル数 老朽橋_pre1970 老朽橋_%
第1次 (高速・幹線国道) 470.3 18 0.04 0 2 11.1
第2次 (主要地方道・国道) 1696.1 1144 0.67 61 256 22.4
第3次 (一般県道・市町道) 598.4 441 0.74 22 90 20.4
補完線 (補強路線) 24.7 9 0.36 0 2 22.2

階層別 BCP 表から読み取れること:

仮説検証総合

仮説検証総合 (H1〜H5)

本記事冒頭で立てた 5 仮説の検証結果を以下にまとめる。 すべての仮説の検証根拠は本記事中の図表に明示されており、再現可能。

仮説 観測値 判定 詳細解説
H1 第2次が総延長 ≥ 50% (RQ1) 観測 = 第2次 1696 km / 全 2789 km = 60.8% 強支持 H1 強支持: 第 2 次緊急輸送道路は1696 km で総延長 2789 km の60.8%を占める。 第 1 次 (470 km, 16.9%) は高速道路 + 主要幹線国道に 限定される短距離ネットワークで、 県内主要都市 (広島・呉・福山・三原) を 結ぶ「骨格」 を形成。 第 2 次は主要地方道 + 一般国道 + 主要市町道で 県内全域を網羅する「肉付け」 ネットワークとして 第 1 次の 3.6 倍の延長を持つ。 これは典型的な「太い骨格 + 細かい肉付け」 階層構造。
H2 第1次は浸水<10% AND 土砂<10% (RQ2) 観測 = 第1次 浸水 4.3% / 土砂 11.9% 反証 H2 反証: 第 1 次緊急輸送道路の重なり率は 浸水 4.3% / 土砂 11.9%。 浸水は10% 未満 (4.3%)に収まるが、 土砂は11.9%でわずかに 10% を超え、 H2 (両方とも < 10%) は反証となった。 ただし第 2 次の土砂 27.6% / 第 3 次の土砂 28.4% と比較すると、 第 1 次は依然として最低リスク階層である事は明確。 高速道路中心で高架橋・トンネル・盛土区間が多く、 水位上昇の 影響を受けにくい構造であるが、 中国自動車道などの山岳貫通区間で 土砂警戒区域とのオーバーラップが発生する。 GIS の polygon-on-line 判定では「重なり」 と判定されても、 高架・トンネル構造のため実際の通行確保はもう少し優位 — 道路構造を加味した補正で実効重なり率はさらに下がる可能性がある。
H3 全体 浸水重なり > 土砂重なり (RQ2) 観測 = 浸水 43.2% / 土砂 25.1% 強支持 H3 強支持: 緊急輸送道路全体で浸水重なり率は 43.2% (1212 km)、 土砂警戒区域 (3 種いずれか) は25.1% (704 km)。 差は+18.1 ポイント。 浸水は河川氾濫想定で沿岸都市・平野部の主要道路が広範囲に 指定区域を通過するため重なりが拡大する一方、 土砂は急傾斜地に 局所的に分布するためライン状道路との交差が物理的に短い。 これは「浸水は面的脅威 / 土砂は線的脅威」 という性質の違いが 道路 × ハザード重なり率に直接反映された結果。
H4 橋梁 ≥ 30% AND トンネル ≥ 50% on 緊急 (RQ3) 観測 = 橋梁 38.4% / トンネル 52.9% 強支持 H4 強支持: 県内橋梁 4,203 のうち緊急輸送道路 30m バッファ内に入る橋梁は1612 件 (38.4%)、 トンネル 157 中83 件 (52.9%)。 これは「災害時に通行確保しなければならない構造物」 の規模感を 定量化する。 とりわけトンネルの52.9%が緊急輸送道路上に 位置するという事実は、 トンネル管理 (= 換気・照明・排水・耐震補強) が 県の BCP に直結することを意味する。 橋梁 1612 件 × トンネル 83 件は「災害時優先点検対象 のリスト」 として直接利用可能。
H5 老朽橋 (pre1970) ≥ 200 on 緊急 (RQ3) 観測 = 老朽橋 (pre1970) on 緊急 350 強支持 H5 強支持: 緊急輸送道路上に架設 1970 年以前の老朽橋が 350 件 (全老朽橋 1100 件の 31.8%) 存在。 これは耐震基準改定 (1980 年) 以前の構造物が県の生命線道路上に 大量に残存する事実を示し、 BCP 脆弱箇所の最重要リストとなる。 参考: 1980 以前 (改定前耐震基準) で見ると 613 件に拡大。 これらの橋梁は災害時に倒壊・通行不能となれば「孤立集落 + 緊急車両 進入不能」 の連鎖を引き起こすため、 計画的な耐震補強・架替えが BCP の核心である。

主要発見の整理

  • RQ1 主発見: 県の緊急輸送道路は総延長 2789 km。 第 2 次が 1696 km (60.8%)と最大、 H1 (強支持)。 「太い骨格 (第 1 次) + 肉付け ネットワーク (第 2 次) + 毛細血管 (第 3 次)」 という3 層機能分担が 定量的に示された。 地理クラス別では平野・沿岸都市 63%と 都市部支配的だが、 中山間も 35%と 無視できないカバー。
  • RQ2 主発見: 緊急輸送道路の56.1% (1574 km)が浸水想定 or 土砂警戒区域に重なる。 第 1 次は浸水 4.3% / 土砂 11.9% と低リスク (H2 反証)、 全体では浸水 43.2% > 土砂 25.1% (H3 強支持)。 「面的脅威の 浸水 vs 線的脅威の土砂」 というハザード性質が道路重なり率に直接表れた。
  • RQ3 主発見: 県内橋梁 4,203 中1612 件 (38.4%)、 トンネル 157 中83 件 (52.9%)が緊急輸送道路上に 位置 (H4 強支持)。 老朽橋 (pre1970) が 350 件 (H5 強支持)、 pre1980 では613 件に拡大。 これらは BCP 脆弱箇所の最重要リストとして直接耐震補強・架替え計画の ターゲットになる。

本記事の独自貢献

  1. 「災害脆弱区間」 概念の定量化: 緊急輸送道路 LineString を 50m 間隔で 点サンプリング → sjoin で災害区域内判定 → 該当点数 × 50m で延長換算する 手法を導入。 LineString-Polygon 直接交差の30 倍高速 (1 秒 vs 30 秒)で 類似精度の集計が可能。
  2. 「BCP 脆弱箇所」 リストの作成: 緊急輸送道路 30m バッファ内の橋梁 (1612 件) + トンネル (83 件) + 老朽橋 (pre1970, 350 件) を 個別 CSV で提供。 県の BCP 計画の耐震補強・架替えターゲットリストと して直接利用可能。
  3. 階層別 災害重なり率の体系化: 4 階層 × 4 災害区分 (浸水 + 急傾斜 + 土石流 + 地すべり) のクロス集計で、 「第 1 次 = 高架優位、 第 2 次・3 次 = 地形脆弱」 という設計差を空間データで実証。
  4. L66 + L67 + L11 との横断連携: 緊急輸送道路 (1 dataset) + 橋梁 (L66 既扱) + トンネル (L67 既扱) + 警戒区域 (L11 既扱) の 4 dataset を sjoin で組合わせ、 県の道路インフラ防災ネットを初めて統合的に 定量化した。
  5. NDJSON 風の独自パーサ: 公式 ZIP 内の JSON は非標準形式(= dict / array が「,」 区切り) で json.loads() でそのまま読めない。 "[" + text + "]" でラップして配列化するトリックを発見・公開。

本記事の限界

発展課題

発展課題 — 結果 X → 新仮説 Y → 課題 Z 形式

発展課題 1 (RQ1 拡張): 緊急輸送道路 vs 全道路網のカバー率

発展課題 2 (RQ1 拡張): 防災拠点 (病院・消防本部・港湾)との接続性検証

発展課題 3 (RQ2 拡張): 河川氾濫 vs 高潮の同時被災シナリオ

発展課題 4 (RQ2 拡張): 降雨シナリオ別 通行可否シミュレーション

発展課題 5 (RQ3 拡張): L71 道路法面 + 第3次・補完路線の沿道斜面リスク統合

発展課題 6 (RQ3 拡張): 判定区分 (?) のマスク影響と老朽橋実態の補正

発展課題 7 (展望): 地震動 + 浸水 + 土砂 同時発生時の通行可能ネットワーク