Lesson 28

都市機能誘導区域 9件 統合分析 — L19との入れ子と拠点ネットワーク型コンパクトシティの幾何実証

L28都市機能誘導立地適正化計画拠点ネットワーク型コンパクトシティL19比較GeoJSONgeopandas
所要 20 分 / 想定レベル: 中級〜上級 (geopandas + 幾何 intersection) / データ: 9 GeoJSON (L28: 8市別 + 県全域 1) + L19 比較 + L15 行政背景

データ取得手順

このスクリプトは初回実行時にデータを自動取得します(DoBoX からの直接ダウンロード)。

IDデータセット名
#444dataset #444
#795都市計画区域情報_区域データ_広島市_居住誘導区域
#796都市計画区域情報_区域データ_広島市_都市機能誘導区域
#805都市計画区域情報_区域データ_呉市_居住誘導区域
#806都市計画区域情報_区域データ_呉市_都市機能誘導区域
#812都市計画区域情報_区域データ_竹原市_居住誘導区域
#813都市計画区域情報_区域データ_竹原市_都市機能誘導区域
#822都市計画区域情報_区域データ_三原市_居住誘導区域
#823都市計画区域情報_区域データ_三原市_都市機能誘導区域
#838都市計画区域情報_区域データ_福山市_居住誘導区域
#839都市計画区域情報_区域データ_福山市_都市機能誘導区域
#848都市計画区域情報_区域データ_府中市_居住誘導区域
#849都市計画区域情報_区域データ_府中市_都市機能誘導区域
#876都市計画区域情報_区域データ_東広島市_居住誘導区域
#877都市計画区域情報_区域データ_東広島市_都市機能誘導区域
#886都市計画区域情報_区域データ_廿日市市_居住誘導区域
#887都市計画区域情報_区域データ_廿日市市_都市機能誘導区域
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#933都市計画区域情報_区域データ_広島県_居住誘導区域
#934都市計画区域情報_区域データ_広島県_都市機能誘導区域

実行コマンド:

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

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

1. 学習目標と問い

本レッスンは、広島県オープンデータポータル DoBoX の 「都市計画区域情報_区域データ_都市機能誘導区域」シリーズ 9 件 (立地適正化計画 LIP 策定済 8 市 + 県全域 1) を統合し、 「拠点ネットワーク型コンパクトシティ」の核 = 都市機能誘導区域 の幾何実装を解読する研究記事です。

研究問い (RQ)
広島県の L19 居住誘導区域シリーズ (jukyo_*) と本記事の L28 都市機能誘導区域シリーズ (toshikinou_*) は、 各市町で +1 ずれの隣接 dataset_id として別々に提供されている。 両シリーズはどう異なるのか? L28 はファイル名通り「都市機能誘導区域 (KUIKI=3) のみ」を含むのか、 それとも L19 と同じ列構造で別の切り出しを与えるデータなのか?
そして広島県 8 LIP 策定市の都市機能誘導区域は、 立地適正化計画の理論モデル「居住誘導 ⊃ 都市機能誘導の二重入れ子」を 幾何学的に満たしているか?

独自用語の定義 (要件 M)

仮説 H1〜H5 (要件 D)

到達点

  1. 9 GeoJSON (8 市別 + 県全域) を 1 個の GeoDataFrame に統合する手法
  2. 同じ KUIKI_CD でも別シリーズで内容が違う事実を実データから読み出す方法
  3. geometry.intersection による L28 ⊆ L19 包含関係の幾何的実証
  4. 都市機能誘導 拠点間距離・拠点と居住誘導の最短距離の計量で 「拠点ネットワーク型コンパクトシティ」の幾何整合性を検証する手法
  5. 整合性検証: 8 市別 8 ファイルと県全域 ds=934 の同一性確認
  6. 図 10 種・表 9 種で都市機能誘導構造を多角的に提示 (要件 Q)
注: 本記事と L19 の関係 (合体ではなく 並列・互補)
本記事 L28 は「都市機能誘導区域シリーズ」9 件を独立した分析対象とする。 L19 (居住誘導区域シリーズ 9 件) とは別 dataset_idで提供されているため、 DoBoX のシリーズ単位の分析として完結している。
L19 を背景レイヤとして比較・参照することで、 両シリーズの「実態の違い」を読み解く ─ 合体ではなく並列の研究
- L13/L15/L16/L17/L18: 別軸
- L19: 居住誘導区域シリーズ (本記事の比較対象, 直接の関連記事)
- L20以降: 新築/開発/人口/DID/農地/施策/区域外 — 別軸

2. 使用データ

本記事で使う 9 dataset_id は、DoBoX で「都市計画区域情報」配下「区域データ」配下の 都市機能誘導区域シリーズ列構造が 9 件すべて L19 と同型(FID/TOKEI_CD/CITY_CD/KUIKI_CD/RITTEKI_CD/geometry の 6 列) なので pd.concat で単純縦結合できる。
本記事の核心の問いは、L19 と L28 が同じ列構造で別の dataset_id で提供されている理由を実データから解読すること。つまり「同じ KUIKI_CD でも L28 と L19 で異なる範囲のポリゴンが格納されている」事実を発見する。

データ仕様と KUIKI_CD 凡例

項目
シリーズ都市計画区域情報_区域データ_都市機能誘導区域
件数9 dataset_id (LIP 策定 8 市 + 広島県全域 1)
形式GeoJSON (ZIP 内同梱)
CRSEPSG:6671 (JGD2011 平面直角第III系) ※全 9 件で統一
列構造FID, TOKEI_CD, CITY_CD, KUIKI_CD, RITTEKI_CD, geometry6 列、L19 と完全同型
KUIKI_CD5 値 (0/1/2/3/4) — L19 と意味体系が同じ
合計ポリゴン数 (8 市別)1150 (内訳: 居住誘導 165, 都市機能 14, 線/その他 971)
合計ポリゴン数 (県全域 ds=934)1150
L19 隣接 dsid との関係各市町で L28 dsid = L19 dsid + 1 の連番関係

KUIKI_CD 凡例 (L19 と同じ 5 値; 同じ KUIKI_CD でも L28/L19 で内容が異なる)

KUIKI_CD名称カラー意味 (L28 内での実態)
0その他/非誘導  誘導指定外の参考エリア
1居住誘導区域  近接居住誘導 (L19 の居住誘導の都市機能拠点近接サブセット)
2居住誘導 境界線  居住誘導の境界線 (線データ; 実空間ほぼ 0 km²)
3都市機能誘導区域  都市機能誘導区域 (本記事の主役 ─ コンパクトシティの核)
4都市機能誘導 境界線  都市機能誘導の境界線 (線データ; 実空間ほぼ 0 km²)

9 GeoJSON (LIP 策定 8 市 + 県全域) 一覧

市町タイプ L28 dsidL19 dsid (隣接) polys 数備考
広島市政令市DoBoX #796DoBoX #795678toshikinou_796_広島市.zip
呉市中核市DoBoX #806DoBoX #80553toshikinou_806_呉市.zip
竹原市DoBoX #813DoBoX #81230toshikinou_813_竹原市.zip
三原市DoBoX #823DoBoX #82215toshikinou_823_三原市.zip
福山市中核市DoBoX #839DoBoX #838136toshikinou_839_福山市.zip
府中市DoBoX #849DoBoX #8487toshikinou_849_府中市.zip
東広島市施行時特例市DoBoX #877DoBoX #876219toshikinou_877_東広島市.zip
廿日市市DoBoX #887DoBoX #88612toshikinou_887_廿日市市.zip
広島県(全域)DoBoX #934DoBoX #9331150整合性検証用 (8 市の集約版)

3. ダウンロード

本記事の再現性を担保するため、HTML 1 枚から 生データ・中間 CSV・図 PNG・再現 Python を直リンクで取得できるようにしてある。

(1) 生データ ZIP (DoBoX 直)

9 件の ZIP は前項の表からそれぞれ DoBoX へリンクしている。 あるいは一括取得スクリプトを使う:

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L28_urban_function_induction\fetch_urban_function_induction.py

(2) 中間 CSV (本スクリプトの出力)

(3) 図 PNG (本記事掲載)

(4) 再現用 Python スクリプト

実行は cd "2026 DoBoX 教材"; py -X utf8 lessons\L28_urban_function_induction.py。 9 ZIP がローカルにあれば 1 分以内で全図 + CSV 再生成 (要件 S 準拠)。 ZIP が無い場合は事前に fetch_urban_function_induction.py を実行。

4. 分析1: 9 GeoJSON + L19 隣接 dsid 比較データの統合

狙い: L28 シリーズの 9 GeoJSON を 1 個の GeoDataFrame に統合し、 さらに L19 シリーズの同じ 8 市分を比較用に並べて読み込む。 両者の dataset_id ペア (L28=L19+1) を 1 つのループで扱う。

実装の要点:

L28_urban_function_induction.py 行 1453–1613

 1
 2
 3
 4
 5
 6
 7
 8
 9
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
1475
1476
1477
1478
1479
1480
1481
1482
1483
1484
1485
1486
1487
1488
1489
1490
1491
1492
1493
DATA_DIR = ROOT / "data" / "extras" / "L28_urban_function_induction"
DATA_DIR_L19 = ROOT / "data" / "extras" / "L19_residential_induction"
TARGET_CRS = "EPSG:6671"  # JGD2011 平面直角 III, m 単位

# (L28 dsid, L19 dsid, 市町, タイプ, 行政_dsid)
LIP_CITY_DEFS = [
    (796, 795, "広島市",   "政令市",       786),
    (806, 805, "呉市",     "中核市",       797),
    (813, 812, "竹原市",   "市",           807),
    (823, 822, "三原市",   "市",           814),
    (839, 838, "福山市",   "中核市",       832),
    (849, 848, "府中市",   "市",           840),
    (877, 876, "東広島市", "施行時特例市", 868),
    (887, 886, "廿日市市", "市",           878),
]

def load_geojson_zip(zip_path):
    """ZIP 内の単一 .geojson を BytesIO で読む (一時ファイル不要)"""
    import io, zipfile
    with zipfile.ZipFile(zip_path) as zf:
        gjs = [n for n in zf.namelist() if n.lower().endswith(".geojson")]
        with zf.open(gjs[0]) as f:
            return gpd.read_file(io.BytesIO(f.read()))

# L28: 8 市別 + L19: 同 8 市別 (隣接 dsid のペアで取得)
l28_frames, l19_frames = [], []
for ds28, ds19, name, ctype, _ in LIP_CITY_DEFS:
    g28 = load_geojson_zip(DATA_DIR / f"toshikinou_{ds28}_{name}.zip")
    g28["source_city"] = name; g28["ctype"] = ctype
    l28_frames.append(g28)
    g19 = load_geojson_zip(DATA_DIR_L19 / f"jukyo_{ds19}_{name}.zip")
    g19["source_city"] = name; g19["ctype"] = ctype
    l19_frames.append(g19)

l28 = gpd.GeoDataFrame(pd.concat(l28_frames, ignore_index=True),
                       geometry="geometry", crs=l28_frames[0].crs).to_crs(TARGET_CRS)
l19 = gpd.GeoDataFrame(pd.concat(l19_frames, ignore_index=True),
                       geometry="geometry", crs=l19_frames[0].crs).to_crs(TARGET_CRS)

l28["poly_area_km2"] = l28.geometry.area / 1e6
l19["poly_area_km2"] = l19.geometry.area / 1e6

結果: L28 統合 = 1150 ポリゴン (8 市別)、 L19 統合 = 9752 ポリゴン (8 市別の比較用)、 県全域 L28 ds=934 = 1150 ポリゴン
8 市の行政面積合計 = 3783 km² (LIP 策定 8 市)。

5. 分析2: KUIKI_CD 別構造 (L28 vs L19 比較)

狙い: 「L28 と L19 は同じ列構造で別の dataset_idとして提供されている」という事実を、 KUIKI_CD 別に L28/L19 の polys 数・面積を横並び比較し、両者の関係を解読する。

実装の要点:

L28_urban_function_induction.py 行 232–292

 1
 2
 3
 4
 5
 6
 7
 8
 9
 241
 242
 243
 244
 245
 246
 247
 248
 249
 250
 251
 252
 253
 254
 255
 256
 257
 258
def kuiki_agg(gdf, src_label):
    rows = []
    for name in LIP_CITY_ORDER:
        sub = gdf[gdf["source_city"] == name]
        for k in sorted(sub["KUIKI_CD"].unique()):
            sub_k = sub[sub["KUIKI_CD"] == k]
            rows.append({
                "src": src_label, "city": name, "KUIKI_CD": int(k),
                "n_polys": int(len(sub_k)),
                "area_km2": float(sub_k["poly_area_km2"].sum()),
            })
    return pd.DataFrame(rows)

l28_agg = kuiki_agg(l28, "L28 (toshikinou_*)")
l19_agg = kuiki_agg(l19, "L19 (jukyo_*)")

# L28 / L19 の同 KUIKI を横並びで比較
side_by_side = []
for name in LIP_CITY_ORDER:
    for k in [0, 1, 2, 3, 4]:
        a28 = l28_agg.query("city == @name & KUIKI_CD == @k")["area_km2"].sum()
        a19 = l19_agg.query("city == @name & KUIKI_CD == @k")["area_km2"].sum()
        side_by_side.append({
            "city": name, "KUIKI_CD": k,
            "L28_area_km2": a28, "L19_area_km2": a19,
            "L28_div_L19_pct": a28/a19*100 if a19 > 0 else None,
        })

なぜこの図か (要件 H)

L28/L19 の面積比を「同じ KUIKI_CD でも何が違うか」の核心指標として、 横棒比較 + 集計棒で 2 視点から見せる。 比率の偏りが「L28 = L19 のサブセット」という主結論を直感的に伝える。

L28 vs L19 KUIKI=1 面積比較 (8 市横棒) + KUIKI 別総和棒
L28 vs L19 KUIKI=1 面積比較 (8 市横棒) + KUIKI 別総和棒

この図から読み取れること (要件 F):

表 1: L28 / L19 全体集計 (要件 G)

KUIKI_CD類型 L28 8市計 polysL28 8市計 面積 km² L19 8市計 polysL19 8市計 面積 km² L28/L19 面積比
0その他/非誘導440.0031660.003119.6%
1居住誘導区域165106.198563285.01437.3%
2居住誘導 境界線8690.03484800.3709.2%
3都市機能誘導区域143.6633111.99130.5%
4都市機能誘導 境界線580.2185120.33565.1%

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

表 2: 市町×KUIKI 横並び (要件 G, 一部抜粋)

市町KUIKIL28 polysL19 polys L28 km²L19 km²L28/L19 %
広島市0 (その他/非誘導)21790.00170.00006535.6%
広島市1 (居住誘導区域)11547159.8252145.698341.1%
広島市2 (居住誘導 境界線)54239350.00670.0009754.7%
呉市0 (その他/非誘導)10100.00010.000198.4%
呉市1 (居住誘導区域)11158.379414.834456.5%
呉市2 (居住誘導 境界線)10180.00020.000389.6%
呉市3 (都市機能誘導区域)460.99361.477867.2%
呉市4 (都市機能誘導 境界線)18200.21630.320367.5%
竹原市3 (都市機能誘導区域)471.79523.290054.6%
竹原市4 (都市機能誘導 境界線)261180.00030.002214.0%
三原市0 (その他/非誘導)8230.00120.002255.0%
三原市1 (居住誘導区域)191.05376.427516.4%
三原市2 (居住誘導 境界線)01140.00000.03370.0%
三原市3 (都市機能誘導区域)180.35301.738020.3%
三原市4 (都市機能誘導 境界線)5450.00130.012110.8%
福山市0 (その他/非誘導)5100.00020.000356.5%
福山市1 (居住誘導区域)204730.592873.186741.8%
福山市2 (居住誘導 境界線)11122730.02180.31117.0%
府中市1 (居住誘導区域)131.78405.533032.2%
府中市2 (居住誘導 境界線)6310.00520.023122.3%
東広島市0 (その他/非誘導)0440.00000.00000.0%
東広島市1 (居住誘導区域)9153.227220.569415.7%
東広島市2 (居住誘導 境界線)20021040.00020.000535.8%
東広島市3 (都市機能誘導区域)280.30963.94727.8%
東広島市4 (都市機能誘導 境界線)83280.00000.000016.2%
廿日市市1 (居住誘導区域)831.335818.76497.1%
廿日市市2 (居住誘導 境界線)050.00000.00000.0%
廿日市市3 (都市機能誘導区域)320.21191.538413.8%
廿日市市4 (都市機能誘導 境界線)110.00000.0000199.0%

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

6. 分析3: L28 ⊆ L19 入れ子の幾何検証

狙い: L28 シリーズの KUIKI=1 (居住誘導) ポリゴンが、 L19 シリーズの KUIKI=1 (居住誘導) ポリゴンに完全に含まれているか (L28 ⊆ L19) を幾何 intersection で実証する。

手法 — geometry.intersection を使った包含検証:

実装コード

L28_urban_function_induction.py 行 285–330

 1
 2
 3
 4
 5
 6
 7
 8
 9
294
295
296
297
298
299
300
301
302
303
nest_rows = []
for ds28, ds19, name, ctype, _ in LIP_CITY_DEFS:
    g28_1 = l28[(l28["source_city"] == name) & (l28["KUIKI_CD"] == 1)]
    g19_1 = l19[(l19["source_city"] == name) & (l19["KUIKI_CD"] == 1)]
    if len(g28_1) == 0 or len(g19_1) == 0:
        continue
    # dissolve で複数ポリゴンを 1 つの幾何にまとめる
    g28_diss = g28_1.dissolve().geometry.iloc[0]
    g19_diss = g19_1.dissolve().geometry.iloc[0]
    a28 = g28_diss.area / 1e6
    a19 = g19_diss.area / 1e6
    inter = g28_diss.intersection(g19_diss).area / 1e6  # 共通部分
    outside = a28 - inter                                # L28 の L19 はみ出し部分
    pct_in = inter / a28 * 100                           # L28 が L19 にどれだけ入るか
    nest_rows.append({
        "city": name, "L28_K1_km2": a28, "L19_K1_km2": a19,
        "L28_in_L19_pct": pct_in,
        "L28_outside_L19_km2": outside,  # 0 ならサブセット
    })

なぜこの図か

(a) L19 全体 → (b) L28 切り出し → (c) 都市機能拠点ズーム の 3 段階で、 「L28 が L19 のサブセット」かつ「L28 KUIKI=3 が L28 KUIKI=1 内に位置する」二重入れ子を 1 図で見せる。廿日市市を例に選んだのは L19/L28 の差分が最も明瞭で、 かつ KUIKI=3 拠点 3 個が独立して見えるため。

廿日市市 — L28 ⊆ L19 入れ子と KUIKI=3 拠点クローズアップ
廿日市市 — L28 ⊆ L19 入れ子と KUIKI=3 拠点クローズアップ

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

包含率 choropleth (左) + L28 vs L19 KUIKI=1 面積散布 (右)
包含率 choropleth (左) + L28 vs L19 KUIKI=1 面積散布 (右)

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

表 3: L28 ⊆ L19 包含検証 (要件 G)

市町 L28 KUIKI=1 km²L19 KUIKI=1 km² L28 ∩ L19 / L28 (%) L28 \ L19 km² (はみ出し) 判定
広島市59.825145.69899.93%0.0413完全包含 (L28 ⊆ L19)
呉市8.37914.834100.00%0.0001完全包含 (L28 ⊆ L19)
竹原市0.0000.000N/A (両 0)0.0000
三原市1.0546.427100.00%0.0000完全包含 (L28 ⊆ L19)
福山市30.59373.187100.00%0.0001完全包含 (L28 ⊆ L19)
府中市1.7845.533100.00%0.0000完全包含 (L28 ⊆ L19)
東広島市3.22720.569100.00%0.0000完全包含 (L28 ⊆ L19)
廿日市市1.33618.76599.95%0.0007完全包含 (L28 ⊆ L19)

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

7. 分析4: 都市機能誘導 (KUIKI=3) 拠点の構造

狙い: 都市機能誘導区域 (KUIKI=3) の構造 ─ 拠点数・拠点総面積・拠点間平均距離・近接居住誘導との重なり ─ を 8 市で計量し、 「拠点ネットワーク型コンパクトシティ」の幾何実装を読み取る。

手法 — 拠点 (point) ベース距離指標:

実装コード

L28_urban_function_induction.py 行 1839–1928

 1
 2
 3
 4
 5
 6
 7
 8
 9
1848
1849
1850
1851
1852
1853
1854
1855
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
1870
1871
1872
1873
1874
1875
1876
1877
1878
1879
toshi_rows = []
for ds28, ds19, name, ctype, _ in LIP_CITY_DEFS:
    sub = l28[(l28["source_city"] == name) & (l28["KUIKI_CD"] == 3)]
    n_polys = len(sub)
    a_sum = float(sub["poly_area_km2"].sum())

    # 拠点間平均距離 (km) ─ 各 KUIKI=3 ポリゴンの representative_point 同士の距離
    pts = [pg.representative_point() for pg in sub.geometry]
    if len(pts) >= 2:
        dists = [pts[i].distance(pts[j]) / 1000
                 for i in range(len(pts)) for j in range(i + 1, len(pts))]
        avg_d = float(np.mean(dists))
    else:
        avg_d = np.nan

    g_k = sub.dissolve().geometry.iloc[0] if n_polys > 0 else None

    # 拠点と L28 KUIKI=1 (近接居住誘導) の距離・包含
    g_j_l28 = l28[(l28["source_city"] == name) &
                   (l28["KUIKI_CD"] == 1)].dissolve().geometry.iloc[0]
    inter_l28 = g_k.intersection(g_j_l28).area / 1e6
    pct_l28 = inter_l28 / (g_k.area / 1e6) * 100 if g_k.area > 0 else np.nan
    d_l28 = min(pg.distance(g_j_l28) / 1000 for pg in sub.geometry)

    # 拠点と L19 KUIKI=1 (居住誘導全体) の距離・包含 ─ 広域での検証
    g_j_l19 = l19[(l19["source_city"] == name) &
                   (l19["KUIKI_CD"] == 1)].dissolve().geometry.iloc[0]
    inter_l19 = g_k.intersection(g_j_l19).area / 1e6
    pct_l19 = inter_l19 / (g_k.area / 1e6) * 100 if g_k.area > 0 else np.nan
    d_l19 = min(pg.distance(g_j_l19) / 1000 for pg in sub.geometry)

    toshi_rows.append({
        "city": name, "ctype": ctype,
        "n_kinou_polys": n_polys, "kinou_area_km2": a_sum,
        "kinou_avg_pairwise_dist_km": avg_d,
        "kinou_min_dist_to_jukyo_l28_km": d_l28,
        "kinou_min_dist_to_jukyo_l19_km": d_l19,
        "kinou_in_jukyo_pct_l28": pct_l28,
        "kinou_in_jukyo_pct_l19": pct_l19,
        "has_kinou": n_polys > 0,
    })

なぜこの図か

都市機能誘導の規模ランキング人口対比の拠点数の 2 視点で、 「人口の多い市ほど多核」の仮説を一目で確認できる図にした。 バブル散布の点サイズが拠点総面積を示すので、市町タイプ・人口・拠点数・規模の 4 次元情報を 1 図で表現できる。

都市機能誘導 規模ランキング + 人口 vs 拠点数 散布
都市機能誘導 規模ランキング + 人口 vs 拠点数 散布

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

拠点間距離 (左) と 拠点 → 居住誘導 最短距離 (右)
拠点間距離 (左) と 拠点 → 居住誘導 最短距離 (右)

この図から読み取れること ─ 本記事の最大発見:

表 4: 都市機能誘導 8 市サマリ (要件 G)

市町タイプ行政 km²人口千人拠点数拠点総面積 km²行政比率 %拠点間平均距離 km拠点→L28 K1 km拠点→L19 K1 km
広島市政令市957.411890 (未指定)L28 シリーズに KUIKI=3 ポリゴンなし
呉市中核市388.421040.9940.25583.723.063.06
竹原市117.92441.7951.52326.55
三原市478.69010.3530.07387.271.83
福山市中核市521.34590 (未指定)L28 シリーズに KUIKI=3 ポリゴンなし
府中市195.6370 (未指定)L28 シリーズに KUIKI=3 ポリゴンなし
東広島市施行時特例市634.719820.3100.048818.108.675.40
廿日市市489.111730.2120.04333.357.875.14

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

8. 分析5: 主題図と small multiples

狙い: 8 LIP 市の都市機能誘導と近接居住誘導の地理配置を主題図で俯瞰し、 さらに small multiples で各市の拠点パターンを比較する。

図 5: 8 市 主題図 (位置情報の活用 - 要件 T)

L28 シリーズが県内 8 市にどう分布しているかを、行政背景の上に重ね描き。

8 LIP 策定市 — L28 都市機能誘導 (赤) + 近接居住誘導 (青)
8 LIP 策定市 — L28 都市機能誘導 (赤) + 近接居住誘導 (青)

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

図 6: 8 市 small multiples (要件 T)

各市を独立 panel で比較。同一スケールで配置することで「規模差」と「拠点パターン差」が並列に見える。

8 LIP 市 — 各市の都市機能誘導 (赤) + 近接居住誘導 (青)
8 LIP 市 — 各市の都市機能誘導 (赤) + 近接居住誘導 (青)

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

図 7: 8 市 × KUIKI 構成 (要件 G との対応)

L28: 8 市 × KUIKI_CD 件数 stack (左) / 面積 stack (右)
L28: 8 市 × KUIKI_CD 件数 stack (左) / 面積 stack (右)

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

図 8: シリーズ実態の概念図 (要件 H)

L28 と L19 の関係 ─ 呉市実例 (左) + 概念図 (右)
L28 と L19 の関係 ─ 呉市実例 (左) + 概念図 (右)

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

9. 分析6: 整合性検証 (8 市別 vs 県全域)

狙い: 8 市別 8 ファイルの合計と、県全域版 ds=934 (1 ファイル, 1150 ポリゴン) の同一性を確認する。 DoBoX が「重複データ」を別 dataset_id で配信していることが多いため、 両者が一致するかはデータの整合性 (consistency)の根本検証となる。

L28 整合性検証 ─ 8 市別合計 vs 県全域 ds=934 (面積 + 件数)
L28 整合性検証 ─ 8 市別合計 vs 県全域 ds=934 (面積 + 件数)

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

表 5: L28 整合性 (要件 G)

KUIKI_CD類型 8 市別 polys8 市別 km² 県全域 ds=934 polys県全域 km² 差 (面積 %)
0その他/非誘導440.0032440.0032-0.0000%
1居住誘導区域165106.1981165106.1981-0.0000%
2居住誘導 境界線8690.03408690.0340+0.0000%
3都市機能誘導区域143.6633143.6633+0.0000%
4都市機能誘導 境界線580.2179580.2179+0.0000%

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

10. 仮説検証と考察

仮説検証 結果一覧 (表 6 - 要件 G)

仮説主張主要結果判定
H1L28 シリーズは L19 居住誘導のサブセット (L28 KUIKI=1 / L19 KUIKI=1 = 30-50%)L28 KUIKI=1 / L19 KUIKI=1 平均 30.1% (期待 30-50%)支持
H2L28 KUIKI=1 ⊆ L19 KUIKI=1 (L28 ∩ L19 / L28 ≈ 100%, L28 \ L19 < 0.1 km²)L28 ⊆ L19 包含率平均 99.98% (期待 ≥ 95%)、はみ出し最大 0.0413 km²支持
H3拠点ネットワーク型: 都市機能誘導 拠点と居住誘導の最短距離 < 1 km拠点 → L19居住誘導 最短距離平均 3.86 km (期待 < 1)、包含率 0.0%反証 (重要発見: 分離型 LIP)
H4都市機能誘導は 1〜2 km²/市 の小規模; 大都市は多核拠点拠点指定 5 市 / 8 市、平均拠点総面積 0.73 km², 平均拠点数 2.8支持
H58 市別 GeoJSON 合計と県全域 ds=934 が完全一致8 市別合計 vs 県全域: 面積差 < 0.001%、件数完全一致支持

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

考察 — 4 つの主要発見

  1. 「シリーズ重複」の DoBoX 設計の解読: L19 と L28 は同じ列構造を持つ別 dataset_idで、 実質的にL19 の上位集合と L28 の下位集合の関係。 L28 は「都市機能誘導区域とその近接居住誘導」だけを切り出した狭い領域、 L19 は「居住誘導全体 (都市機能誘導も含む)」の広い領域。 → DoBoX は同じ立地適正化計画情報を2 通りの粒度で提供している。 利用者は用途に応じて選択: 「コンパクトな拠点周辺だけ見たい」→ L28、 「居住誘導全体を見たい」→ L19。
  2. 「分離型 LIP」が広島県 5 市の実装スタイル (本記事の最大発見): 呉市 (4 拠点)・竹原市 (4 拠点)・三原市 (1 拠点)・東広島市 (2 拠点)・廿日市市 (3 拠点) で、 都市機能誘導と居住誘導がkm 単位で空間的に分離している (距離 1.8〜5.4 km)。 これは立地適正化計画の理論モデル「拠点ネットワーク型 = 居住誘導 ⊃ 都市機能誘導」を 反証する重要発見。広島県の LIP は住居系と商業系を地理的に住み分け、 公共交通でつなぐ日本ローカルの運用スタイルを採用している。
  3. 「拠点未指定」3 市の解釈: 広島市・福山市・府中市は L28 シリーズに KUIKI=3 ポリゴンを持たない。 L19 でも KUIKI=3 が極めて少ない (広島市 0, 福山市 0, 府中市 0)。 これは (a) 都市機能誘導を未指定か、 (b) 別のデータソース (DoBoX 外の別の自治体システム) で管理している可能性。 2025 年現在の DoBoX 公開データ範囲ではこれらの市の都市機能誘導は把握できない
  4. 都市機能誘導の規模感の発見: 8 市計の都市機能誘導 (KUIKI=3) は3.2 km² ─ 県内 8 LIP 市の合計でも 行政面積の0.001%未満。極めて小さな「点」として コンパクトシティの核を実装している。 竹原市の 1.80 km² が最大規模 (港湾中心の歴史的市街地) ─ 大都市ほど拠点が大きいわけではない反証ケース。

11. 発展課題

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

発展課題 1 — DoBoX のシリーズ設計の汎化

発展課題 2 — 「分離型 LIP」の合理性検証

発展課題 3 — 拠点未指定 3 市の解明

発展課題 4 — 全国比較