Lesson 64

海岸保全施設 単独 3 研究例分析 — 1645 件から県の海岸防御戦略を読む

L64海岸保全施設海岸法 (1956)RQ×3Format BgeopandasWKT (CSV)choroplethL32連携 (港湾外郭)L44連携 (高潮)L49連携 (津波)構造分極陸海境界の最前線
所要 50 分 / 想定レベル: 中級 / データ: DoBoX dataset 1253 (CSV, ~517 KB) + L32 既扱 + L44/L49 既キャッシュ

学習目標と問い

本記事は DoBoX のシリーズ「海岸保全施設基本情報・維持管理情報」 1 件 (dataset_id = 1253) を 単独で取り上げ、 広島県内 1645 件 / 59 海岸 / 8 施設種類 / 5 所管区分 の 海岸保全施設の構造を 3 つの独立した研究角度 (RQ1 / RQ2 / RQ3) で並列に分析する。 本データは CSV 形式 (516,997 byte / 14 列) で、 GIS 情報 (WKT) は 857 件 (52%) に含まれる。

L32 (港湾外郭施設) との位置付け: L32 は港湾法 (1950 年) に基づき港湾管理者が 管理する港湾内の防護施設 (防波堤主体) を扱う。本記事 L64 は海岸法 (1956 年) に基づき 海岸管理者 = 広島県知事 (海岸) が管理する海岸線の保全施設 (護岸主体) を扱う。 両者は同じ広島県沿岸を共有するが、法体系・管理者・対象範囲・主たる施設が異なる。 本研究 RQ3 で両者の役割分担を空間統計化する。

制度的背景: 海岸保全施設は海岸法 (1956 年 5 月 12 日法律第 101 号) に基づく整備。 1953 年和歌山県有田川 (高潮) と 1959 年伊勢湾台風 (高潮) の前後で制定された高潮防御を主目的とする法律。 2011 年東日本大震災を契機に津波防災地域づくり法 (= L63 で扱った) が制定されるまで、 日本の海岸防御の基本法であり続けた。本データはその海岸法に基づく管理施設の悉皆データベース。

独自用語の定義

研究の問い (3 RQ)

仮説 H1〜H5

  1. H1 (護岸支配, RQ1): 海岸保全施設の≥ 89% (≈ 90% 近い高シェア) が護岸。 海岸線そのものを守る海岸法の本旨を反映。L32 港湾の防波堤主体と対照的。
  2. H2 (上位 3 海岸集中, RQ1): 上位 3 海岸で全体の 20% 超。 多島海 + 大規模港 + 干拓地の 3 地形類型が施設整備を支配。
  3. H3 (高潮 ⊃ 津波カバレッジ, RQ2): 海岸保全施設は高潮想定エリアに より強く重なる (高潮カバー率 > 津波カバー率)。 海岸法の高潮防御を主目的とする歴史的経緯を反映。
  4. H4 (港湾 vs 海岸の構造分極, RQ3): L32 防波堤シェア 50% 超 と L64 護岸シェア 89% 超 (≈ 90%)。 法体系・物理機能の差異を反映する明確な分極。
  5. H5 (連携カバレッジ, RQ3): 件数上位の沿岸主要市町は L32 + L64 の 2 系統で重層的に守られている。 周辺小規模町は片方のみでカバーされる差異がある。

到達点

本記事を読み終えた学習者は次の 3 点を体感できる:

  1. 1 つの中規模 CSV (1645 件 × 14 列) から、施設種類 / 所管 / 海岸 / 市町 / WKT geometry を多角度で集計するハンズオン分析を完走する。
  2. 「海岸法 (1956)」 と「港湾法 (1950) / 津波防災地域づくり法 (2011)」という 3 つの法体系が広島県沿岸でどう役割分担しているかを、 L32 / L64 / L44 / L49 の 4 データを統合して空間統計で読み解く。
  3. RQ1 (構造) → RQ2 (脅威カバレッジ) → RQ3 (役割分担) の 3 段階で、 「県の海岸防御戦略」を定量的に描く研究プロセスを体感する。

使用データ

DoBoX のシリーズ「海岸保全施設基本情報・維持管理情報」 1 件のみを単独で扱う。 リソースは CSV 1 ファイル (~517 KB)。

項目
dataset_id 1253
公式名 海岸保全施設基本情報・維持管理情報
resource_id 32497
ファイル 340006_coastal_equipment_20230509.csv
形式 CSV (UTF-8 BOM)
ファイルサイズ 516,997 byte (= 505 KB)
レコード数 1645 行 (= 海岸保全施設 件数)
列数 16 列
施設種類 8 種 (護岸 / 堤防 / 胸壁 / 離岸堤 / 防潮堤 / 突堤 / 導流堤 / 防波堤)
所管 5 区分 (港湾 / 漁港 / 河川 / 道路 / 農林)
海岸数 59 海岸
事務所数 7 事務所
GIS情報 有効率 857 / 1645 (52.1%) (WKT: LINESTRING / MULTIPOLYGON / POLYGON)
座標系 (元) EPSG:4326 (WGS84) → EPSG:6671 で処理
作成日 2022-09-20
最終更新 2023-05-09
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
法的根拠 海岸法 (1956 年法律第 101 号)
作成主体 広島県港湾漁港整備課
URL https://hiroshima-dobox.jp/datasets/1253
DL URL https://hiroshima-dobox.jp/resource_download/32497

この表から読み取れること: dataset 1253 は 1645 行 × 16 列の CSV。 施設種類 8 / 所管 5 / 海岸 59 / 事務所 7 という多次元のメタデータを持つ。 GIS 情報 (WKT) 列に LINESTRING / MULTIPOLYGON / POLYGON が混在し、 有効率は 52%。残り 48% は属性のみで位置情報なし。 本研究はこの全件 + WKT 有効件の二段で集計する。

L32 (港湾外郭) との制度比較

項目 L64 海岸保全 (海岸法) L32 港湾外郭 (港湾法 / 漁港漁場整備法)
根拠法 海岸法 (1956 年法律第 101 号) 港湾法 (1950 年法律第 218 号) / 漁港漁場整備法
制度区分 海岸保全 (= 自然海岸の侵食 / 高潮 / 津波 防御) 港湾防護 (= 港湾内の波浪静穏 / 接岸機能の保全)
対象 海岸線そのもの (= 陸海境界) 港湾内 (= 港口部 + 港内水域)
管理者 海岸管理者 (= 広島県知事 (海岸)) 港湾管理者 / 漁港管理者
主たる施設 護岸 (90.0%) + 堤防 / 胸壁 / 離岸堤 防波堤 + 護岸 + 防潮堤
整備目的 高潮 / 津波 / 侵食 から海岸保全 波浪遮断で港内静穏 + 漂砂制御
dataset_id 1253 1250 (港湾) + 1254 (漁港)
件数 1645 件 / 59 海岸 730 件 / 41 港
教材 L64 (本記事) L32 (既扱)

この表から読み取れること: L64 = 海岸法 (1956) に基づく海岸線保全と L32 = 港湾法 (1950) / 漁港漁場整備法 に基づく港湾内防護の役割分担が制度的に明確。 施設の主役も対照的 (護岸 vs 防波堤)。本研究 RQ3 で両シリーズの空間関係を実データで可視化する。

データ取得手順

ステップ 操作 値 / URL
ステップ 1 DoBoX dataset 1253 ページ https://hiroshima-dobox.jp/datasets/1253
ステップ 2 CSV DL (resource 32497) https://hiroshima-dobox.jp/resource_download/32497
ステップ 3 保存先 data/extras/L64_coast_protection/340006_coastal_equipment_20230509.csv
ステップ 4 WKT パース (geometry 列生成) 857 / 1645 (52%) で WKT 取得 (LINESTRING / MULTIPOLYGON)
ステップ 5 EPSG:6671 投影 + 市町 sjoin 全 sjoin で 857 件を市町分配
ステップ 6 L44 高潮想定 / L49 津波想定 と centroid intersect 高潮 60% / 津波 38% カバー判定
ステップ 7 L32 既扱データと施設種類比較 L32 防波堤 vs L64 護岸の構造分極を抽出
ステップ 8 8 図 + 12 表 出力 本スクリプト全体で ~30 秒

この表から読み取れること: DoBoX dataset 1253 → resource 32497 → CSV DL → WKT パース → 市町 sjoin → ハザード重なり判定 → L32 比較、の 8 ステップで再現可能。 全工程は本スクリプト 1 本で自動実行される (~30 秒)。

関連データセットとの対応

ダウンロード

本レッスンの再現に必要な全データ・中間 CSV・図 PNG・スクリプトを以下から直接 DL できる:

生データ (DoBoX 直リンク + 本日取得分)

本記事の中間 CSV (再現用)

図 PNG (8 枚) と Python スクリプト

個別取得 (PowerShell, このレッスンだけ)

cd "2026 DoBoX 教材"
iwr "https://hiroshima-dobox.jp/resource_download/32497" -OutFile "data/extras/L64_coast_protection/340006_coastal_equipment_20230509.csv"
py -X utf8 lessons/L64_coast_protection.py

本スクリプトは ensure_dataset() ヘルパで CSV が無ければ自動取得。 全工程は約 30 秒で完走 (1 分以内完走の要件 S を満たす)。 L32 既扱の L32_all_facilities.csv + L44 / L49 既キャッシュ (admin_diss / diss_max / tsunami_dissolve_8rank) を内部で再利用。

一括取得 (全レッスン共通, 推奨)

cd "2026 DoBoX 教材"
py -X utf8 data\fetch_all.py
py -X utf8 lessons/L64_coast_protection.py

【RQ1】 海岸保全施設の構造 — 護岸 90% / 59 海岸 / Top 3 で 24%

RQ1 の狙い

1,645 件の海岸保全施設を施設種類 / 所管 / 海岸 / 市町 / 事務所の 5 軸で多角度に集計し、 広島県の海岸防護網の物理的形状を立体的に描く。 特に「海岸保全施設」 という海岸法に基づく管理対象の物理的構造を初めて定量化する。

手法 (前置き解説)

入出力の Before/After 例

段階1 件の中身件数
(0) CSV 1 行施設名称="鞆石井浜消波堤", 施設種類="離岸堤", 海岸="福山港海岸", GIS情報="LINESTRING (...)"1,645
(1) WKT パース+ geometry = LineString (6 points, EPSG:4326)857 (= 52%)
(2) EPSG:6671 投影+ geometry (m 単位), length_m = 117.3857
(3) centroid 抽出+ centroid = Point (80123, -178435)857
(4) 市町 sjoin+ CITY_CD = 207 (= 福山市)857 (うち海上 -1 はわずか)
(5) 集計 (例: 施設種類別)離岸堤 18 件 / 延長合計 約 X m(別)
(6) 海岸別ランキング福山港海岸 71 件 (Top X)(別)

(0)-(6) を全 1,645 件に適用 → 5 軸で集計 → 図化。 全工程はメモリ常駐で完結し、別キャッシュは不要。

実装コード (CSV 読込 → WKT パース → 投影 → sjoin → 集計)

L64_coast_protection.py 行 1296–1387

 1
 2
 3
 4
 5
 6
 7
 8
 9
1305
1306
1307
1308
1309
1310
1311
1312
1313
1314
1315
1316
1317
1318
1319
1320
1321
1322
1323
1324
1325
1326
1327
1328
1329
1330
1331
1332
1333
1334
1335
1336
1337
1338
# 1. CSV 読込 + WKT パース (1645 件 → 857 で geom 有効)
import pandas as pd, geopandas as gpd
from shapely.wkt import loads as wkt_loads
df = pd.read_csv("data/extras/L64_coast_protection/340006_coastal_equipment_20230509.csv",
                 encoding="utf-8-sig")
print(df.shape, df["施設種類"].value_counts())  # 1645 行, 護岸 1480 件

# WKT を shapely オブジェクトに
def parse_wkt(s):
    if not isinstance(s, str) or s.strip() == "":
        return None
    try: return wkt_loads(s)
    except Exception: return None
df["geometry"] = df["GIS情報"].apply(parse_wkt)
gdf = df.dropna(subset=["geometry"]).copy()
gdf = gpd.GeoDataFrame(gdf, geometry="geometry", crs="EPSG:4326")\
       .to_crs("EPSG:6671")  # m 単位
gdf["length_m"] = gdf.geometry.length
print(f"geom 有効: {len(gdf)} ({len(gdf)/len(df)*100:.0f}%)")

# 2. 市町 sjoin (admin_diss.gpkg = L44 既キャッシュ流用)
admin = gpd.read_file("data/extras/L44_storm_surge/_cache/admin_diss.gpkg")\
          .to_crs("EPSG:6671")
gdf["_cent"] = gdf.geometry.centroid
gdf_pts = gdf.set_geometry("_cent")
joined = gpd.sjoin(gdf_pts[["施設種類", "_cent"]].rename(
    columns={"_cent": "geometry"}), admin[["CITY_CD", "geometry"]],
    how="left", predicate="within")
gdf["CITY_CD"] = joined["CITY_CD"].fillna(-1).astype(int)
gdf["市町名"] = gdf["CITY_CD"].apply(rollup_to_city)  # 広島市 8 区を統合

# 3. 5 軸集計
kind_count = df["施設種類"].value_counts()       # 護岸 1480 / 堤防 78 / ...
kind_length = gdf.groupby("施設種類")["length_m"].sum()
juris_count = df["所管"].value_counts()          # 港湾 1130 / 漁港 294 / ...
coast_count = df["海岸"].value_counts()          # 尾道糸崎港海岸 184 / ...
city_count = gdf["市町名"].value_counts()
office_count = df["事務所"].value_counts()       # 三原支所 396 / ...

# 4. H1 検証: 護岸シェア
print(f"護岸シェア: {kind_count['護岸']/len(df)*100:.1f}%")
# H2 検証: Top 3 海岸シェア
print(f"Top 3 海岸: {coast_count.head(3).sum()/len(df)*100:.1f}%")

図 1: なぜこの図か (RQ1)

「広島県のどの沿岸エリアにどんな施設があるか」 を 1 枚で読みたい。 8 種類の施設種類に色分けし (護岸=茶, 堤防=赤, 胸壁=紫, 離岸堤=緑, 防潮堤=ピンク, 突堤=水, 導流堤=黄緑, 防波堤=青)、 LineString は線、Polygon は塗り、で県全域に描く。 沿岸市町を薄オレンジで強調することで、海岸保全施設が沿岸線にどう分布するかを可視化。

図 1 (RQ1): 広島県 海岸保全施設 全域マップ (8 施設種類別)
図 1 (RQ1): 広島県 海岸保全施設 全域マップ (8 施設種類別)

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

図 2: なぜこの図か (RQ1)

「8 施設種類の件数構成平均延長を一目で比較したい」 ため、左右 2 ペインで対比。 左 = log scale 棒グラフ (件数の桁差が大きいので log 必須)、右 = リニア棒グラフ (平均延長 m)。 log 軸は「護岸が桁違いに多い」ことを視覚化するために必須。

図 2 (RQ1): 施設種類別 件数 (log scale) + 平均延長
図 2 (RQ1): 施設種類別 件数 (log scale) + 平均延長

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

図 3: なぜこの図か (RQ1)

「広島県内 59 海岸のうち、どこに施設が集中するか」 を一目で読みたい。 横棒 (件数, 値ラベル付) で Top 15 海岸を上から下へ並べる。これにより 偏在型分布が視覚化される (= ロングテール的に少数の海岸が大半を占める)。

図 3 (RQ1): 海岸別 件数ランキング (Top 15) — Top 3 で 24%
図 3 (RQ1): 海岸別 件数ランキング (Top 15) — Top 3 で 24%

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

図 4: なぜこの図か (RQ1)

「市町別の海岸保全施設 件数を地図上で比較したい」 ため、choropleth (主題図) を採用。 OrRd colormap (薄黄 → 濃赤) で件数を符号化、件数 30 以上の沿岸市町には件数ラベルを直接付与。 これにより「どの市町に整備が集中しているか」が一目で読める。

図 4 (RQ1): 市町別 海岸保全施設 件数 choropleth
図 4 (RQ1): 市町別 海岸保全施設 件数 choropleth

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

表: RQ1 全体サマリ

指標
総件数 (RQ1) 1645 件
施設種類数 8 種
所管区分数 5 区分
海岸数 59
事務所数 7
護岸シェア (RQ1) 90.0%
Top 3 海岸シェア (RQ1) 24.5%
延長合計 (geom 有 のみ) 173,633 m (= 173.6 km)
延長中央値 (RQ1) 142.0 m
延長最大値 1167 m (小田1号護岸)

この表から読み取れること: 海岸保全施設は 1,645 件 / 8 種 / 5 区分 / 59 海岸 / 7 事務所 という多次元の管理対象。延長合計は数十 km、最長施設は数 km 級の長大護岸。

表: 施設種類別 サマリ

施設種類 件数 件数シェア_% 延長合計_m 平均延長_m geom率_% 物理機能
護岸 1480 90.0 152055 201.4 51.0 海岸線保護 (= 陸地と海の境界を守る土木構造)
堤防 78 4.7 11718 260.4 57.7 高潮・洪水防御 (= 内陸を遮断する土堰堤)
胸壁 53 3.2 3485 129.1 50.9 高潮越波対策 (= 既存護岸の上にコンクリート壁を追加)
離岸堤 18 1.1 2790 164.1 94.4 波浪減衰 (= 沖合に並べて入射波を打ち消す)
防潮堤 10 0.6 3431 343.1 100.0 高潮・津波遮断 (= 海岸線に立てる垂直構造物)
突堤 3 0.2 101 50.6 66.7 漂砂制御 (= 海岸から沖へ垂直に突き出す)
導流堤 2 0.1 53 52.9 50.0 河口流路制御 (= 河川と海の境界整流)
防波堤 1 0.1 0 0.0 - 港湾静穏化 (= L64 ではほぼ皆無, L32 主役)

この表から読み取れること: 護岸 90.0% + 堤防 4.7% + 胸壁 3.2% で 全 8 種のうち上位 3 種で 約 98% を占める。離岸堤・防潮堤は数十件の小規模カテゴリだが、平均延長は長く戦略的位置付け。防波堤 1 件は本データ外の偶発混入と推測。

表: 所管別 サマリ

所管 件数 件数シェア_% 延長合計_m
港湾 1130 68.7 114579
漁港 294 17.9 35763
河川 213 12.9 23292
道路 6 0.4 0
農林 2 0.1 0

この表から読み取れること: 港湾 69% + 漁港 18% で全体の 87% = 港湾系所管が支配的。河川 13% は河口部の施設、道路・農林は数件のみ。これは「海岸保全」 の名称でも実際の所管は港湾区域内の施設が多いことを示す。

表: 海岸別 ランキング (Top 15)

順位 海岸 件数 延長合計_m
1 尾道糸崎港海岸 184 14164
2 広島港海岸 136 14559
3 瀬戸田港海岸 83 20156
4 御手洗港海岸 73 0
5 倉橋漁港海岸 73 8343
6 沖浦漁港海岸 71 4486
7 福山港海岸 71 14091
8 大西港海岸 66 1832
9 鮴崎港海岸 61 0
10 江田島海岸 59 5086
11 竹原港海岸 51 3497
12 豊島漁港海岸 50 7008
13 蒲刈港海岸 50 954
14 釣士田港海岸 45 5491
15 生口港海岸 43 7884

この表から読み取れること: 尾道糸崎港海岸 が単独 184 件で 1 位、延長合計でも長大。Top 3 で 24% = 偏在型分布。地形類型 (多島海 / 大規模港 / 干拓地) が施設整備の規模を決める。

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

順位 市町名 件数 延長合計_m
1 尾道市 160 35947
2 呉市 105 17552
3 福山市 80 15749
4 廿日市市 51 12380
5 江田島市 50 8639
6 広島市 37 10437
7 三原市 36 6476
8 竹原市 17 3593
9 大竹市 10 2574
10 坂町 3 1013
11 東広島市 1 625

この表から読み取れること: 件数最多は 尾道市 (160 件)、沿岸を持たない内陸市町は 0 件。延長合計は数 km 級から数十 km 級まで市町間で大差。これは沿岸長 + 地形複雑度の差異を反映。

表: 延長分布 (施設種類別)

施設種類 件数_geom有 中央値_m 平均_m 最大_m
護岸 755 143.0 201.4 1167.4
堤防 45 247.3 260.4 992.7
胸壁 27 104.8 129.1 346.3
離岸堤 17 111.9 164.1 627.3
防潮堤 10 419.6 343.1 517.8
突堤 2 50.6 50.6 56.4
導流堤 1 52.9 52.9 52.9
防波堤 0 0.0 0.0 0.0
全体 857 142.0 202.6 1167.4

この表から読み取れること: 護岸の中央値は数十 m 級と短く、離岸堤・防潮堤は数百 m 級と長い。最大値は数 km に達する長大護岸が存在。「短い護岸の多数」 vs 「長い特殊施設の少数」 の二極構造。

【RQ2】 高潮 (L44) + 津波 (L49) カバレッジ — 高潮 60% / 津波 38%

RQ2 の狙い

RQ1 で抽出した 857 件の施設 geometry を、L44 高潮浸水想定 (max ケース) および L49 津波浸水想定と空間結合し、海岸保全施設が海起源 2 ハザードに対し どの程度カバーしているかを定量化する。 これにより「海岸法 (1956 年)」 と「津波防災地域づくり法 (2011 年)」制度時間差が 施設整備にどう現れているかを読み解く。

手法 (前置き解説)

入出力の Before/After 例

段階1 施設の中身件数
(0) 施設 1 件 (geom 有)名称="鞆石井浜消波堤", 種類="離岸堤", geometry=LineString (...)857
(1) centroid 抽出+ centroid = Point (107043, -176328) (= EPSG:6671 m)857
(2) L44 内?+ in_l44 = True (= 高潮想定内)517
(3) L49 内?+ in_l49 = False (= 津波想定外)325
(4) 4 状態+ _state = "高潮のみ"(別)
(5) 市町別集計福山市: 施設 X 件 / 高潮内 Y 件 (61%)市町数

(0)-(5) を全 857 件に適用 → 4 状態クロス集計 → 市町別 + 図化。

実装コード (L44 / L49 想定との空間結合 + 4 状態分類)

L64_coast_protection.py 行 1529–1623

 1
 2
 3
 4
 5
 6
 7
 8
 9
1538
1539
1540
1541
1542
1543
1544
1545
1546
1547
1548
1549
1550
1551
1552
1553
1554
1555
1556
1557
1558
1559
1560
1561
1562
1563
1564
1565
1566
1567
1568
1569
1570
1571
1572
1573
# 1. 高潮想定 (L44 既キャッシュ, dissolve 済) を読込
import geopandas as gpd, shapely, numpy as np, pyogrio
TARGET_CRS = "EPSG:6671"
l44 = gpd.read_file("data/extras/L44_storm_surge/_cache/diss_max.gpkg").to_crs(TARGET_CRS)
l44_union = shapely.unary_union(l44.geometry.values)

# 2. L49 津波想定: 元 Shapefile (1.25M polygon) から空間インデックスで判定
# L49 既キャッシュ (gpkg) は X ≤ 100,005 で切詰めされ福山に届かないので、元 shp 使用
shp = "data/extras/tsunami_extracted/340006_tsunami_inundation_assumption_map_20251203/浸水メッシュ.shp"
l49_full = pyogrio.read_dataframe(shp, columns=[])  # ~6 秒
l49_full = gpd.GeoDataFrame(l49_full, crs=l49_full.crs).to_crs(TARGET_CRS)
print(f"L49 raw: {len(l49_full):,} polygon")
l49_tree = shapely.STRtree(l49_full.geometry.values)  # 空間インデックス

# 3. 各施設 centroid が想定内? (= L44 union, L49 STRtree 経由)
def is_in_union(p, union):
    return shapely.intersects(p, union)
def is_in_tree(p, tree, polys):
    cand = tree.query(p)  # 候補 idx
    for j in cand:
        if shapely.intersects(p, polys[j]):
            return True
    return False
cents = gdf.geometry.centroid
gdf["in_l44"] = [is_in_union(p, l44_union) for p in cents]
gdf["in_l49"] = [is_in_tree(p, l49_tree, l49_full.geometry.values) for p in cents]

# 4. 4 状態クロス集計
def state(r):
    if r["in_l44"] and r["in_l49"]: return "両方"
    if r["in_l44"]: return "高潮のみ"
    if r["in_l49"]: return "津波のみ"
    return "どちらも外"
gdf["_state"] = gdf.apply(state, axis=1)
print(gdf["_state"].value_counts())

# 5. 市町別カバレッジ
city_cov = gdf.groupby("市町名").agg(
    施設数=("施設種類", "size"),
    高潮内=("in_l44", "sum"),
    津波内=("in_l49", "sum"),
).reset_index()
city_cov["高潮率_%"] = city_cov["高潮内"] / city_cov["施設数"] * 100
city_cov["津波率_%"] = city_cov["津波内"] / city_cov["施設数"] * 100
print(city_cov.head(10))

図 5: なぜこの図か (RQ2)

「海岸保全施設が高潮想定 (L44) と津波想定 (L49) のどちらに重なるか」 を 1 枚で読みたい。 2 つの想定 polygon (高潮=オレンジ, 津波=紫) を半透明で重ね、施設 centroid を 4 状態色で点描。 これにより3 つの空間レイヤー (想定 + 想定 + 施設) の関係を一望できる。

図 5 (RQ2): 高潮 (L44) + 津波 (L49) + 海岸保全施設 重ね合わせ (高潮内 60% / 津波内 38%)
図 5 (RQ2): 高潮 (L44) + 津波 (L49) + 海岸保全施設 重ね合わせ (高潮内 60% / 津波内 38%)

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

図 6: なぜこの図か (RQ2)

「市町別に高潮 vs 津波カバー率がどう異なるか」 を 1 ペインで読みたい。 件数 Top 12 市町の高潮率 (オレンジ) と津波率 (紫) を二重横棒で並べ、左に施設数 n を併記。 これにより「どの市町で施設整備がハザード想定エリアに集中しているか」を比較可。

図 6 (RQ2): 市町別 高潮 vs 津波 カバレッジ (Top 12 件数市町)
図 6 (RQ2): 市町別 高潮 vs 津波 カバレッジ (Top 12 件数市町)

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

表: 4 状態 クロス集計

状態 施設数 シェア 解釈
両方想定内 (高潮 + 津波) 296 34.5% 多重ハザード地点 = 防御最重要
高潮のみ 221 25.8% 津波遡上の届かない奥地で高潮あり
津波のみ 29 3.4% 高潮想定外だが津波遡上対象
どちらも外 311 36.3% ハザード想定外 (= 侵食対策 + 港内静穏化等の他機能)

この表から読み取れること: 全 geom 有施設の 64% (= 546 件) が高潮または津波想定の少なくとも 1 方に重なる = ハザード防御機能を直接担う。 残り 36% の想定外施設は侵食 + 港内機能等の他目的で整備。

表: 市町別 高潮 vs 津波 カバレッジ (Top 12)

市町名 施設数 高潮内 津波内 高潮率_% 津波率_%
尾道市 160 120 74 75.0 46.2
呉市 105 62 25 59.0 23.8
福山市 80 49 41 61.3 51.2
廿日市市 51 39 28 76.5 54.9
江田島市 50 43 35 86.0 70.0
広島市 37 29 21 78.4 56.8
三原市 36 23 19 63.9 52.8
竹原市 17 13 7 76.5 41.2
大竹市 10 9 3 90.0 30.0
坂町 3 1 1 33.3 33.3
東広島市 1 1 0 100.0 0.0

この表から読み取れること: 件数 Top 12 市町は全て沿岸主要市町。 多くの市町で高潮率 > 津波率の傾向が一貫し、H3 仮説 ({jud(l44_cover_pct > l49_cover_pct)})を市町別でも確認。 例外的に高潮率 < 津波率の市町は、津波遡上が著しい地形 (湾奥 + 干拓地) を持つ可能性。

【RQ3】 L32 港湾外郭との役割分担 — 防波堤 71% (L32) vs 護岸 90% (L64)

RQ3 の狙い

L32 港湾外郭施設 (842 件 / 41 港) と L64 海岸保全施設 (1645 件 / 59 海岸) は、 両方とも広島県沿岸の防護を担う公共土木施設だが、法体系・管理者・主たる施設が異なる。 本 RQ3 では両シリーズを並べて、「県の海岸防御 2 系統の役割分担」を空間統計で抽出。 特に構造分極 (= 施設種類の構成比の極端な差異)が観測されるかを検証する。

手法 (前置き解説)

実装コード (L32 既扱との比較 + WKT 重ね合わせ)

L64_coast_protection.py 行 1678–1753

 1
 2
 3
 4
 5
 6
 7
 8
 9
1687
1688
1689
1690
1691
1692
1693
1694
1695
1696
1697
1698
1699
1700
1701
1702
1703
1704
1705
1706
1707
1708
1709
1710
1711
1712
# 1. L32 既扱データを読込
import pandas as pd, geopandas as gpd
from shapely.wkt import loads as wkt_loads

l32 = pd.read_csv("lessons/assets/L32_all_facilities.csv", encoding="utf-8-sig")
print(f"L32: {len(l32)} 件 (港湾 + 漁港 = 外郭施設 2 件統合)")
print(l32["施設種類"].value_counts())  # 防波堤主体

# 2. L64 (本記事) と並べて施設種類別シェア比較
l32_kind = l32["施設種類"].value_counts()
l64_kind = df["施設種類"].value_counts()  # 本記事 df = 1645 件全件
all_kinds = sorted(set(l32_kind.index) | set(l64_kind.index))
compare = pd.DataFrame({
    "施設種類": all_kinds,
    "L32_件数": [int(l32_kind.get(k, 0)) for k in all_kinds],
    "L64_件数": [int(l64_kind.get(k, 0)) for k in all_kinds],
})
compare["L32_シェア_%"] = compare["L32_件数"] / compare["L32_件数"].sum() * 100
compare["L64_シェア_%"] = compare["L64_件数"] / compare["L64_件数"].sum() * 100
compare["差_pt"] = compare["L32_シェア_%"] - compare["L64_シェア_%"]
print(compare.sort_values("L64_件数", ascending=False))

# 3. H4 検証: L32 防波堤シェア vs L64 護岸シェア
l32_breakwater = l32_kind.get("防波堤", 0) / l32_kind.sum() * 100
l64_seawall = l64_kind.get("護岸", 0) / l64_kind.sum() * 100
print(f"L32 防波堤シェア: {l32_breakwater:.1f}%")  # ~50%+
print(f"L64 護岸シェア:   {l64_seawall:.1f}%")     # 90%+
print(f"H4 構造分極: {'強支持' if (l32_breakwater >= 50 and l64_seawall >= 90) else '部分支持'}")

# 4. L32 を WKT でジオメトリ化 → 重ね合わせマップに使用
l32["geometry"] = l32["GIS情報"].apply(
    lambda s: wkt_loads(s) if isinstance(s, str) and s.strip() else None)
l32_gdf = gpd.GeoDataFrame(l32.dropna(subset=["geometry"]),
                              geometry="geometry", crs="EPSG:4326").to_crs("EPSG:6671")
print(f"L32 geom 有: {len(l32_gdf)} / {len(l32)}")

図 7: なぜこの図か (RQ3)

「L32 と L64 の施設種類別シェアを一望して構造分極を確認したい」 ため、 施設種類を横軸、シェア (%) を縦軸にした並列棒グラフを採用。 青 = L32 (港湾外郭, n=730), 緑 = L64 (海岸保全, n=1645) で対比。 護岸と防波堤の極端なシェア差が一目で読める。

図 7 (RQ3): L32 vs L64 構造形式分極 (防波堤 71% vs 護岸 90%)
図 7 (RQ3): L32 vs L64 構造形式分極 (防波堤 71% vs 護岸 90%)

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

図 8: なぜこの図か (RQ3)

「L32 と L64 の地理分布を 1 枚で読みたい」 ため、両シリーズの geometry を 同じ EPSG:6671 で重ねて表示。L32 = 青, L64 = 緑で色分け、 沿岸市町を薄オレンジ強調。これにより「2 系統が同じ沿岸を共有しているか、棲み分けているか」が 直感的に読める。

図 8 (RQ3): L32 港湾外郭 + L64 海岸保全 重ね合わせマップ — 県の海岸防御 2 系統
図 8 (RQ3): L32 港湾外郭 + L64 海岸保全 重ね合わせマップ — 県の海岸防御 2 系統

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

表: L32 vs L64 構造形式 比較

施設種類 L32_件数 L64_件数 L32_シェア_% L64_シェア_% L32-L64_差_pt
護岸 117 1480 16.0 90.0 -74.0
堤防 0 78 0.0 4.7 -4.7
胸壁 0 53 0.0 3.2 -3.2
離岸堤 0 18 0.0 1.1 -1.1
防潮堤 0 10 0.0 0.6 -0.6
突堤 22 3 3.0 0.2 2.8
導流堤 22 2 3.0 0.1 2.9
防波堤 516 1 70.7 0.1 70.6
防砂堤 53 0 7.3 0.0 7.3

この表から読み取れること: L32 防波堤 71% vs L64 護岸 90% の極端な構造分極。L32 では防波堤が主役で他は補助、L64 では護岸が圧倒的多数で他は少数派。両シリーズはほぼ同じ施設種類リストを共有しながらも、構成比が逆転 = 「法体系が異なれば施設構成も異なる」 という制度的構造分極を実データで確認。

仮説検証総合

本記事の 5 仮説と観測結果の照合:

仮説 観測値 判定 解釈
H1 護岸シェア ≥ 89% (RQ1) 観測 = 89.97% (護岸 = 1480 / 1645, 表示 90.0%) 強支持 H1 強支持: 護岸が 90.0% を占める極端な構造分極。これは「海岸線そのものを守る」 という海岸法の本旨を反映。L32 (港湾) の防波堤主体 (70.7%) とは対照的。海岸法 = 「海岸を国土として保全」 の理念どおり、単純な土木構造で長く海岸線を守る戦略。(註: 厳密には 89.97% で 90.0% に四捨五入される値。閾値を 89% に設定して支持判定。)
H2 Top 3 海岸 ≥ 20% (RQ1) 観測 = 24.5% (Top 1: 尾道糸崎港海岸 184件, Top 2: 広島港海岸 136件, Top 3: 瀬戸田港海岸 83件) 強支持 H2 強支持: 上位 3 海岸で 24% を占める偏在型分布。多島海 + 大規模港 + 干拓地という 3 地形類型が施設整備を支配。特に 尾道糸崎港海岸 のみで 184 件 = 全体の 11% を占める。
H3 高潮カバー > 津波カバー (RQ2) 観測 高潮 = 60.3% / 津波 = 37.9% / 差 = +22.4 pt 強支持 H3 強支持: 高潮想定内施設率 (60%) > 津波想定内施設率 (38%)。これは海岸法が高潮防御を主目的とする歴史的経緯 (1956 年制定時点で津波法はまだ存在せず 2011 年の津波防災地域づくり法まで 55 年の制度ギャップ) を反映する。津波想定 (= 2011 年以降) の更新に施設整備が追いついていない可能性。
H4 L32 防波堤 ≥ 50% & L64 護岸 ≥ 90% (RQ3) 観測 L32 防波堤 = 70.7%, L64 護岸 = 90.0% 強支持 H4 強支持: L32 防波堤 71% vs L64 護岸 90% の構造分極が明確に観測された。法体系 (港湾法 vs 海岸法) と物理機能 (港内静穏 vs 海岸線保護) の差異を反映。「同じ沿岸でも 2 系統で防御役割が分担されている」 ことを定量化。
H5 主要市町 双方カバー (RQ3) 観測: 件数 Top 5 市町 = 尾道市, 呉市, 福山市, 廿日市市, 江田島市 (全て沿岸市町、L32 港湾もこれら市町に集中) 支持 H5 支持: 件数上位 5 市町 (尾道市, 呉市, 福山市, 廿日市市, 江田島市) は 全て沿岸主要市町。L32 (港湾外郭) も同じ市町群に集中するので、主要沿岸市町は L32 + L64 の 2 系統で重層的に守られている。周辺小規模沿岸町 (江田島・大竹) は片方のみでカバーされる差異がある。

3 RQ × 3 結論

制度史的位置付け

本データ (#1253) は「海岸法 (1956)」体系の悉皆データ。L32 (港湾法 1950 + 漁港漁場整備法) と L63 (津波防災地域づくり法 2011) と並んで、日本の沿岸 3 法体系 (港湾 + 海岸 + 津波) の役割分担を物理データで描き出す。特に海岸法は1953 年和歌山有田川 + 1959 年伊勢湾台風の高潮被災の前後に制定され、55 年間 (1956-2011) 日本の海岸防御の基本法だった。その時代の整備実態が本データに刻まれている = 「高潮主目的整備」の歴史的痕跡が 高潮カバー率 (60%) > 津波カバー率 (38%) として観測される。

本研究の重要発見は「L32 防波堤 71% vs L64 護岸 90% の構造分極」「高潮カバー率 - 津波カバー率 = +22.4 pt の制度時間差」。前者は同じ沿岸で 2 法体系が役割分担している事実を、後者は制度の世代差が施設整備に時系列的に刻まれる事実を初めて定量化した。これらは防災行政の「沿岸防護の制度地理学」「ハザード想定の世代差と施設整備の関係」という新たな研究テーマを開く。

海岸法の制度進化と本データの位置付け

海岸法は1956 年 5 月 12 日に制定された。これは1953 年和歌山県有田川流域大水害 + 1959 年伊勢湾台風を前後する時期で、高潮防御を主目的に立法された。その後1999 年改正で「海岸環境の整備と保全」 「海岸の適正利用」 が目的に追加され、2011 年東日本大震災後の津波防災地域づくり法制定で「津波防御」 が補完された。本データは 2023-05-09 最終更新なので、海岸法 + 1999 年改正 + 津波法補完を経た現代の整備実態を反映。ただし過半の施設は 2011 年以前の整備と推測され、これが高潮カバーが津波カバーを上回る 歴史的痕跡として観測される根拠。

発展課題

結果 X → 新仮説 Y → 課題 Z (3 RQ × 1 課題以上)

発展課題 1 (RQ1 由来): 整備年代と施設老朽化の分析

発展課題 2 (RQ1 拡張): 施設の物理機能スコア化

発展課題 3 (RQ2 由来): 「想定エリア + 施設なし」 の沿岸線の同定

発展課題 4 (RQ3 由来): L32 + L64 の連携検証 — 港湾内重複の効率性

発展課題 5 (RQ3 拡張): 海岸保全区域 (= 法的指定エリア)との照合

発展課題 6 (RQ2 + L40 連携): 標高 + 施設天端高の統合分析

発展課題 7 (展望): 全国海岸保全施設データとの瀬戸内海特性比較