Lesson 32

外郭施設 2 件統合分析 — 広島県 27 港湾 + 14 漁港の防護網構造

外郭GIS港湾漁港geopandasWKT津波防災
所要 40 分 / 想定レベル: リテラシ / データ: DoBoX 外郭施設 2 dataset (1250 港湾, 1254 漁港)

データ取得手順

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

IDデータセット名
#222dataset #222
#444dataset #444
#666dataset #666
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1250外郭施設(港湾)基本情報・維持管理情報
#1254外郭施設(漁港)基本情報・維持管理情報

実行コマンド:

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

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

学習目標と問い

カバー宣言: 本記事は DoBoX のシリーズ 「外郭施設_港湾/漁港」 2 件 (dataset_id = 1250, 1254) を統合し、広島県内における港湾外郭施設幾何構造を分析する研究記事です。

シリーズ構造判定: (a) 行政カテゴリ分割型

このシリーズの 2 件は、「2 港分の同一データ」ではなく「港湾」(=県管理一般港湾、27 港 480 件) と「漁港」(=県管理漁港、14 漁港 362 件) という 2 つの行政カテゴリで全県の外郭施設を二分する相補型の構造です。 合計 842 件 / 41 港 でほぼ全広島県の外郭施設をカバーします。 両者は完全に同一スキーマ (14 列、GIS情報は LineString WKT) で、 本記事ではこれを縦結合して横断分析します。

独自用語の定義 (本記事内で固定)

用語定義
外郭施設港湾・漁港の外周を波浪・高潮・漂砂・津波から守るために 設置された土木構造物の総称。係留施設 (=岸壁・桟橋、L33 で扱う) や臨港交通施設 (L34) とは別カテゴリであることに注意。
港湾 (kohwan)港湾法に基づく一般港湾。商業・物流を主目的とし、港湾管理者 (県・市) が管理。広島県内 27 港 (広島・福山・尾道糸崎・呉・大竹・竹原・因島・等)。本記事では「港湾カテゴリ」と呼ぶ。
漁港 (gyokoh)漁港漁場整備法に基づく漁業専用港湾。漁港管理者 (県知事・市町村長) が管理。広島県内 14 漁港 (倉橋・豊島・沖浦・走・箱崎・等)。本記事では「漁港カテゴリ」と呼ぶ。
防波堤港の沖に伸ばし波浪を遮断して港内静穏を保つ最も基本的な外郭施設。 本データに 565 本 (港湾 387 + 漁港 178) で全外郭の 67%を占める。
防潮堤高潮・津波を防ぐ陸側の堤。本データには県内 2 件のみ (港湾 1 + 漁港 1) と極めて少ない。 これは「防潮堤」の役割が河川堤防海岸保全施設として別データセットで管理されているため。
突堤陸から海へ直角に突き出る構造物。波浪遮断と漂砂制御を兼ねる。本データに 25 件 (港湾のみ)。
導流堤河口部で河川流路を海に向けて導く堤。土砂の堆積を抑える。31 件 (港湾 29 + 漁港 2)。
防砂堤漂砂を遮断する堤 (砂浜の流出を防ぐ)。61 件 (港湾 33 + 漁港 28)。
離岸堤岸から離れた沖合に置かれる堤。波浪を沖で減衰させ砂浜を保全する。県内 2 件 (港湾のみ)。
護岸海と陸の境界線を直接覆う構造物。侵食と高波を防ぐ。156 件 (港湾 3 + 漁港 153) で 漁港カテゴリに極端に偏在。これは漁港の物理境界保護としての役割を反映。
港口部 (port aperture)港の出入口にあたる開口。波浪と津波が直接侵入する箇所。 通常は左右から防波堤を伸ばして対 (向かい合わせ配置) を作り、波の入射を遮る。本記事では 同一港内で 200 m 以内に他防波堤の端点を持つ防波堤を「対あり」と判定する。
外郭線 総延長1 港の全外郭施設の幾何長 (LineString length) の合計。 港の物理的防護スケールを表す指標。

研究の問い (RQ)

広島県内に整備された外郭施設 (842 件) は、 「港湾 27 港」「漁港 14 漁港」の 2 行政カテゴリでどう分布し、 どの構造形式で外洋からの波浪・高潮・漂砂・津波に対する防護網を形成しているか?

  1. 港湾 vs 漁港 で施設数・延長・構造形式の構成比はどう違うか?
  2. 主要港 (広島港・尾道糸崎港・倉橋・豊島 等) の外郭線総延長は港の規模とどう対応するか?
  3. 防波堤 1 施設あたりの延長中央値は港湾と漁港でどう違うか?
  4. 外郭施設の地理分布は瀬戸内海岸線 + 島嶼のどこをカバーしているか?
  5. 津波浸水想定区域と重ね合わせると、外郭施設は津波バリアとして機能する位置にあるか?
  6. 港口部 (港の出入口) で防波堤対 (向かい合わせ配置) はどれくらい検出できるか?

仮説 H1〜H6

到達点

2 dataset_id を「港湾 + 漁港」の相補的な 2 カテゴリとして読み解き、 842 件の外郭施設の地理分布・構造形式構成・延長分布・港口部対を 統合分析する。これにより、広島県の外郭整備が 「港湾は大型防波堤による波浪遮断」「漁港は防波堤+護岸による集落保護」という カテゴリで分化した二相設計であることを実データで裏付ける。

本記事のスコープ外: 本記事は外郭施設の地理構造に集中する。 維持管理状態 (補修履歴・劣化度) は dataset 中の他列に存在するが本記事では扱わない。 これは将来の発展課題 Z2 として残す。

使用データ

本記事が使用する 2 dataset_id の一覧。完全に同一スキーマ (14 列) で、 カテゴリ列 事業 = 港湾 / 漁港 が二分の唯一の指標です。

dsidカテゴリ件数形式列数DoBoX
1250港湾480CSV (UTF-8 BOM)14#1250
1254漁港362CSV (UTF-8 BOM)14#1254

列スキーマ (両 dataset 共通)

列名意味
事業港湾 / 漁港
所管港湾 / 漁港 (=事業と同じ)
施設分類外郭施設 (定数)
施設種類防波堤 / 防潮堤 / 突堤 / 導流堤 / 防砂堤 / 離岸堤 / 護岸 (7 種)
港湾名港または漁港の名前 (41 種)
事務所管理事務所 (6 種): 三原・広島港湾・呉・東広島・東部・廿日市
市区町村1/2市町名 (NaN がほとんど)
施設番号施設番号 (B-1-01, B-2-03 等の体系)
施設名称施設の固有名 (例: 大防波堤、東防波堤)
管理者名等港湾管理者 / 漁港管理者 / 広島県 等
GIS情報WKT 形式の LineString または MultiLineString (経度・緯度)
開始位置緯度/経度WKT の起点の緯度経度 (geom 欠損行でも値あり場合がある)

データ品質メモ

本記事の主要分析テーブル

2 dataset を縦結合した L32_all_facilities.csv (730 行 × geom 有効分のみ) を主軸に、 各分析セクションでクロス集計と GIS 操作を重ねる。

ダウンロード

生データ (DoBoX 直リンク)

中間データ (本記事生成 CSV)

図 (本記事生成 PNG)

再現用 Python スクリプト

L32_port_breakwaters.py を取得して プロジェクトルートで py -X utf8 lessons/L32_port_breakwaters.py を実行。 データが無ければ自動取得します。

分析 1: 2 dataset の構造を可視化

狙い

「港湾」と「漁港」の 2 dataset が、件数・カバー範囲・構造形式構成で どう分化しているかを 1 枚の絵で示す。これは「カバー宣言」の構造図。

手法 (簡潔に)

2 dataset を縦結合し、port_category 列 (港湾 / 漁港) で分けて 件数・港数・施設種類分布を集計。施設種類別件数を二系列バーで比較する。

実装

L32_port_breakwaters.py 行 1369–1409

 1
 2
 3
 4
 5
 6
 7
 8
 9
1378
1379
1380
1381
1382
1383
1384
1385
SERIES = [
    (1250, "外郭施設(港湾)", "港湾", "harbor_outer_facility.csv",       32494),
    (1254, "外郭施設(漁港)", "漁港", "fishing_port_outer_facility.csv", 32498),
]
dfs = []
for dsid, label, cat, fname, rid in SERIES:
    p = DATA_DIR / fname
    ensure_dataset(p, dataset_id=dsid, resource_id=rid)
    df = pd.read_csv(p, encoding="utf-8-sig")
    df["port_category"] = cat
    df["dsid"] = dsid
    dfs.append(df)

ALL = pd.concat(dfs, ignore_index=True)  # 全 842 行
# クロス集計
pv_kind = pd.pivot_table(ALL, index="port_category", columns="施設種類",
                          values="施設番号", aggfunc="count", fill_value=0)

図と読み取り

なぜこの図か: 2 dataset の規模を文字 + バーで同時に伝える。 左 (カード) は「カテゴリ別の件数+港数+構造形式の内訳」をテキストで、 右 (バー) は「7 構造形式の絶対件数」を視覚化する。両方を 1 枚に置くことで 「カテゴリの規模差 (H1)」と「構造形式の二極化 (H2)」が同時に読める。

2 dataset の構造概観 — カードビュー (左) と構造形式比較 (右)
2 dataset の構造概観 — カードビュー (左) と構造形式比較 (右)

読み取り:

表と読み取り

施設種類 防波堤 防潮堤 突堤 導流堤 防砂堤 離岸堤 護岸 合計
port_category
港湾 387 1 25 29 33 2 3 480
漁港 178 1 0 2 28 0 153 362
合計 565 2 25 31 61 2 156 842

読み取り: 構造形式 7 種のうち、港湾と漁港の両方に多数あるのは「防波堤」のみ。 他の 6 形式は片方のカテゴリに偏在。これがこのシリーズの本質的な分割構造

分析 2: 構造形式の構成比と延長

狙い

構造形式の比率を件数延長 (km)の 2 ベースで比較する。 件数では多いが延長では少ない (=小さい施設が多数) ような構造形式を識別する。

手法 (リテラシレベル解説)

WKT (Well-Known Text) とは、点・線・ポリゴンなどの幾何形状を 人間が読める文字列で表現する標準形式です。例:

LINESTRING (132.86767 34.17434, 132.86825 34.17354, 132.86820 34.17352)

これを Python の shapely.wkt.loads()幾何オブジェクトに変換し、 geometry.length でメートル単位の延長を計算します。 ただし緯度経度のままだと度単位になってしまうので、まず EPSG:6671 (平面直角座標系 第 III 系、広島県を含む)に再投影します。

実装

L32_port_breakwaters.py 行 1437–1463

 1
 2
 3
 4
 5
 6
 7
 8
 9
1446
1447
from shapely.wkt import loads as wkt_loads
ALL["geometry"] = ALL["GIS情報"].apply(lambda s: wkt_loads(str(s)) if pd.notna(s) else None)
gdf = gpd.GeoDataFrame(ALL.dropna(subset=["geometry"]),
                       geometry="geometry", crs="EPSG:4326").to_crs("EPSG:6671")
gdf["length_m"] = gdf.geometry.length

# 件数 vs 延長 の 2 ベース
pv_kind = pd.pivot_table(ALL, index="port_category", columns="施設種類",
                          values="施設番号", aggfunc="count", fill_value=0)
pv_len = pd.pivot_table(gdf, index="port_category", columns="施設種類",
                         values="length_m", aggfunc="sum", fill_value=0) / 1000.0

図と読み取り

なぜこの図か: 件数構成比だけでは「小さな施設が多数」のような 構造を見落とす。延長ベースを併置することで「実際の防護線長としての貢献」が読める。

構造形式の構成比 — 件数ベース (左) と延長ベース (右)
構造形式の構成比 — 件数ベース (左) と延長ベース (右)

読み取り:

表と読み取り

施設種類 防波堤 防潮堤 突堤 導流堤 防砂堤 離岸堤 護岸 合計km
port_category
港湾 45.88 0.0 2.97 0.95 1.08 0.0 0.22 51.10
漁港 14.75 0.0 0.00 0.07 0.64 0.0 10.39 25.85
合計 60.63 0.0 2.97 1.02 1.72 0.0 10.61 76.95

読み取り:

分析 3: 港別ランキングと上位集中

狙い

「どの港が外郭防護をどれだけ持つか」を件数・延長の 2 軸で順位付け。 H4 (上位港集中) を検証し、広島県の外郭整備の地理偏在を視覚化する。

手法

港湾名 + カテゴリでグループ集計。施設数・総延長・構造形式種類数を取り、 延長で降順ソート。上位 15 港を 2 軸バーで比較。

実装

L32_port_breakwaters.py 行 1491–1509

1491
1492
1493
1494
1495
1496
1497
port_agg = gdf.groupby(["port_category", "港湾名"]).agg(
    n_facilities=("施設番号", "count"),
    total_length_m=("length_m", "sum"),
    n_kinds=("施設種類", "nunique"),
).reset_index()
port_agg["total_length_km"] = port_agg["total_length_m"] / 1000
port_agg = port_agg.sort_values("total_length_km", ascending=False)

図と読み取り

なぜこの図か: 件数だけだと「小さい施設多数の港」が上位、延長だけだと 「大型施設少数の港」が上位になる。両方を並べることで両ベクトルの整合・不整合が読める。

外郭施設 上位 15 港 — 件数 (左) と総延長 (右)
外郭施設 上位 15 港 — 件数 (左) と総延長 (右)

読み取り:

表と読み取り (上位 10 港)

port_category 港湾名 n_facilities total_length_m n_kinds total_length_km
港湾 広島港 53 11228.581964 3 11.23
港湾 尾道糸崎港 52 7180.296674 3 7.18
漁港 豊島 48 5669.057508 3 5.67
漁港 倉橋 80 5074.305350 3 5.07
漁港 沖浦 33 3227.514516 2 3.23
港湾 土生港 19 3190.412689 2 3.19
港湾 蒲刈港 38 2972.820507 1 2.97
港湾 御手洗港 19 2447.148989 1 2.45
港湾 川尻港 9 2223.766378 1 2.22
漁港 29 2097.211761 2 2.10

カテゴリ別の上位集中 (H4 検証)

カテゴリ上位 N 港件数 / カテゴリ計シェア (%)
港湾上位 5 (広島港, 尾道糸崎港, 土生港, 蒲刈港, 御手洗港) 181 / 417 43.4%
漁港上位 3 (豊島, 倉橋, 沖浦) 161 / 313 51.4%

読み取り: 港湾上位 5 で 43%、漁港上位 3 で 51% を占有。 H4 を 部分支持。整備は「ごく少数の大規模港 + 多数の小規模港」のべき分布で、 これは商業性 (港湾) も漁業集積度 (漁港) も同じ偏在を示す。

分析 4: 県全域マップで防護網を観る

狙い

件数や延長だけでは見えない地理偏在を、県全域の LineString マップで一望する。 瀬戸内海岸 + 主要島嶼のどこが守られていて、どこが守られていないかを可視化。

手法

WKT パース済 GeoDataFrame を EPSG:6671 (平面直角 III 系) に投影し、 geopandas.plot()線描画。 県全域 polygon (L15 の admin_922) を背景に、カテゴリごとに色分け。 さらに 7 構造形式を別パネル (small multiples) で並べ、それぞれの偏在パターンを比較する。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
g_admin_pref = load_zip_first_geo(ADMIN_DIR / "admin_922_広島県.zip").to_crs("EPSG:6671")
pref_diss = g_admin_pref.dissolve()  # 県境 1 ポリゴン

fig, ax = plt.subplots(figsize=(13, 9))
g_admin_pref.boundary.plot(ax=ax, color="#aaa", linewidth=0.4)
pref_diss.boundary.plot(ax=ax, color="#222", linewidth=1.0)
for cat, color in CAT_COLOR.items():
    sub = gdf[gdf["port_category"] == cat]
    sub.plot(ax=ax, color=color, linewidth=1.6)

# 上位港の名前ラベル
top_label = port_agg.sort_values("total_length_km", ascending=False).head(10)
for _, r in top_label.iterrows():
    sub_p = gdf[gdf["港湾名"] == r["港湾名"]]
    cx = sub_p.geometry.union_all().centroid
    ax.annotate(r["港湾名"], xy=(cx.x, cx.y), ...)

図と読み取り — 県全域

なぜこの図か: 県全域に対する外郭線の分布密度を、青 (港湾) と緑 (漁港) で 直接見ることで「どこに何カテゴリが集中しているか」を一目で把握できる。 個別の港名ラベルで上位 10 港を識別。

広島県 外郭施設マップ — 全 842 件をカテゴリで色分け、上位 10 港にラベル
広島県 外郭施設マップ — 全 842 件をカテゴリで色分け、上位 10 港にラベル

読み取り:

図と読み取り — 構造形式 small multiples

なぜこの図か: 県全域マップでは構造形式の偏在が見えない。 7 形式を別パネルにすることで「防波堤は全域、護岸は漁港エリアのみ」のような 形式ごとの地理パターンが分離して見える。

構造形式 7 種別 small multiples — それぞれの偏在パターン
構造形式 7 種別 small multiples — それぞれの偏在パターン

読み取り:

分析 5: 上位 4 港の詳細マップ — 防護パターンの 3 類型

狙い

上位 4 港 (広島港・尾道糸崎港・倉橋・豊島) の詳細マップを並べ、 各港の防波堤配置パターンを 1 港ずつ精読する。L29 と同じく 「少数事例を深く掘る」アプローチ。

手法

各港について bbox を取り、施設のみを zoom 表示。 構造形式ごとに別色で重ねることで、防波堤・導流堤・突堤の位置関係が読める。

実装

L32_port_breakwaters.py 行 721–755

 1
 2
 3
 4
 5
 6
 7
 8
 9
730
731
732
733
734
735
detail_ports = [
    ("広島港",   "港湾"),
    ("尾道糸崎港", "港湾"),
    ("倉橋",     "漁港"),
    ("豊島",     "漁港"),
]
fig, axes = plt.subplots(2, 2, figsize=(13, 11))
for ax, (port, cat) in zip(axes.flatten(), detail_ports):
    sub = gdf[(gdf["港湾名"] == port) & (gdf["port_category"] == cat)]
    bbox = sub.total_bounds
    ax.set_xlim(bbox[0]-pad, bbox[2]+pad)
    ax.set_ylim(bbox[1]-pad, bbox[3]+pad)
    for k in KIND_ORDER:
        sk = sub[sub["施設種類"] == k]
        sk.plot(ax=ax, color=KIND_COLOR[k], linewidth=2.4, label=k)

図と読み取り

なぜこの図か: 県全域マップでは個々の港の構造が潰れる。 ズーム + 構造形式色分けで「どの港がどんな防護パターンか」を 1 港単位で読める。

上位 4 港の詳細マップ — 構造形式色分け
上位 4 港の詳細マップ — 構造形式色分け

読み取り — 1 港ずつ:

港の防護パターン分類 (発見): 上位 4 港の比較から、外郭施設の組み合わせは 少なくとも以下 3 つのパターンに分類できる:
  1. 3 役一体 (広島港型): 大型商業港。防波堤 + 突堤 + 導流堤 が共存。
  2. 細片防波堤型 (尾道糸崎港型): 多島部の港。短い防波堤多数。
  3. 外向き+集落護岸型 (豊島型): 島嶼漁港。防波堤 + 護岸の 2 大形式。
これらは港の地形的環境 (大都市湾 / 多島水道 / 島嶼) と機能 (商業 / 漁業) の積で決まる。

分析 6: 延長分布の 4 視点解析

狙い

外郭施設の延長分布を多角的に観察し、H3 (港湾防波堤の延長優位) と H4 (上位港集中) を統計的に検証する。

手法 (リテラシレベル解説)

4 つの可視化手法を統合する:

実装

L32_port_breakwaters.py 行 1683–1709

 1
 2
 3
 4
 5
 6
 7
 8
 9
1692
1693
# Lorenz 曲線
all_sorted = port_agg.sort_values("total_length_km", ascending=False)
all_sorted["cum_pct"] = all_sorted["total_length_km"].cumsum() / all_sorted["total_length_km"].sum() * 100
all_sorted["rank_pct"] = (np.arange(len(all_sorted)) + 1) / len(all_sorted) * 100

# 港別 防波堤プロファイル (件数 vs 平均延長)
bp_per_port = gdf[gdf["施設種類"]=="防波堤"].groupby(["port_category", "港湾名"]).agg(
    n=("length_m", "size"),
    mean_m=("length_m", "mean"),
    total_m=("length_m", "sum"),
).reset_index()

図と読み取り

なぜこの図か: 4 視点を 2x2 で並べることで、分布形状・分散・集中・港単位プロファイルを 1 枚に統合できる。これは多角的データを 1 セクションで深く掘るための定石レイアウト。

延長分布 4 視点 — ヒスト、boxplot、Lorenz、散布図
延長分布 4 視点 — ヒスト、boxplot、Lorenz、散布図

読み取り (左上 — 防波堤ヒストグラム):

読み取り (右上 — 構造形式 Boxplot):

読み取り (左下 — Lorenz 曲線):

読み取り (右下 — 港プロファイル散布図):

分析 7: 津波浸水想定との空間交差

狙い

外郭施設は津波バリアとして機能できる位置にあるか? 津波浸水想定区域と空間交差判定を行い、H5 (重なり 20-70%) を検証する。

手法 (リテラシレベル解説)

空間交差判定 (intersects): 1 つの幾何形状 (LineString) と他の幾何形状 (Polygon) が 1 点でも重なるかを判定するブール演算。shapely.intersects() を使う。

津波想定区域は大量のメッシュポリゴンで表現されているため、そのまま全件交差すると重い。 そこで事前に dissolve (合体) して 1 つの大きなポリゴンにしてから交差判定する。 これは要件 S (1 分以内完走) に必須の高速化テクニック。

さらにbbox プレフィルタ: 外郭施設のうち、津波ポリゴンの外接矩形に入らないものは そもそも交差しえないので除外する。gdf.cx[xmin:xmax, ymin:ymax] で実現。

実装

L32_port_breakwaters.py 行 1756–1780

 1
 2
 3
 4
 5
 6
 7
 8
 9
1765
g_tsunami = gpd.read_file("浸水メッシュ.shp", encoding="cp932").to_crs("EPSG:6671")
g_tsunami_diss = g_tsunami.dissolve()  # 全メッシュを 1 つに合体 (=高速化)
ts_geom = g_tsunami_diss.geometry.iloc[0]

# bbox プレフィルタで候補を絞る
bbox = ts_geom.bounds
candidate = gdf.cx[bbox[0]:bbox[2], bbox[1]:bbox[3]]
candidate["intersects_tsunami"] = candidate.geometry.intersects(ts_geom)
gdf["intersects_tsunami"] = False
gdf.loc[candidate.index, "intersects_tsunami"] = candidate["intersects_tsunami"]

図と読み取り

なぜこの図か: 津波想定 polygon (紫透明) と外郭施設 (赤=重なる、灰=重ならない) を 2 カテゴリ別に並べ、津波バリアの位置関係を視覚化する。

津波浸水想定 × 外郭施設 — 港湾 (左) と漁港 (右)
津波浸水想定 × 外郭施設 — 港湾 (左) と漁港 (右)

読み取り:

解釈の注意: 「重なる」 = 「津波を防げる」ではない。 防波堤の設計波高は数 m 級で、津波 (10〜20 m) を完全には止められない。 本分析は位置の必要条件を見ているにすぎず、機能評価は高さ × 強度 × 想定波高の 3 軸で 別途行う必要がある (発展課題 Z3)。

分析 8: 港口部の防波堤対の検出

狙い

港湾構造の最も基本的なパターン「港口部の防波堤対」を検出する。 これは港の出入口を左右から防波堤で挟み、波浪を遮る配置で、 港湾工学の教科書にも出る古典的設計。本データから自動検出可能か?

手法 (リテラシレベル解説)

端点近接判定: 各防波堤の端点 2 つ (始点・終点) を取り出し、 同一港内で200 m 以内に他の防波堤の端点があれば「対あり」と判定する。

200 m の根拠: 広島県の港口部の標準的な開口幅 (港の規模に応じて 50〜200 m)。 これより遠いと「対」と呼べない。

実装

L32_port_breakwaters.py 行 1813–1868

 1
 2
 3
 4
 5
 6
 7
 8
 9
1822
1823
1824
1825
1826
1827
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
def endpoints(g):
    """LineString の最初/最後の点を返す"""
    if isinstance(g, LineString):
        coords = list(g.coords)
        return coords[0], coords[-1]
    elif isinstance(g, MultiLineString):
        longest = max(g.geoms, key=lambda x: x.length)
        return list(longest.coords)[0], list(longest.coords)[-1]
    return None, None

bp = gdf[gdf["施設種類"] == "防波堤"]
PAIR_THRESH_M = 200.0

# 同一港内、別防波堤、いずれかの端点までの距離 < THRESH を判定
for i, row_a in bp.iterrows():
    p1a, p2a = endpoints(row_a.geometry)
    for j, row_b in bp.iterrows():
        if i == j or row_a["港湾名"] != row_b["港湾名"]: continue
        p1b, p2b = endpoints(row_b.geometry)
        # 4 端点ペアの最小距離
        for pa in [p1a, p2a]:
            for pb in [p1b, p2b]:
                d = ((pa[0]-pb[0])**2 + (pa[1]-pb[1])**2)**0.5
                if d < PAIR_THRESH_M:
                    has_pair = True

図と読み取り

なぜこの図か: 上位 4 港 (港湾) + 4 漁港にズームし、 「対あり」防波堤を赤、「単独」防波堤を灰で塗り分け。 港口部の左右配置が視覚的に確認できる。

防波堤対の検出 — 港湾上位 4 港 (左) と漁港上位 4 漁港 (右)
防波堤対の検出 — 港湾上位 4 港 (左) と漁港上位 4 漁港 (右)

読み取り:

表と読み取り

カテゴリ防波堤数対あり対率最小距離 中央値
港湾34826375.6% 93 m
漁港16815692.9% 37 m

読み取り:

仮説検証と考察

H1〜H6 の検証結果を 1 表で示す。

H claim result verdict
H1 港湾 ≥ 漁港、漁港 40%+、延長は港湾 ≥ 1.5 倍 港湾=480, 漁港=362 (43.0%), 延長 港湾=51.1 km / 漁港=25.85 km, 比 1.98x 支持
H2 港湾は防波堤主体 70%+、漁港は防波堤+護岸 85%+、港湾の護岸は 5% 未満 港湾防波堤=80.6%, 港湾護岸=0.6%, 漁港防波堤+護岸=91.4% (防波堤 49.2%, 護岸 42.3%) 支持
H3 防波堤 1 施設中央値: 港湾 > 漁港 港湾 80.8 m vs 漁港 65.3 m, 差 15.5 m 支持
H4 港湾上位 5 港で 50%+、漁港上位 3 漁港で 50%+ 港湾上位 5: 43.4% / 漁港上位 3: 51.4% 部分支持
H5 津波浸水想定との交差は 20〜70% 全体 46.4% (港湾 41.0%, 漁港 53.7%) 支持
H6 防波堤対 (200 m 以内): 港湾 30%+ かつ 漁港 30%+ (実測値が当初想定 30% より遥かに高く、強い対構造を発見) 港湾 75.6% / 漁港 92.9% (両者とも想定の 2 倍超) 強支持 (想定上回り)

総括: 広島県の外郭整備思想

2 dataset から再構成した外郭施設の構造分析により、以下の3 つの設計思想が読み取れる。

本記事は「外郭施設は港の生命線」という視点を実データで裏付けた。 842 件の外郭が、2 つの法的カテゴリで 41 港の波浪・高潮・漂砂・津波に対する 多層的な防護網を形成している。この網の幾何構造を理解することは、 港湾防災を扱う者にとっての最初のリテラシである。

2 港の比較で見る防護思想 (=本記事タイトルの問いに答える)

2 件のデータが「2 港分」ではなく「2 行政カテゴリ分」だったため、 本記事は「広島港 vs 福山港」のような 2 港比較ではなく、 「港湾 vs 漁港」の二相比較を主題とした。これによりむしろ 27 + 14 = 41 港の俯瞰が可能になり、研究的により価値ある分析になった。

具体的な防護思想の相違:

港湾 (商業港)漁港 (漁業基地)
主役構造防波堤 (81%)防波堤 + 護岸 (91%)
1 施設サイズ大型 (中央値 81 m)小型 (中央値 65 m)
カテゴリ計延長51.1 km25.9 km
防護対象船舶航行・荷役・防波漁船 + 集落 + 海岸線保護
地理湾奥・主要市街地島嶼 + 沿岸集落
港口部対率76%93%

発展課題

結果 X1 → 新仮説 Y1 → 課題 Z1: 維持管理状態の地理偏在

結果 X2 → 新仮説 Y2 → 課題 Z2: 係留施設・臨港交通との 3 層統合

結果 X3 → 新仮説 Y3 → 課題 Z3: 津波想定 × 外郭高さの組み合わせ評価

結果 X4 → 新仮説 Y4 → 課題 Z4: 港口部「対」の方位ベクトル分析