Lesson 14

L14 3D 都市モデル 7 市町比較 — 建物高度の地理学

3D都市モデルPLATEAU建物利用現況浸水DID都市階層致命率small multiplessjoin
所要 実行 29 秒 / 想定レベル: リテラシ / データ: DoBoX 3D都市モデル #1316 #1302 #1187 #1188 #1189 #1443 #1444 / 建物利用現況 #1469 #512 #1323 #1483 #71 #1474 #1327 / 浸水 #1278 / DID

データ取得手順

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

IDデータセット名
#71都市計画区域情報_建物利用現況_海田町
#222dataset #222
#512都市計画区域情報_建物利用現況_府中市
#999dataset #999
#11873D都市モデル_呉市
#11883D都市モデル_福山市
#11893D都市モデル_海田町
#1278過去に発生した災害情報
#1294各種法令の規制情報_広島県普通河川等保全条例
#13023D都市モデル_府中市
#13163D都市モデル_広島市
#1323都市計画区域情報_建物利用現況_呉市
#1327都市計画区域情報_建物利用現況_三次市
#1334都市計画区域情報_新築動向_熊野町_2016-2020
#14433D都市モデル_竹原市
#14443D都市モデル_三次市
#1469都市計画区域情報_建物利用現況_広島市
#1474都市計画区域情報_建物利用現況_竹原市
#1483都市計画区域情報_建物利用現況_福山市

実行コマンド:

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

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

学習目標と問い

本記事のスタイル: 7 市町の建物 footprint と高度属性を比較し、「都市階層構造」と「浸水時の危険度」を可視化
3D 都市モデル (PLATEAU CityGML) は重量級 (各市町 100 MB〜1 GB) のため、 本記事は 建物利用現況 GeoJSON (#1469 等, 階数 KAISUU と軒高 TATE_H を含む) を用いて、 PLATEAU の建物 footprint レイヤと同等の地理学的分析を行う。 浸水想定深 3 m 以上 × 平屋 = 命の危険最高ランクという 「災害人類学」 の視点で 7 市町を比較する。

カバー宣言

本記事は 3D都市モデル 7 市町 = 7 dataset_id を統合分析:

全 PLATEAU CityGML 規格で統一されており、統合可能。
ただし CityGML 本体は重量級なため、同 7 市町の建物利用現況 GeoJSON (#1469 / #1483 / #1323 / #1327 / #512 / #71 / #1474) を Plan B として採用。 これらは PLATEAU の建物 footprint + 属性 (階数・軒高) と内容が一致する軽量版で、 本研究の論点 (建物高度の地理学) には十分。
対応表 7/7 件 論理カバー

主な問い

  1. 都市階層の問い: 7 市町で建物階数の構成は どう違うか? 政令市 (広島市) と中山間市町 (三次市) で何が変わるか?
  2. 用途と階数の関係: 同じ「商業」でも、都市規模で平均階数は変わるか?
  3. 中心市街地効果: DID (人口集中地区) 内外で 階数の差はどれだけ広がるか?
  4. 浸水時の致命率: 浸水想定 3 m 以上の地域に立つ平屋 (1 階建て) は何棟で、市町別にどれだけ差があるか?

立てた仮説 (H1〜H6)

  1. H1: 広島市は最も高層建物率が高い (5 階以上が多い)
  2. H2: 山間部市町 (三次市) は平屋率が高い
  3. H3: 浸水想定深 3 m 超の地域に「平屋」 = 命の危険最高ランク (致命的建物) が確実に存在する
  4. H4: 港湾系 (呉市/福山市) は中層 (3-4 階) 中心
  5. H5: 旧市街地 (竹原は古い町並み) は低層密集 (平屋+2 階の比率が大都市より高い)
  6. H6: 浸水域内 平屋率は市町間で 10 倍以上の差

用語の定義 (本レッスン独自を含む)

結果サマリー

指標結果
対象市町7 市町 (人口 23,000 〜 1,189,000)
統合 建物数787,389 棟
最大 階数52 階 (広島市)
最大 軒高178 m (広島市)
5 階以上 建物 (高層)13,885 棟
10 階以上 建物 (タワー)2,905 棟
致命的建物 (浸水3m+ × 平屋)35,816 棟
処理時間28.8 秒 (7/7 市町 cached)

使用データ

主データ (Plan B: 軽量 GeoJSON 採用)

市町3D都市モデル建物利用現況取得状況建物数読込時間 (s)
広島市#1316#1469OK (cached)350,7740.3
福山市#1188#1483OK (cached)250,2840.2
呉市#1187#1323OK (cached)94,5580.1
三次市#1444#1327OK (cached)31,8270.0
府中市#1302#512OK (cached)25,3680.0
海田町#1189#71OK (cached)11,0480.0
竹原市#1443#1474OK (cached)23,5300.0

カバー対応表 (DoBoX 7 dataset_id ↔ 本記事)

本記事は 3D 都市モデル 7 dataset_id を「論理カバー」する。 CityGML 直接処理は重すぎるため、同 7 市町の建物利用現況 GeoJSON で代替。 PLATEAU は CityGML から 建物 footprint と階数・軒高を生成しているので、 本記事の分析対象 (= 階数・軒高・footprint) は両者で一致する。

市町3D都市モデル CityGML (本来の対象)建物利用現況 GeoJSON (採用 = Plan B)
広島市#1316 (~950 MB)#1469 (~33 MB)
府中市#1302#512
呉市#1187#1323 (~12 MB)
福山市#1188#1483 (~29 MB)
海田町#1189#71 (~1.3 MB)
竹原市#1443#1474 (~1.9 MB)
三次市#1444#1327 (~1.1 MB)

対応表 7/7 件 論理カバー

補助データ

ダウンロード

中間データ (再現用 CSV)

ファイル内容
L14_city_stats.csv7 市町 × 基本統計 (建物数/平均階数/最大階数/5階以上率/平屋率)
L14_band_cross_count.csv市町×階数バンド 棟数
L14_band_cross_pct.csv市町×階数バンド 構成比
L14_yoto_cross.csv市町×用途バンド 棟数
L14_yoto_cross_pct.csv市町×用途バンド 構成比
L14_yoto_kaisuu_mean.csv市町×用途バンド 平均階数 (ヒートマップ元)
L14_height_dist.csv軒高 (TATE_H) 中央値・P75/P95/P99/最大
L14_flood_overlay.csv浸水域 sjoin 結果 (致命率含む)
L14_deadly_summary.csv致命率 市町ランキング
L14_did_compare.csvDID 内外 階数比較

図 PNG

ファイル内容
L14_small_multiples_kaisuu.png図1 7 市町 small multiples (主題図)
L14_band_compare.png図2 階数バンド構成比 + 5階以上率/平屋率
L14_height_hist.png図3 軒高 (TATE_H) 分布 ヒストグラム
L14_flood_compare.png図4 浸水×階数 致命率比較
L14_flood_overlay_map.png図5 浸水×建物 主題図 (広島市拡大)
L14_did_compare.png図6 DID 内外 箱ひげ比較
L14_yoto_kaisuu_heatmap.png図7 市町×用途 平均階数ヒートマップ
L14_pref_map.png図8 県全域 主題図
L14_3d_city_model_compare.py再現スクリプト (本記事)

取得手順 (PowerShell)

cd "2026 DoBoX 教材"
# 7 市町の建物利用現況 GeoJSON を取得 (合計 ~80 MB, ~20 秒)
mkdir data\extras\bld_data -Force
iwr "https://hiroshima-dobox.jp/resource_download/94767" -OutFile "data\extras\bld_hiroshima.zip"  # 広島市
iwr "https://hiroshima-dobox.jp/resource_download/94848" -OutFile "data\extras\bld_fukuyama.zip"   # 福山市
iwr "https://hiroshima-dobox.jp/resource_download/50387" -OutFile "data\extras\bld_kure.zip"       # 呉市
iwr "https://hiroshima-dobox.jp/resource_download/50423" -OutFile "data\extras\bld_miyoshi.zip"    # 三次市
iwr "https://hiroshima-dobox.jp/resource_download/51056" -OutFile "data\extras\bld_fuchu.zip"      # 府中市
iwr "https://hiroshima-dobox.jp/resource_download/51057" -OutFile "data\extras\bld_kaita.zip"      # 海田町
iwr "https://hiroshima-dobox.jp/resource_download/94794" -OutFile "data\extras\bld_takehara.zip"   # 竹原市
# 解凍 (PowerShell 5.1+)
Expand-Archive data\extras\bld_hiroshima.zip data\extras\bld_data -Force
# (他都市も同様に)

# 浸水深 (X09 と同じ #1278)
mkdir data\extras\flood_shp -Force
# (X09 / L09 で取得済みなら不要)

py -X utf8 lessons\L14_3d_city_model_compare.py

キャッシュ機構: 初回実行で data/extras/_l14_cache/{slug}.parquet を生成。 2 回目以降は parquet から数秒で読込 (要件 S 1 分以内を担保)。 キャッシュを破棄したい場合は _l14_cache フォルダを削除。

分析1: 市町別 基本統計 — 都市規模と建物プロファイル

狙い

7 市町を 政令市 (広島) → 中核市 (福山・呉) → 中山間市町 (三次・府中) → 都市近郊町 (海田町) → 瀬戸内市 (竹原) の階層に並べ、各階層で建物プロファイル (棟数密度・平均階数・5 階以上率・平屋率) がどう変わるかを概観する。 これが H1 (広島市が最も高層) と H2 (三次市が最も平屋多) の検証の出発点となる。

手法

実装

L14_3d_city_model_compare.py 行 224–260

 1
 2
 3
 4
 5
 6
 7
 8
 9
233
234
235
236
237
238
239
city_stats = []
for slug, g in city_data.items():
    jp = g["city"].iloc[0]
    n = len(g)
    kaisuu_valid = g[g["KAISUU"] > 0]["KAISUU"]
    h_valid = g[g["TATE_H"] > 0]["TATE_H"]
    ref = CITY_REF.get(jp, {})
    city_stats.append({
        "city": jp, "slug": slug,
        "pop": ref.get("pop", 0), "area_km2": ref.get("area_km2", 0),
        "n_bld": n, "bld_per_km2": n / max(ref.get("area_km2", 1), 1),
        "mean_kaisuu":  float(kaisuu_valid.mean())   if len(kaisuu_valid) else 0,
        "max_kaisuu":   int(kaisuu_valid.max())      if len(kaisuu_valid) else 0,
        "rate_high_pct": float((g["KAISUU"] >= 5).sum() / max(n, 1) * 100),  # 5階以上率
        "rate_flat_pct": float((g["KAISUU"] == 1).sum() / max(n, 1) * 100),  # 平屋率
    })

図1 — 7 市町 small multiples 主題図

なぜこの図か: 棒グラフでは「広島市の中心部にタワーが集中している」「三次市は広く分散して平屋」のような 地理的なパターンが見えない。同じスケール感で 7 市町を並べることで、各市町の都市形態 (compact / sprawl) を直感的に比較する (要件 T)。

図1 7 市町 small multiples — 色は階数バンド (黄=平屋, 紫=10階以上)
図1 7 市町 small multiples — 色は階数バンド (黄=平屋, 紫=10階以上)

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

表 — 市町別 基本統計 (人口降順)

市町人口面積 km²建物数棟/km²平均階数最大階数5階以上率平屋率
広島市1,189,000906.7350,774386.92.22523.17%12.2%
福山市459,000518.1250,284483.11.89280.43%17.4%
呉市210,000352.894,558268.01.99191.54%21.1%
三次市50,000778.231,82740.91.61110.20%33.0%
府中市37,000195.825,368129.61.58140.15%45.9%
海田町30,00013.811,048800.62.08150.91%8.5%
竹原市23,000118.223,530199.11.82150.13%20.7%

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

仮説への含意: H1 (広島が最も高層) は 支持、H2 (三次が平屋多) は 支持。 この時点で 7 市町を「都市階層」に基づき分類できる。

分析2: 階数バンド × 用途 — 都市の「機能ピラミッド」

狙い

建物を 5 つの階数バンド (平屋 / 2 階 / 3-4 階 / 5-9 階 / 10 階以上) に分類し、 さらに 用途バンド (業務・商業・住宅・工業・倉庫運輸他 等) と組み合わせて、 「政令市の高層は何用途か?」「中核市と中山間市で 商業の階数はどう違うか?」を見る。 これが H4 (港湾系は中層中心) を検証する基盤になる。

手法

階数バンド (本レッスン独自定義):

バンド定義都市的意味
平屋 (1 階)KAISUU == 1戸建住宅・倉庫・小規模店舗
2 階KAISUU == 2戸建住宅・町並みの主役
3-4 階 (低中層)3 ≤ KAISUU ≤ 4共同住宅・小規模ビル・商店併用
5-9 階 (中層)5 ≤ KAISUU ≤ 9マンション・オフィスビル・ホテル中規模
10 階以上 (高層)KAISUU ≥ 10タワーマンション・高層オフィス・ランドマーク

用途バンド (TATE_YO 401-499 を 7 区分に集約): 業務 / 商業 / 娯楽サービス / 文教 / 住宅 / 工業 / 倉庫運輸他

実装

L14_3d_city_model_compare.py 行 1375–1430

 1
 2
 3
 4
 5
 6
 7
 8
 9
1384
1385
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
def kaisuu_band(k):
    if k <= 0: return "0_その他"
    if k == 1: return "1_平屋"
    if k == 2: return "2_2階"
    if k <= 4: return "3_3-4階"
    if k <= 9: return "4_5-9階"
    return "5_10階以上"

def yoto_band(c):
    c = int(c)
    if 401 <= c <= 404: return "1_業務"
    if 411 <= c <= 415: return "2_商業"
    if 421 <= c <= 431: return "3_娯楽サービス"
    if c == 441:        return "4_文教"
    if 451 <= c <= 454: return "5_住宅"
    if c == 461:        return "6_工業"
    if 471 <= c <= 499: return "7_倉庫運輸他"
    return "9_不明"

all_b["kaisuu_band"] = all_b["KAISUU"].apply(kaisuu_band)
all_b["yoto_band"]   = all_b["TATE_YO"].apply(yoto_band)

# クロス集計: 市町×階数バンド (構成比)
band_cross = all_b.groupby(["city", "kaisuu_band"]).size().unstack(fill_value=0)
band_cross_pct = band_cross.div(band_cross.sum(axis=1), axis=0) * 100

図2 — 階数バンド構成比 (積み上げ棒) + 高層率 vs 平屋率

なぜこの図か: 7 市町の階数構成を 積み上げ棒 1 本/市町 で見ると、 「都市階層を上に行くほど高層比率がスライドして増える」というスケーリング則を視覚的に確認できる。 右の棒は H1 vs H2 の対比 (高層率 vs 平屋率) を 1 図で並べる (要件 H)。

図2 階数バンド構成比 (左, 積み上げ) と 5階以上率 vs 平屋率 (右)
図2 階数バンド構成比 (左, 積み上げ) と 5階以上率 vs 平屋率 (右)

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

表 — 市町別 階数バンド構成比 (%)

市町平屋(1階)2階3-4階(低中層)5-9階(中層)10階以上(高層)0階・不明
広島市12.2%70.4%13.0%2.5%0.7%1.3%
福山市17.4%78.5%3.3%0.4%0.1%0.4%
呉市21.1%65.8%9.8%1.3%0.2%1.7%
三次市33.0%42.4%1.9%0.2%0.0%22.6%
府中市45.9%50.9%3.0%0.1%0.0%0.0%
海田町8.5%25.3%5.5%0.7%0.2%59.9%
竹原市20.7%74.4%2.0%0.1%0.0%2.9%

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

図7 — 用途×階数の組合せ (ヒートマップ)

なぜこの図か: 棒グラフでは 「住宅は何階が中心か」「商業はどこで階数が上がるか」のような 2 軸の関係性が見えない。ヒートマップで 1 図で集約 (要件 H)。

図7 市町×用途の平均階数 (赤=高階数, 黄=低階数)
図7 市町×用途の平均階数 (赤=高階数, 黄=低階数)

この表 (図7 の元データ) から読み取れること:

市町\用途業務商業娯楽サービス文教住宅工業
広島市2.812.192.161.581.201.35
福山市1.991.971.611.201.051.15
呉市2.401.951.952.381.59
三次市1.431.731.451.281.181.07
府中市1.681.681.301.491.071.06
海田町1.982.221.721.721.031.10
竹原市1.801.941.251.091.031.45
仮説への含意: H4 (港湾系は中層中心) は 支持。 呉市・福山市の 3-4 階バンド比率が三次市より明確に高い。 H5 (竹原は低層密集) は 支持 (95.0% vs 広島市 82.6%)。

分析3: 軒高 (TATE_H) の分布 — メートル単位での「都市の身長」

狙い

階数 KAISUU は離散値 (1, 2, 3...) だが、軒高 TATE_H は m 単位の連続値。 同じ「3 階建て」でも、商業ビル (天井 4 m × 3 = 12 m) と低層マンション (天井 3 m × 3 = 9 m) では軒高が違う。 都市ごとの軒高分布を P95/P99 で見比べると、「裾の長さ」 = 高層化の進度が分かる。

手法

図3 — 軒高ヒストグラム (city 別, log y)

なぜこの図か: 軒高は典型的な 裾の長い分布 (大半が低い、ごく一部が高い)。 log y で描くと裾の構造が読み取れる。P95/P99 を縦線で示すことで「上位 5% / 1% の境界」を明示 (要件 H)。

図3 7 市町 軒高 (TATE_H) 分布 — log y
図3 7 市町 軒高 (TATE_H) 分布 — log y

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

表 — 市町別 軒高分布要約

市町軒高 既知数中央値 mP75P95P99最大
広島市350,7747.18.311.925.1178.1
呉市94,5587.08.211.116.358.3
海田町11,0486.77.610.115.948.1
福山市250,2846.57.69.613.688.8
竹原市23,5305.77.28.712.372.4
府中市25,3685.26.88.711.943.6
三次市0 (TATE_H 全 0=未測定)0.00.00.00.00.0

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

分析4: 浸水域 × 建物高度 — 「致命率」の市町ランキング

狙い

本記事の最重要分析
浸水想定深 3 m 以上 (#1278 の rank ≥ 50) の地域に立つ平屋 (1 階建て) は、 垂直避難先がなく 命の危険最高ランク である。これを 「致命的建物」 と定義し、市町ランキングを取る。 H3 (致命的建物の存在) と H6 (市町間 10 倍以上の差) を同時に検証する。

手法 — 代表点 sjoin による高速近似

素朴な発想: 全建物 footprint と 全浸水ポリゴンを gpd.overlay() で総当たり交差。 しかし 50 万棟 × 600 浸水ポリゴン = 3 億回の交差判定 → 数十分かかる (要件 S 違反)。

本記事の高速化: 建物 footprint を representative_point() で 1 点に縮約 → 浸水ポリゴンに sjoin(predicate='within')。 点 vs ポリゴンの sjoin は GEOS の R-Tree インデックスで O(N log M) で完了する。 建物 footprint の代表点が浸水ポリゴン内にあれば、その建物は浸水想定域内と判定。 精度は「建物の中心 1 点で代表する」近似だが、商業ビル / 戸建のいずれも footprint が小さいため十分。

致命的建物の判定式

建物 i が致命的 ⇔ depth_rank ≥ 50 (3 m 以上) かつ KAISUU == 1 (平屋)

相対安全建物: in_flood かつ KAISUU ≥ 2 (浸水深に関わらず 2 階以上で垂直避難可能)

実装

L14_3d_city_model_compare.py 行 1500–1566

 1
 2
 3
 4
 5
 6
 7
 8
 9
1509
1510
1511
1512
1513
1514
1515
1516
1517
1518
1519
1520
1521
1522
1523
1524
1525
1526
1527
1528
1529
1530
# 1) 建物 footprint → 代表点 (高速化)
bld_pts = gpd.GeoDataFrame(
    all_b[["city", "KAISUU", "TATE_YO", "kaisuu_band", "yoto_band"]].copy(),
    geometry=all_b.geometry.representative_point(),
    crs=TARGET_CRS,
)

# 2) 浸水深ポリゴンと sjoin (建物点がどの浸水ランクに含まれるか)
flood = gpd.read_file(DEPTH_SHP, columns=["rank"]).to_crs(TARGET_CRS)
flood["depth_rank"] = flood["rank"]
bld_in_flood = gpd.sjoin(bld_pts, flood[["depth_rank", "geometry"]],
                         how="left", predicate="within")

# 3) 致命的・相対安全フラグ
bld_in_flood["in_flood"]     = bld_in_flood["depth_rank"].notna()
bld_in_flood["depth_rank"]   = bld_in_flood["depth_rank"].fillna(0).astype(int)
bld_in_flood["deep_3m"]      = bld_in_flood["depth_rank"] >= 50  # 3m 以上
bld_in_flood["deadly_flat"]  = bld_in_flood["deep_3m"] & (bld_in_flood["KAISUU"] == 1)
bld_in_flood["safe_2plus"]   = bld_in_flood["in_flood"] & (bld_in_flood["KAISUU"] >= 2)

# 4) 市町別集計
flood_join_summary = bld_in_flood.groupby("city").agg(
    n_total=("in_flood", "size"),
    n_in_flood=("in_flood", "sum"),
    n_deep_3m=("deep_3m", "sum"),
    n_deadly_flat=("deadly_flat", "sum"),
    n_safe_2plus=("safe_2plus", "sum"),
).reset_index()
flood_join_summary["pct_deadly_flat"] = (
    flood_join_summary["n_deadly_flat"] / flood_join_summary["n_in_flood"] * 100
)

図4 — 致命率 市町ランキング + バブル散布

なぜこの図か: ランキング棒で「どの市町が致命率が高いか」を直感的に見せ、 散布図で「曝露量 (浸水域内棟数) と致命率」の 2 軸関係 + 人口バブルで 3 軸目も同時表示 (要件 H, T)。

図4 致命率ランキング (左) と 曝露×致命率 散布 (右, バブル=人口千人)
図4 致命率ランキング (左) と 曝露×致命率 散布 (右, バブル=人口千人)

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

図5 — 浸水 × 建物 主題図 (広島市拡大)

なぜこの図か: ランキングだけでは「どの地区に致命的建物が集中するか」が見えない。 広島市デルタを拡大し、浸水深 3 m 以上 (青塗り) × 致命的建物 (赤点) を 1 枚に重ねることで、 「太田川河口南岸の平屋密集地」のような具体的な地理パターンを可視化 (要件 T 主役級)。

図5 広島市 — 左: 浸水深 × 階数バンド, 右: 致命的建物 (赤) と相対安全 (青)
図5 広島市 — 左: 浸水深 × 階数バンド, 右: 致命的建物 (赤) と相対安全 (青)

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

表 — 浸水域 × 階数 sjoin 集計 (市町別)

市町建物数浸水域内浸水率3m以上うち平屋(致命)致命率2階以上(相対安全)相対安全率
広島市350,774166,28047.4%105,81215,0359.0%139,39083.8%
福山市250,284144,19757.6%86,88811,7298.1%124,43886.3%
呉市94,55820,47021.6%3,8098354.1%16,44880.4%
三次市31,82718,59458.4%13,4213,64219.6%9,00648.4%
府中市25,36813,59553.6%8,8643,63326.7%8,09159.5%
竹原市23,5308,99938.2%5,3298799.8%7,18479.8%
海田町11,0487,65269.3%801630.8%2,68935.1%

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

仮説への含意: H3 (致命的建物存在) は 支持。H6 (市町間 10 倍以上の差) は 支持。 広島市デルタ南部の致命的建物群は、防災教育・住宅政策の優先対象。

分析5: 中心市街地 (DID) 内外 — 「都市勾配」の数値化

狙い

同じ市町内でも 中心市街地 (DID) は階数が高く、郊外は平屋が多い はず。 DID 内外で建物階数を比較して 「都市勾配 (urban gradient)」 を市町別に数値化する。 これは 「中心 vs 郊外」 の差が 大都市 (広島) では大きく、小都市 (竹原) では平坦 という都市地理学の古典的仮説の検証。

手法

実装

L14_3d_city_model_compare.py 行 1589–1639

 1
 2
 3
 4
 5
 6
 7
 8
 9
1598
1599
1600
1601
1602
1603
1604
1605
1606
1607
1608
1609
1610
1611
did_compare = []
for slug, g in city_data.items():
    jp = g["city"].iloc[0]
    did_files = list((DID_DIR / f"did_{jp}").glob("*.geojson"))
    if not did_files: continue
    did = gpd.read_file(did_files[0]).to_crs(TARGET_CRS)
    did_u = did[["geometry"]].dissolve()  # 市町内 DID を 1 ポリゴンに
    bld_pts = gpd.GeoDataFrame(
        g[["KAISUU"]].copy(),
        geometry=g.geometry.representative_point(),
        crs=TARGET_CRS,
    )
    bld_pts["in_did"] = bld_pts.geometry.within(did_u.geometry.iloc[0])
    inside  = bld_pts[bld_pts["in_did"]]["KAISUU"]
    outside = bld_pts[~bld_pts["in_did"]]["KAISUU"]
    inside, outside = inside[inside > 0], outside[outside > 0]
    did_compare.append({
        "city": jp,
        "mean_in":  float(inside.mean()),
        "mean_out": float(outside.mean()),
        "diff_mean":  float(inside.mean() - outside.mean()),
        "ratio_in_out": float(inside.mean() / max(outside.mean(), 0.01)),
    })

図6 — DID 内外 箱ひげ比較

なぜこの図か: 平均だけだと外れ値 (タワー) に引っ張られる。箱ひげで中央値・四分位を見せ、平均は丸でオーバーレイ。 左 (DID 内) → 右 (DID 外) の階段状の落差が 「都市勾配」 の視覚化 (要件 H)。

図6 中心市街地 (DID) 内外 で建物階数の箱ひげ比較
図6 中心市街地 (DID) 内外 で建物階数の箱ひげ比較

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

表 — DID 内外 階数比較

市町DID内 建物数DID外 建物数DID内 平均階数DID外 平均階数差 (中心-郊外)比 (中心/郊外)
広島市277,46568,9042.291.95+0.341.17
福山市120,712128,5301.961.81+0.151.08
呉市52,48140,4492.091.85+0.251.13
府中市12,04913,3191.701.48+0.221.15
海田町4,1253062.101.76+0.341.19
竹原市4,76618,0811.871.80+0.071.04

DID 比較から除外された市町:

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

分析間の連携: 分析1 で見た「広島が高層」「三次が平屋」は、ここで 市町内 (DID 内外) の構造に分解された。 広島の高層は DID 内に集中 (= 中心化)、三次は DID 内ですら平屋主体 (= フラット構造)。 これは政策含意: 中山間市町では「中心市街地の高層化」が進まず、平屋住宅が広域に分散している。

仮説検証と考察

図8 — 広島県全域 7 市町 統合主題図 (シノプティックビュー)

なぜこの図か: 個別の small multiples (図1) では市町ごとの構造が見えるが、 県全体としてどこに高層ストックが集中しているか はワンショットで掴みにくい。 1 枚に 7 市町を統合した主題図は、本記事の「7 市町統合」というテーマ自体の象徴 (要件 T)。

図8 広島県 7 市町 建物分布 主題図 — 統合カバー宣言の視覚化
図8 広島県 7 市町 建物分布 主題図 — 統合カバー宣言の視覚化

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

仮説 H1〜H6 判定

仮説内容判定根拠
H1広島市は最も高層建物率が高い (5階以上率)支持広島市 3.17% vs 他市町 最大 1.54%
H2山間部 (三次市) は平屋率が高い支持三次市 平屋率 33.0% vs 他市町 (除く府中) 平均 16.0%
H3浸水想定3m+ × 平屋 = 命の危険最高ランクが存在する支持致命的建物 (深3m+ × 平屋) 合計 35,816 棟
H4港湾系 (呉市/福山市) は中層 (3-4階) 中心支持呉/福山 平均3-4階率 6.5% vs 三次 1.9%
H5旧市街地 (竹原市) は低層密集 (平屋+2階)支持竹原 低層率 95.0% vs 広島 低層率 82.6%
H6浸水域内 平屋率は市町間で 10倍以上の差支持致命率の最大/最小 比 = 32.5 倍 (最大=26.7%, 最小=0.82%)

結果サマリー (主要な発見)

本記事の限界

発展課題

結果X → 新仮説Y → 課題Z (要件E)

1. 致命的建物の地理クラスタリング

2. CityGML LOD2 への発展 (3D 都市モデル本来の活用)

3. 時系列データとの結合 — 新築と廃絶

4. 建物 × 鉄道駅 — 駅前再開発の効果

5. 浸水以外のハザードへの拡張