Lesson 29

L29: 準都市計画区域 三兄弟 (基盤+用途地域+用途白地) 統合分析 — 広島県唯一の旧湯来町域 4.58 km² の構造

都市計画準都市計画区域GIS幾何整合性geopandas都計法第5条の2ロードサイド湯来
所要 35 分 / 想定レベル: リテラシレベル (大学生) / データ: DoBoX 都市計画区域情報_区域データ_*_準都市計画区域 / 用途地域 / 用途白地 (3 兄弟 計 6 dataset_id; CITY_CD=108 単一)

データ取得手順

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

IDデータセット名
#222dataset #222
#444dataset #444
#666dataset #666
#791都市計画区域情報_区域データ_広島市_準都市計画区域
#792都市計画区域情報_区域データ_広島市_準都市計画区域用途地域
#793都市計画区域情報_区域データ_広島市_準都市計画区域用途白地
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#929都市計画区域情報_区域データ_広島県_準都市計画区域
#930都市計画区域情報_区域データ_広島県_準都市計画区域用途地域
#931都市計画区域情報_区域データ_広島県_準都市計画区域用途白地

実行コマンド:

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

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

1. 学習目標と問い

本レッスンは、広島県オープンデータポータル DoBoX の 「都市計画区域情報_区域データ_*_準都市計画区域」シリーズ 3 兄弟 計 6 件 を統合し、広島県唯一の準都市計画区域(旧湯来町, 広島市佐伯区, わずか 4.58 km²) の構造を解読する研究記事です。

研究問い (RQ)
広島県内に指定された準都市計画区域どこにあり、どれくらいの規模で、 「用途地域指定 (use)」と「用途白地 (white)」の構造はどうなっているか? 通常の都市計画区域 (L16) や非線引き用途地域 (L27) と比べて、この緩い制度は どの程度の制御を行っているか? そして DoBoX で広島市と広島県全域の dataset で なぜ列構造・件数が完全一致するのか?

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

仮説 H1〜H6 (要件 D)

到達点

  1. 6 GeoJSON (3 兄弟 × 2 dsid) を統合する手法と、列が同型でない場合の併置統合のテクニック
  2. 幾何 union/intersection/symmetric_difference で 3 兄弟の補完関係を実証する技法
  3. 少件数 (32 polygon) でも制度の希少性そのものを研究テーマ化する姿勢
  4. カタログ表記 (「広島市」) と実体 (旧湯来町) の乖離を CITY_CD で解明する手順
  5. L16/L17/L18/L26/L27 の他制度との規模比較で位置付ける視点
  6. 図 11 種・表 9 種で「最も狭い制度」を多角的に提示 (要件 Q)
注: 三兄弟合体の可否
本記事の準都市計画区域 3 兄弟 (基盤+用途地域+用途白地) は、列構造が完全には同型ではない:
  • base: FID/TOKEI_CD/CITY_CD/geometry の 4 列
  • use, white: 上記 + KUIKI_TB の 5 列
このため、pd.concat による単純合体は禁止。代わりに「役割の異なるレイヤ」として併置統合:
  • base = 区域全体の輪郭
  • use ∪ white = 区域内の細分
  • 幾何的に base ≈ use ∪ white が厳密成立 (本記事 H2 で実証)
他のサブシリーズ (L26 都市計画区域外, L27 非線引き用途地域 等) との合体は禁止。L26/L27 は参考併置のみ。

2. 使用データ

本記事で使う 6 dataset_id は、DoBoX で「都市計画区域情報」配下「区域データ」配下の 準都市計画区域シリーズ 3 兄弟
各兄弟はカタログ表記が「広島市」と「広島県全域」の 2 dataset_id で提供されているが、実データを照合すると2 つの dataset の中身は完全に同じであり、実際の指定地域はカタログ表記の『広島市』ではなく『旧佐伯郡湯来町』 (2005 年に広島市佐伯区へ編入) の中山間部 4.58 km² である。
つまり、広島県オープンデータの『広島市_準都市計画区域』という名前は、合併前の旧湯来町域を指している ─ これが本記事の最初の発見。

データ仕様と 3 兄弟の役割

項目
シリーズ (3 兄弟) 都市計画区域情報_区域データ_*_準都市計画区域 / 準都市計画区域用途地域 / 準都市計画区域用途白地
件数各兄弟 2 dataset_id (広島市 + 広島県全域)、計 6 件
形式GeoJSON (ZIP 内同梱)
CRSEPSG:6671 (JGD2011 平面直角第III系) ※全 6 件で統一
列構造 (兄弟で違う) base: FID/TOKEI_CD/CITY_CD/geometry (4 列)
use, white: 上記 + KUIKI_TB (5 列)
完全同型ではないため単純 concat 禁止
合計ポリゴン数 基盤 5 + 用途 7 + 白地 10 = 22 polygon (極小)
合計面積 (基盤)4.5827 km² (= 県土の 0.0540%)
CITY_CD ユニーク[108] = 広島市佐伯区 単一
関連レッスン L16 (都市計画区域), L17 (用途地域), L18 (線引き), L19/L28 (LIP), L26 (都市計画区域外), L27 (非線引き用途/白地)

3 兄弟の役割と凡例

兄弟kind意味カラーpolygon 数 (実測)面積 km² (実測)
基盤 (準都市計画区域)base都市計画法第 5 条の 2 に基づく区域全体#88888854.5827
用途地域指定ありuse区域内で用途地域 (住居・商業・工業) が指定された部分#cf222e70.7244
用途白地 (用途指定なし)white区域内で用途地域指定がない緩規制部分#1f883d103.8584

6 GeoJSON 一覧

kinddsidカタログ表記市町 実 CITY_CDpolysarea km²備考
baseDoBoX #791広島市[108] = 広島市佐伯区54.5827base_791_広島市.zip
baseDoBoX #929広島県[108] = 広島市佐伯区54.5827base_929_広島県.zip
useDoBoX #792広島市[108] = 広島市佐伯区70.7244use_792_広島市.zip
useDoBoX #930広島県[108] = 広島市佐伯区70.7244use_930_広島県.zip
whiteDoBoX #793広島市[108] = 広島市佐伯区103.8584white_793_広島市.zip
whiteDoBoX #931広島県[108] = 広島市佐伯区103.8584white_931_広島県.zip

3. ダウンロード

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

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

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

cd "2026 DoBoX 教材"
py -X utf8 data\extras\L29_quasi_planning_zones\fetch_quasi_planning_zones.py

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

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

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

実行は cd "2026 DoBoX 教材"; py -X utf8 lessons\L29_quasi_planning_zones.py。 6 ZIP がローカルにあれば数秒〜10 秒で全図 + CSV 再生成 (要件 S 準拠)。 ZIP が無い場合は事前に fetch_quasi_planning_zones.py を実行。

4. 分析1: 6 GeoJSON 読み込みと列同型性チェック

狙い: 6 GeoJSON を 3 兄弟 (kind) × 2 dsid (広島市 / 広島県) の構造で読み込む。 列構造が完全同型ではないことを実データから確認し、合体ではなく併置統合の方針を確立する。

実装

6 ファイルは ZIP の中に 1 つの GeoJSON が同梱される形式。 BytesIO 経由で展開し EPSG:6671 (m 単位平面直角) に再投影する。 すべての面積計算は km² に揃える。 ファイル名は {kind}_{dsid}_{city}.zip パターンで統一されている。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
DATA_DIR = ROOT / "data" / "extras" / "L29_quasi_planning_zones"
TARGET_CRS = "EPSG:6671"  # JGD2011 平面直角 III, m

# (kind, dsid, file_label) — 6 件
TARGETS = [
    ("base",  791, "広島市"),
    ("base",  929, "広島県"),
    ("use",   792, "広島市"),
    ("use",   930, "広島県"),
    ("white", 793, "広島市"),
    ("white", 931, "広島県"),
]

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()))

# 6 ファイル読み込み (kind 別 dict で保持; 列が違うので concat しない)
gdfs = {}
for kind, dsid, city in TARGETS:
    p = DATA_DIR / f"{kind}_{dsid}_{city}.zip"
    g = load_geojson_zip(p).to_crs(TARGET_CRS)
    g["poly_area_km2"] = g.geometry.area / 1e6
    gdfs[(kind, dsid)] = g

# 兄弟ごとの代表 (広島県全域版を採用)
g_base  = gdfs[("base",  929)]
g_use   = gdfs[("use",   930)]
g_white = gdfs[("white", 931)]

# 列同型性チェック
cols_base  = sorted(c for c in g_base.columns  if c != "geometry")
cols_use   = sorted(c for c in g_use.columns   if c != "geometry")
cols_white = sorted(c for c in g_white.columns if c != "geometry")
print(f"base  : {cols_base}")
print(f"use   : {cols_use}")
print(f"white : {cols_white}")
# → base に KUIKI_TB なし。完全同型ではないので単純合体禁止

結果: 列構造の差異

kindpolygon 数面積 km²
baseFID, TOKEI_CD, CITY_CD, geometry (4 列) 54.5827
useFID, TOKEI_CD, CITY_CD, KUIKI_TB, geometry (5 列) 70.7244
whiteFID, TOKEI_CD, CITY_CD, KUIKI_TB, geometry (5 列) 103.8584

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

polygon 総数 22 は L19 (1170) や L27 (136) と比べて桁違いに少ない。 これは「広島県内の準都市計画区域指定が極めて限定的」という仮説 H1 の最初の傍証である。

5. 分析2: CITY_CD で指定市町を同定 — 旧湯来町の発見

狙い: 全 6 ファイルの CITY_CD 列を集合演算で集約し、 広島県内の準都市計画区域がどの市町に指定されているかを実データから同定する。 カタログ表記は「広島市」だが、CITY_CD が広島市の何区を指しているかを確かめる必要がある。

仮説

仮説 H6 で立てたとおり、CITY_CD = 108 (広島市佐伯区) が単一値で出てくると予想する。 理由: 政令市 広島市は中区〜安佐南区 (101-106) は完全市街地で都市計画区域指定済、 湯来町を編入した佐伯区 (108) のみが中山間部を抱え、準都市計画区域が指定可能な地域だから。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
# 全 6 ファイルから CITY_CD ユニーク値を集合演算で抽出
all_city_cds = set()
for (k, d), g in gdfs.items():
    all_city_cds |= set(int(x) for x in g["CITY_CD"].unique())
city_cds = sorted(all_city_cds)
# → [108]  (単一値!)

# L08 既存対照表より 108 = 広島市佐伯区
CITY_CD_NAME = {
    101: "広島市中区", 102: "広島市東区", 103: "広島市南区", 104: "広島市西区",
    105: "広島市安佐南区", 106: "広島市安佐北区", 107: "広島市安芸区",
    108: "広島市佐伯区",  # ← 旧佐伯郡湯来町を 2005 年に編入
}

for cc in city_cds:
    print(f"CITY_CD={cc}{CITY_CD_NAME.get(cc, '(未確定)')}")
# 出力: CITY_CD=108 → 広島市佐伯区

結果

kinddsidCITY_CD ユニーク市町名 (L08 対照)
base791[108]広島市佐伯区
base929[108]広島市佐伯区
use792[108]広島市佐伯区
use930[108]広島市佐伯区
white793[108]広島市佐伯区
white931[108]広島市佐伯区

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

歴史的背景

佐伯郡湯来町は、2005 年 4 月 25 日に広島市佐伯区へ編入合併された (平成の大合併の一環)。湯来温泉で知られる中山間部で、合併前は都市計画区域外の制度的扱いだった。

合併時、旧湯来町の市街地中心部 + 国道 488 号沿いの一部 (4.58 km²) が 準都市計画区域として継承指定されたと推定される。これは「合併で大都市の中に 中山間集落が組み込まれた際、いきなり都市計画区域に編入するのではなく、 緩い制度で一定の制御だけかけておく」典型的な運用パターン。

6. 分析3: 広島市 ds vs 県全域 ds の同一性検証

狙い: 「広島市」 dataset (791/792/793) と「広島県全域」 dataset (929/930/931) は、 件数・面積・幾何が完全一致するか? DoBoX のシリーズ設計上、市町別 dataset と県全域 dataset は「県全域 = 全市町の合算」であることが 通例 (L26/L27/L28 で確認済) だが、本シリーズは 1 市町しかないため 両者の中身がそのまま等しい可能性が高い。

可視化の選定理由 (要件 H)

同一性の証明には、件数・面積・FID 集合・幾何対称差 の 4 軸を組み合わせる必要がある。 表形式 + バーグラフで横並びさせると、視覚的に「ぴったり同じ」が伝わる。 散布図ではこの構造は伝わらない。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import pandas as pd

# 兄弟ごとに 広島市 ds と 広島県 ds を比較
dup_rows = []
for kind in ["base", "use", "white"]:
    keys = sorted([k for k in gdfs if k[0] == kind], key=lambda x: x[1])
    g_hi  = gdfs[keys[0]]   # 広島市 dsid (小)
    g_ken = gdfs[keys[1]]   # 広島県 dsid (大)

    same_n = len(g_hi) == len(g_ken)
    same_a = abs(g_hi["poly_area_km2"].sum()
                 - g_ken["poly_area_km2"].sum()) < 1e-6
    same_fid = (sorted(g_hi["FID"].tolist())
                == sorted(g_ken["FID"].tolist()))
    # 幾何 symmetric_difference の面積で同一性判定
    u_hi  = g_hi.geometry.union_all()
    u_ken = g_ken.geometry.union_all()
    sym_a = u_hi.symmetric_difference(u_ken).area / 1e6

    dup_rows.append({{
        "kind": kind, "n_hi": len(g_hi), "n_ken": len(g_ken),
        "area_hi": g_hi["poly_area_km2"].sum(),
        "area_ken": g_ken["poly_area_km2"].sum(),
        "FID_集合一致": same_fid,
        "対称差_km2": sym_a,
        "完全一致": same_n and same_a and same_fid and (sym_a < 1e-3),
    }})
dup_df = pd.DataFrame(dup_rows)
print(dup_df)

結果: 同一性検証表

kind広島市 ds広島県 ds n_hin_kenarea_hi km²area_ken km² 対称差 km²完全一致?
base791929554.58274.58270.000000True
use792930770.72440.72440.000000True
white79393110103.85843.85840.000000True

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

以降の分析は県全域 ds (929/930/931) のみを使う。 広島市 ds (791/792/793) は冗長なので分析から除外して構わない。

図4: 整合性 (左) + 広島市 ds vs 県全域 ds 同一性 (右)
図4: 整合性 (左) + 広島市 ds vs 県全域 ds 同一性 (右)

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

7. 分析4: 3 兄弟の幾何整合性 — 基盤 = 用途 ⊔ 白地

狙い: 「基盤 = 用途地域 ∪ 用途白地, 用途地域 ∩ 用途白地 = ∅」 という 3 兄弟の 理論的補完関係を、幾何 union/intersection で実証する。

手法のツール化視点 (要件 J)

使うのは shapely の集合演算。数式の中身は黒箱で OK ─ 学習者には「2 つの polygon 集合を 1 つに結合した結果が、別 polygon と 同じか?」を計量で確かめる手順を伝える:

関数入力出力意味
g.union_all()GeoSeriesshapely Geometry全 polygon を 1 つに合体
A.intersection(B)2 つの GeometryGeometry共通部分
A.symmetric_difference(B)2 つの GeometryGeometry(A∪B) − (A∩B) = どちらか一方だけにある部分
g.areaGeometry (m 単位 CRS)float面積 m²

結果の読み方:

実装

L29_quasi_planning_zones.py 行 1576–1653

 1
 2
 3
 4
 5
 6
 7
 8
 9
1585
1586
1587
1588
1589
1590
1591
1592
1593
1594
1595
1596
1597
1598
1599
1600
1601
1602
# 3 兄弟の幾何整合性: 基盤 = 用途地域 + 用途白地 ?
a_base  = g_base["poly_area_km2"].sum()
a_use   = g_use["poly_area_km2"].sum()
a_white = g_white["poly_area_km2"].sum()
a_sum   = a_use + a_white
diff    = a_base - a_sum

# 幾何 union 計算
u_base  = g_base.geometry.union_all()
u_use   = g_use.geometry.union_all()
u_white = g_white.geometry.union_all()
u_uw    = u_use.union(u_white)

# 用途地域 と 用途白地 が排他的か (重なりは ≈ 0?)
inter_uw = u_use.intersection(u_white).area / 1e6

# 基盤 と 用途+白地 の対称差 (基盤に含まれない用途+白地, 用途+白地に
# 含まれない基盤の合計)
sym_base_uw = u_base.symmetric_difference(u_uw).area / 1e6

print(f"面積_基盤      : {a_base:.4f} km²")
print(f"面積_用途地域  : {a_use:.4f} km²")
print(f"面積_用途白地  : {a_white:.4f} km²")
print(f"面積_用途+白地 : {a_sum:.4f} km² (≈ 基盤?)")
print(f"差             : {diff:.6f} km² (≪ 0.01)")
print(f"用途∩白地     : {inter_uw:.6f} km² (≈ 0?)")
print(f"基盤△(用途∪白地): {sym_base_uw:.6f} km²")

結果

指標解釈
面積_基盤4.5827 km²準都市計画区域 全体
面積_用途地域 (use)0.7244 km²用途指定された部分
面積_用途白地 (white)3.8584 km²指定なしの部分
面積_用途+白地4.5827 km²合算 ≈ 基盤?
差 (基盤 - 合算)-0.000000 km² (0 m²) 誤差は数値計算上の丸め程度。実質ゼロ
用途 ∩ 白地 (重なり)0.000000 km²≈ 0 → 排他的
基盤 △ (用途∪白地) (対称差)0.000000 km²≈ 0 → 完全一致
基盤 ∩ (用途∪白地)4.5827 km²≈ 基盤面積 → 包含成立

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

図3: 3 兄弟 small multiples (基盤 / 用途地域 / 用途白地)
図3: 3 兄弟 small multiples (基盤 / 用途地域 / 用途白地)

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

図2: 湯来地区クローズアップ (3 兄弟重ね)
図2: 湯来地区クローズアップ (3 兄弟重ね)

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

8. 分析5: ポリゴン規模分布と形状の細片性

狙い: 用途地域 (use) と用途白地 (white) で polygon の規模・形状の特徴が どう違うかを定量化する。仮説 H4「用途地域は細片状でロードサイド型」を検証する。

手法のツール化視点

コンパクト性 (compactness) 指標: 周長 L と面積 A から 4πA / L² を計算すると、円なら 1.0、細長くなるほど 0 に近づく。 これは形状の「丸さ」を数値化する古典的指標

限界: コンパクト性は「形状の凹凸」までは見ない。 複雑な海岸線などは別指標 (fractal dimension 等) が必要だが、本記事ではシンプルな指標で十分。

実装

L29_quasi_planning_zones.py 行 1680–1736

 1
 2
 3
 4
 5
 6
 7
 8
 9
1689
1690
1691
1692
1693
1694
1695
# polygon 規模統計 (3 兄弟別)
import numpy as np
size_stats = []
for kind, g in [("base", g_base), ("use", g_use), ("white", g_white)]:
    a = g["poly_area_km2"]
    size_stats.append({{
        "kind": kind, "polys": len(g),
        "min_km2": a.min(), "max_km2": a.max(),
        "mean_km2": a.mean(), "median_km2": a.median(),
    }})

# コンパクト性 (4πA/L²): 円が 1, 細長いほど 0
poly_df["compactness"] = (4 * np.pi * poly_df["area_km2"]
                          / (poly_df["perim_km"] ** 2))
# 用途地域 (use) は道路沿い細片が多いので compactness が低い傾向
print(poly_df.groupby("kind")["compactness"].describe())

結果: 規模分布

kindpolygon 数min km²max km²mean km²median km²
base50.07803.52240.91660.1742
use70.01360.41850.10350.0599
white100.00101.92150.38580.0411

結果: 形状コンパクト性

kindpolysmean compactnessmedian最小 (最も細長)
base50.17710.18670.0443
use70.32730.27390.1667
white100.20320.18490.0627

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

図5: 3 兄弟ポリゴン規模分布 (左, log) と 面積×コンパクト性 (右)
図5: 3 兄弟ポリゴン規模分布 (左, log) と 面積×コンパクト性 (右)

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

9. 分析6: 用途地域 7 ポリゴンの詳細マップ

狙い: わずか 7 ポリゴンの用途地域指定の1 つずつを可視化し、 KUIKI_TB の番号と空間配置の対応を確認する。

可視化の選定理由 (要件 H)

polygon 数が極小なので、各 polygon に KUIKI_TB 番号と面積を直接ラベリング。 カテゴリ色分け (tab10 パレット) で個体識別を可能にする。 3 兄弟まとめ図 (図2) では細部が潰れるので、用途地域だけのズーム図を別に用意する価値がある。

実装

L29_quasi_planning_zones.py 行 1776–1836

 1
 2
 3
 4
 5
 6
 7
 8
 9
1785
1786
1787
1788
1789
1790
1791
1792
1793
1794
1795
# 用途地域 7 polygon を KUIKI_TB で色分けして詳細マップを描画
import matplotlib.cm as cm
cmap = cm.get_cmap("tab10")

fig, ax = plt.subplots(figsize=(11, 9))
g_base.plot(ax=ax, color="#dddddd", edgecolor="#444",
            linewidth=0.4, alpha=0.4)            # 背景: 基盤
g_white.plot(ax=ax, color="#c8e6c9", edgecolor="white",
             linewidth=0.3, alpha=0.5)            # 背景: 白地
for _, r in g_use.iterrows():
    color = cmap(int(r["KUIKI_TB"]) % 10)
    gpd.GeoSeries([r.geometry]).plot(ax=ax, color=color,
                                      edgecolor="black",
                                      linewidth=0.7, alpha=0.95)
    pt = r.geometry.representative_point()
    ax.annotate(f"TB={int(r['KUIKI_TB'])}\n{r['poly_area_km2']:.3f} km²",
                xy=(pt.x, pt.y), fontsize=8.5,
                ha="center", fontweight="bold",
                xytext=(0, 12), textcoords="offset points",
                arrowprops=dict(arrowstyle="-", color="black", lw=0.5))

用途地域 7 ポリゴンの詳細表

FIDKUIKI_TB面積 km²周長 km代表点 X代表点 Y
010.41853.46111952-174061
120.10401.44112166-173157
230.06961.78711568-174979
340.05991.7716861-169137
450.03971.73011762-173444
560.01900.8436952-169188
670.01360.91011885-173352

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

図6: 用途地域 7 ポリゴン詳細 (KUIKI_TB 別カラー)
図6: 用途地域 7 ポリゴン詳細 (KUIKI_TB 別カラー)

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

10. 分析7: 他制度との規模比較 — 制度ピラミッドの最先端

狙い: 広島県内の他の都市計画制度 (L16/L17/L18/L26/L27) と規模を並べ比較し、 準都市計画区域が制度ピラミッドの中でどの位置にあるかを定量的に示す。

可視化の選定理由

面積規模が桁違い (4.58 km² vs 7000 km²) なので、線形スケールでは小さい棒が潰れる。 log スケール水平棒で全制度を視覚化することで、 「準都市計画区域は制度ピラミッドの最下層 (= 最も狭い)」が一目で分かる。

注: L16/L17/L26/L27 の数値は各レッスンの結論値の概算。本記事の主役は L29 (準都市計画区域) であり、他制度の値は位置付けのための参考として併置する。

結果: 制度別 規模比較表

制度面積 km²県土比 %該当レッスン
都市計画区域~7,000~82%L26
通常都市計画区域 (合計)~1,450~17%L16
市街化区域 + 線引き用途地域~460~5.4%L17, L18
非線引き用途白地~850~10%L27
非線引き用途地域~50~0.59%L27
準都市計画区域 (基盤)4.580.0540%L29 (本記事)
準都市計画 用途白地3.860.0455%L29
準都市計画 用途地域0.720.00854%L29

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

図7: 広島県の都市計画制度別 規模比較 (log スケール)
図7: 広島県の都市計画制度別 規模比較 (log スケール)

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

図11: 制度ピラミッド (log スケール)
図11: 制度ピラミッド (log スケール)

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

11. 分析8: 用途指定階層と地理的 2 クラスタ

狙い: 基盤 → 用途指定/非指定の階層構造と、用途地域+白地の地理的 2 クラスタ(東部主群 + 西部小群) を可視化する。

結果: 階層構造

基盤 100% を 1 段目、用途+白地の比率を 2 段目に並べた階層図 (図8) で、 「区域内の用途指定率 15.8% / 白地率 84.2%」が直感できる。

図8: 用途指定階層 ─ 基盤 → 用途 + 白地 への分割
図8: 用途指定階層 ─ 基盤 → 用途 + 白地 への分割

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

結果: 地理的 2 クラスタ

polygon の代表点を散布図で示すと、X 座標 ≈ 8000 m を境に2 クラスタに分かれる。

図9: 32 ポリゴンの代表点散布 (バブル=√面積)
図9: 32 ポリゴンの代表点散布 (バブル=√面積)

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

図10: 2 クラスタ別ズーム (左=西部小群, 右=東部主群)
図10: 2 クラスタ別ズーム (左=西部小群, 右=東部主群)

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

12. 仮説検証と考察

H1〜H6 の仮説検証結果を整理する。

仮説主張判定根拠
H11〜3 市町, 10 km² 未満支持CITY_CD ユニーク=[108], 面積=4.58 km² (県土の 0.0540%)
H2基盤 = 用途 + 白地支持差 0 m² (≪ 0.01 km²), 用途∩白地=0.0000 km²
H3用途指定率 < 20%支持用途/基盤 = 15.8%
H4用途地域は細片状支持用途地域 平均 103 m², 白地 平均 386 m²
H5広島市 ds = 県全域 ds支持3 兄弟すべて完全一致 (件数・面積・FID 集合・幾何対称差 すべて 0)
H6CITY_CD = 108 = 広島市佐伯区 (旧湯来町)支持全 6 ファイルで CITY_CD = 108 単一値

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

考察 1: なぜこの 1 箇所だけなのか

広島県内に準都市計画区域が広島市佐伯区 (旧湯来町) の 4.58 km² だけしか指定されていない理由:

  1. 合併の経緯: 2005 年に佐伯郡湯来町が広島市佐伯区へ編入された際、 旧町域の中心市街地 + 国道沿い拠点を制度的に保全するため、 準都市計画区域として指定。合併によって急に都市計画区域に編入するのを避ける緩衝。
  2. 制度の歴史的特殊性: 準都市計画区域 (都計法第 5 条の 2) は元々、 高速道路 IC 周辺の中山間部でロードサイド型開発を抑制する目的で 1992 年に創設された制度。広島県内では IC 周辺のロードサイド開発圧力が 湯来地区以外には強く出なかったため、追加指定が発生していない。
  3. 市町中心の都市計画体制: 広島県は線引き (L18) と非線引き (L27) の組み合わせで ほぼ全域をカバーしており、両者の隙間に準都市計画区域を必要とする領域がほぼ無い

考察 2: 「最も使われていない都市計画制度」の研究的意義

本研究は少件数の制度を扱うが、これこそが研究的に意義深い:

考察 3: 監査未経シリーズの落とし穴

L26 (監査未経) → L27 (互補ペア) → L28 (隣接 dsid) → L29 (3 兄弟) と進めて学んだこと:

13. 発展課題

結果X → 新仮説Y → 課題Z の 3 段で書く (要件 E)。

発展 (i): 全国比較 ─ 広島県は珍しいのか

発展 (ii): 用途地域 7 ポリゴンの実地調査

発展 (iii): 旧湯来町の合併前後比較

発展 (iv): L27/L29 のロードサイド比較

発展 (v): 制度シミュレーション ─ もし湯来地区が普通の都市計画区域だったら