Lesson 29
L29: 準都市計画区域 三兄弟 (基盤+用途地域+用途白地) 統合分析 — 広島県唯一の旧湯来町域 4.58 km² の構造
都市計画準都市計画区域GIS幾何整合性geopandas都計法第5条の2ロードサイド湯来
所要 35 分 / 想定レベル: リテラシレベル (大学生) / データ: DoBoX 都市計画区域情報_区域データ_*_準都市計画区域 / 用途地域 / 用途白地 (3 兄弟 計 6 dataset_id; CITY_CD=108 単一)
データ取得手順
✅ このスクリプトは初回実行時にデータを自動取得します(DoBoX からの直接ダウンロード)。
| ID | データセット名 |
| #222 | dataset #222 |
| #444 | dataset #444 |
| #666 | dataset #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)
- 準都市計画区域 (Quasi City Planning Zone):
都市計画法第 5 条の 2 に基づく制度。
都市計画区域の外側にあるが、放任すれば乱開発が起きうるエリアに対し、
用途地域・特別用途地区など最小限の規制のみを適用する。
通常の都市計画区域より遥かに緩い制御。
高速道路 IC 周辺や幹線道路沿いの中山間部で、
ロードサイド型店舗集中や乱開発を抑制する目的で指定される。
- 都市計画法第 5 条の 2:
準都市計画区域の根拠条文。1992 年都計法改正で「都市計画区域外」の補完として
創設され、2000 年改正で現行制度に整理された。
指定主体は都道府県 (市町ではない)。
- 3 兄弟構造 (本記事の独自用語):
DoBoX が準都市計画区域を 3 つのサブシリーズで提供する構造:
- 基盤 (base): 準都市計画区域の全体ポリゴン
- 用途地域 (use): 区域内で用途地域指定された部分
- 用途白地 (white): 区域内で用途指定なしの部分
数学的に「基盤 = 用途地域 ∪ 用途白地」「用途地域 ∩ 用途白地 = ∅」
の完全分割関係にある。本記事はこの 3 兄弟の幾何整合性を実証する。
- ロードサイド型開発:
幹線道路沿いに大規模商業施設・ガソリンスタンド・倉庫が
帯状に集中する開発パターン。準都市計画区域は元々、
高速道 IC 周辺や国道沿いの中山間部で無秩序なロードサイド開発を防ぐために
創設された制度。本記事の用途地域 7 ポリゴンが小片状に分布する事実は、
この制度趣旨が幾何的に表れた結果と読める。
- CITY_CD (市区町村コード):
DoBoX 共通の整数コード。広島県内では 101-108 = 広島市 8 区、
200 番台 = 主要市、300 番台 = 町、400 番台 = 一部町。
L08 レッスンの対照表より 108 = 広島市佐伯区。
本記事の全 6 ファイルで CITY_CD = 108 単一値であることが、
「広島県内の準都市計画区域 = 旧湯来町域のみ」という結論の根拠。
- KUIKI_TB:
use/white の polygon に付く属性。実データを確認した結果、
FID + 1 と一致する単純な連番 ID であり、用途地域分類コードではない。
L17/L18 の
YOTO_CD や L19 の KUIKI_CD と意味体系が異なる
─ 監査未経シリーズの注意点。
- 湯来地区 (旧湯来町):
旧佐伯郡湯来町は、2005 年 4 月 25 日に広島市佐伯区へ編入合併された。
湯来温泉で知られる中山間部で、合併前は都市計画区域外の制度的扱いだったが、
合併時に旧町域の一部が準都市計画区域として継承指定された。
これが本記事が分析する 4.58 km² の正体。
仮説 H1〜H6 (要件 D)
- H1 (指定の希少性): 広島県内の準都市計画区域は1〜3 市町、合計面積10 km² 未満
の極小制度として指定されている。県土 8,479 km² に対するカバー率 < 0.2%。
- H2 (3 兄弟の数学的補完): 基盤面積 = 用途地域面積 + 用途白地面積 が
幾何的に厳密成立する (誤差 0.01 km² 未満)。
3 兄弟は「用途指定あり ∪ 用途指定なし」の完全互補な分割。
- H3 (用途指定比率の小ささ): 用途地域指定 (use) は基盤の20%未満。
残り 80% 以上が用途白地 ─ 制度趣旨「最低限の規制」を反映。
- H4 (用途地域の細片性): 用途地域 (use) ポリゴンは多数の小片に分かれる
(1 ポリゴン平均 < 0.1 km²) ─ ロードサイド型実装の幾何特徴。
- H5 (広島市 ds と県全域 ds の一致): 広島市 dsid (791/792/793) と
広島県全域 dsid (929/930/931) は件数・面積・幾何が完全一致。
理由: 県内に他の準都市計画区域がないため、市と県の dataset が同じ実体を別 ID で提供。
- H6 (CITY_CD = 108 の意味): 全 6 ファイルで CITY_CD は108 単一値。
L08 対照表より 108 = 広島市佐伯区 → 旧湯来町域が継承指定された結果。
到達点
- 6 GeoJSON (3 兄弟 × 2 dsid) を統合する手法と、列が同型でない場合の併置統合のテクニック
- 幾何 union/intersection/symmetric_difference で 3 兄弟の補完関係を実証する技法
- 少件数 (32 polygon) でも制度の希少性そのものを研究テーマ化する姿勢
- カタログ表記 (「広島市」) と実体 (旧湯来町) の乖離を CITY_CD で解明する手順
- L16/L17/L18/L26/L27 の他制度との規模比較で位置付ける視点
- 図 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 内同梱) |
| CRS | EPSG: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 に基づく区域全体 | #888888 | 5 | 4.5827 |
| 用途地域指定あり | use | 区域内で用途地域 (住居・商業・工業) が指定された部分 | #cf222e | 7 | 0.7244 |
| 用途白地 (用途指定なし) | white | 区域内で用途地域指定がない緩規制部分 | #1f883d | 10 | 3.8584 |
6 GeoJSON 一覧
| kind | dsid | カタログ表記市町 |
実 CITY_CD | polys | area km² | 備考 |
base | DoBoX #791 | 広島市 | [108] = 広島市佐伯区 | 5 | 4.5827 | base_791_広島市.zip |
base | DoBoX #929 | 広島県 | [108] = 広島市佐伯区 | 5 | 4.5827 | base_929_広島県.zip |
use | DoBoX #792 | 広島市 | [108] = 広島市佐伯区 | 7 | 0.7244 | use_792_広島市.zip |
use | DoBoX #930 | 広島県 | [108] = 広島市佐伯区 | 7 | 0.7244 | use_930_広島県.zip |
white | DoBoX #793 | 広島市 | [108] = 広島市佐伯区 | 10 | 3.8584 | white_793_広島市.zip |
white | DoBoX #931 | 広島県 | [108] = 広島市佐伯区 | 10 | 3.8584 | white_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 なし。完全同型ではないので単純合体禁止
|
結果: 列構造の差異
| kind | 列 | polygon 数 | 面積 km² |
base | FID, TOKEI_CD, CITY_CD, geometry (4 列) |
5 | 4.5827 |
use | FID, TOKEI_CD, CITY_CD, KUIKI_TB, geometry (5 列) |
7 | 0.7244 |
white | FID, TOKEI_CD, CITY_CD, KUIKI_TB, geometry (5 列) |
10 | 3.8584 |
この表から読み取れること:
- base には
KUIKI_TB がない。理由: base は単一の「準都市計画区域全体」を表すので、用途分類の細分が不要。
- use/white は用途指定の有無で分かれるため、
KUIKI_TB で 1〜N の連番ID を持つ。
ただし、後の検証で KUIKI_TB == FID + 1 が成立し、意味的分類ではなく単なる番号と判明する。
- 3 兄弟の合体可否判定: 合体禁止。同じテーブルに縦結合すると base の行で
KUIKI_TB が NaN になり、解釈の混乱を招く。
代わりに「役割が違うレイヤ」として併置し、幾何 union/intersection で関係を記述する。
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 → 広島市佐伯区
|
結果
| kind | dsid | CITY_CD ユニーク | 市町名 (L08 対照) |
base | 791 | [108] | 広島市佐伯区 |
base | 929 | [108] | 広島市佐伯区 |
use | 792 | [108] | 広島市佐伯区 |
use | 930 | [108] | 広島市佐伯区 |
white | 793 | [108] | 広島市佐伯区 |
white | 931 | [108] | 広島市佐伯区 |
この表から読み取れること:
- 全 6 ファイルで CITY_CD = 108 単一値。県内に他の準都市計画区域は無い。
- 108 = 広島市佐伯区 (L08 対照表より)。カタログ表記「広島市」は誤解を招く:
実体は政令市の中心部ではなく、合併で取り込まれた旧湯来町の中山間部。
- 仮説 H1 の第一の傍証: 広島県全域で 1 つの市 (CITY_CD=108) のみに指定 = 極めて限定的。
- 仮説 H6 が支持される (CITY_CD = 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_hi | n_ken | area_hi km² | area_ken km² |
対称差 km² | 完全一致? |
base | 791 | 929 | 5 | 5 | 4.5827 | 4.5827 | 0.000000 | True |
use | 792 | 930 | 7 | 7 | 0.7244 | 0.7244 | 0.000000 | True |
white | 793 | 931 | 10 | 10 | 3.8584 | 3.8584 | 0.000000 | True |
この表から読み取れること:
- 3 兄弟すべてで完全一致 = True。広島市 ds と県全域 ds は同じ実体ポリゴンを別 ID で提供している。
- 仮説 H5 が完全支持される。
- カタログ重複の構造: 「シリーズ × 市町 × dsid」設計上、
準都市計画区域があるのは広島市のみだが、シリーズ完結性のために県全域版も用意。
結果として中身は同一になる。
- L26/L27/L28 では「県全域 = 全市町合算」だったが、本シリーズは「県全域 = 単一市町と同じ」になる
─ 1 市町しかない制度の特殊な構造。
以降の分析は県全域 ds (929/930/931) のみを使う。
広島市 ds (791/792/793) は冗長なので分析から除外して構わない。
図4 から読み取れること:
- 左: 基盤 (灰) ≈ 用途+白地 合算 (青) で、棒の高さが視覚的に揃う。
- 右: 広島市 ds (青) と県全域 ds (橙) の棒が完全に同じ高さ ─ 数値も小数 4 桁まで一致。
7. 分析4: 3 兄弟の幾何整合性 — 基盤 = 用途 ⊔ 白地
狙い: 「基盤 = 用途地域 ∪ 用途白地, 用途地域 ∩ 用途白地 = ∅」 という 3 兄弟の
理論的補完関係を、幾何 union/intersection で実証する。
手法のツール化視点 (要件 J)
使うのは shapely の集合演算。数式の中身は黒箱で OK ─
学習者には「2 つの polygon 集合を 1 つに結合した結果が、別 polygon と
同じか?」を計量で確かめる手順を伝える:
| 関数 | 入力 | 出力 | 意味 |
g.union_all() | GeoSeries | shapely Geometry | 全 polygon を 1 つに合体 |
A.intersection(B) | 2 つの Geometry | Geometry | 共通部分 |
A.symmetric_difference(B) | 2 つの Geometry | Geometry | (A∪B) − (A∩B) = どちらか一方だけにある部分 |
g.area | Geometry (m 単位 CRS) | float | 面積 m² |
結果の読み方:
- 「差 = 基盤 - 用途+白地 ≈ 0」なら基盤面積は用途+白地の総和。
- 「用途∩白地 ≈ 0」なら用途と白地は重なっていない (排他的)。
- 「基盤△(用途∪白地) ≈ 0」なら基盤と用途∪白地は同じ領域 (完全分割)。
- 3 つすべてが 0 なら「基盤 = 用途 ⊔ 白地」(disjoint union) が成立。
実装
↑ 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² | ≈ 基盤面積 → 包含成立 |
この表から読み取れること:
- 差 = 0 m²: GeoJSON 座標の浮動小数点誤差レベル。事実上「ぴったり一致」。
- 用途 ∩ 白地 ≈ 0: 用途地域と用途白地は排他的。重なる polygon は無い。
- 仮説 H2 が完全に支持される: 基盤は用途指定の有無で完全二分される。
- これは DoBoX の準都市計画区域 GeoJSON が厳密に整備されたことの幾何的証拠。
図3 から読み取れること:
- (a) 基盤: 5 polygon, 大 1 + 小 4 の構成。
- (b) 用途地域: 7 polygon, 全部 (a) の輪郭の内側に収まる小片群。
- (c) 用途白地: 10 polygon, (a) の大部分 (84%) を占める連続塊。
- (b) と (c) は重ならない。両方足すと (a) になる ─ 完全分割の視覚化。
図2 から読み取れること:
- 1 枚の地図に 3 兄弟を重ねると、灰 (基盤) を緑 (白地) と赤 (用途地域) が完全に塗り分ける構造が直感できる。
- 赤 (用途地域) は東部のみに集中 ─ おそらく旧湯来町の中心市街地。
- 5 つの基盤 polygon (FID=0..4) のうち、最大 (FID=0, 3.52 km²) が東部主群、残りは西部の飛地。
8. 分析5: ポリゴン規模分布と形状の細片性
狙い: 用途地域 (use) と用途白地 (white) で polygon の規模・形状の特徴が
どう違うかを定量化する。仮説 H4「用途地域は細片状でロードサイド型」を検証する。
手法のツール化視点
コンパクト性 (compactness) 指標: 周長 L と面積 A から
4πA / L² を計算すると、円なら 1.0、細長くなるほど 0 に近づく。
これは形状の「丸さ」を数値化する古典的指標。
- 1.0 (円): 周長に対して面積が最大効率
- 0.7〜0.9 (正方形〜五角形): まとまった塊
- 0.3〜0.5 (細長帯, ロードサイド): 道路沿いに伸びる小片
- < 0.2: 極端に細長い帯
限界: コンパクト性は「形状の凹凸」までは見ない。
複雑な海岸線などは別指標 (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())
|
結果: 規模分布
| kind | polygon 数 | min km² | max km² | mean km² | median km² |
base | 5 | 0.0780 | 3.5224 | 0.9166 | 0.1742 |
use | 7 | 0.0136 | 0.4185 | 0.1035 | 0.0599 |
white | 10 | 0.0010 | 1.9215 | 0.3858 | 0.0411 |
結果: 形状コンパクト性
| kind | polys | mean compactness | median | 最小 (最も細長) |
base | 5 | 0.1771 | 0.1867 | 0.0443 |
use | 7 | 0.3273 | 0.2739 | 0.1667 |
white | 10 | 0.2032 | 0.1849 | 0.0627 |
この表から読み取れること:
- 用途地域 (use): 平均 0.1035 km² (= 約 104 m²)。
最大でも 0.4185 km² の小片。仮説 H4 「< 0.1 km²」は支持される。
- 用途白地 (white): 平均 0.3858 km²、最大 1.9215 km² の連続塊。用途地域より一桁大きい。
- 基盤 (base): 大 1 (3.52 km²) + 中 2 + 小 2 の不均一構成。
- コンパクト性の比較: 用途地域は0.327
vs 用途白地 0.203。
用途地域は白地より細長い ─ 道路沿いに帯状指定された痕跡。
図5 から読み取れること:
- 左 (log scale): 用途地域 (赤) は最大 0.42 km² から最小 0.014 km² まで、約 30 倍の幅で分布。
白地 (緑) は最大 1.92 km² から最小 0.001 km² まで、約 2000 倍の幅で桁違いに分散。
- 右 (面積 × コンパクト性): 小さい polygon (面積 < 0.01 km²) はコンパクト性も小さい (= 細長い破片)。
大きい polygon (面積 > 0.5 km²) は compactness 0.4〜0.6 でやや丸い塊。
- 用途地域 (赤) は左下クラスタに集中 = 「小さくて細長い」 ─ ロードサイド型実装の幾何的痕跡。
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 ポリゴンの詳細表
| FID | KUIKI_TB | 面積 km² | 周長 km | 代表点 X | 代表点 Y |
| 0 | 1 | 0.4185 | 3.461 | 11952 | -174061 |
| 1 | 2 | 0.1040 | 1.441 | 12166 | -173157 |
| 2 | 3 | 0.0696 | 1.787 | 11568 | -174979 |
| 3 | 4 | 0.0599 | 1.771 | 6861 | -169137 |
| 4 | 5 | 0.0397 | 1.730 | 11762 | -173444 |
| 5 | 6 | 0.0190 | 0.843 | 6952 | -169188 |
| 6 | 7 | 0.0136 | 0.910 | 11885 | -173352 |
この表から読み取れること:
- KUIKI_TB は 1〜7 の連番、FID は 0〜6 の連番 → KUIKI_TB = FID + 1 がぴったり成立。
したがって
KUIKI_TB は意味的な用途分類コードではなく単なる行番号。
- L17/L18 の
YOTO_CD や L19 の KUIKI_CD と命名が似ているのに意味が違う。
監査未経シリーズの落とし穴 ─ シリーズ間で同名列の意味が違うことを確認する習慣が重要。
- 面積の幅: 0.014 km² (= 14,000 m²) から 0.42 km² (= 42 ha) までの 30 倍幅。
最大の TB=1 (0.42 km²) は東部主群、最小の TB=7 (0.014 km²) も東部主群の辺縁。
- 代表点 X 座標を見ると、TB=4 (X≈6861) と TB=6 (X≈6952) のみが西部小群。
残り 5 ポリゴンは X≈11500-12200 の東部主群に密集 ─
旧湯来町の中心市街地周辺と推定される。
図6 から読み取れること:
- 用途地域 7 polygon は全て基盤 (灰背景) の輪郭内に収まる ─ 包含関係の視覚化。
- 東部 (TB=1,2,3,5,7) が密集 ─ 旧湯来町中心市街地。
- 西部 (TB=4,6) は単独の小片 ─ おそらく国道沿いの拠点的指定。
- 合計面積 0.72 km² が、これだけ細片に分かれていることが「用途地域指定はピンポイント運用」という制度実装スタイルを示す。
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.58 | 0.0540% | L29 (本記事) |
| 準都市計画 用途白地 | 3.86 | 0.0455% | L29 |
| 準都市計画 用途地域 | 0.72 | 0.00854% | L29 |
この表から読み取れること:
- 準都市計画区域 (4.58 km²) は非線引き用途地域 (~50 km²) のさらに 1/10 程度。
広島県の都市計画制度の中で最も狭い指定。
- 用途地域に絞ると 0.72 km² ─ 県土の 1/12,000。「規制が及ぶ場所」としては事実上ゼロに近い。
- 制度趣旨「最低限の規制で乱開発を防ぐ」が、規模のレベルで実装に反映されている。
図7 から読み取れること:
- log スケールでも、準都市計画区域系の 3 つの棒は他制度から2〜3 桁下に位置。
- 「区域外」(灰) が圧倒的に大きい。県土の大半は都市計画法のフル制御外。
- 準都市計画区域 (赤系小棒) は「制度上は存在するが、量的にはほぼゼロ」
図11 から読み取れること:
- 制度を「広い → 狭い」 で積み重ねると、準都市計画区域はピラミッドの最先端。
- 準都市計画 用途地域指定 (0.72 km²) は最小制度 ─ 県全体の中で「最も精密な制御」だが、量的にも極小。
11. 分析8: 用途指定階層と地理的 2 クラスタ
狙い: 基盤 → 用途指定/非指定の階層構造と、用途地域+白地の地理的 2 クラスタ(東部主群 + 西部小群) を可視化する。
結果: 階層構造
基盤 100% を 1 段目、用途+白地の比率を 2 段目に並べた階層図 (図8) で、
「区域内の用途指定率 15.8% / 白地率 84.2%」が直感できる。
図8 から読み取れること:
- 基盤の 15.8% のみが用途指定 ─ 仮説 H3「20% 未満」を完全に支持。
- 残り 84.2% は白地 = 用途地域指定なしの緩規制部分。
- これが「準都市計画区域 = 最低限の規制」の幾何的実装。
結果: 地理的 2 クラスタ
polygon の代表点を散布図で示すと、X 座標 ≈ 8000 m を境に2 クラスタに分かれる。
図9 から読み取れること:
- 東部主群 (X ≈ 9300-12300): 大半の polygon が密集。
最大の基盤 polygon (B0, 3.52 km²) と用途地域 5 ポリゴン (U0,1,2,4,6 = TB 1,2,3,5,7) を含む。
- 西部小群 (X ≈ 6500-7100): 小規模 polygon の飛地。
基盤 1 (B1) + 用途地域 2 (U3,U5 = TB 4,6) + 白地多数 (W5-9)。
- 2 クラスタはおそらく旧湯来町の中心市街地 (東部) と国道沿い拠点 (西部) に対応。
図10 から読み取れること:
- (a) 西部小群: 小規模 polygon が密集。用途地域は 2 ポリゴン (TB=4,6) のみで、
残りは細かい白地 polygon の集まり ─ 国道 488 号沿いの拠点的指定 (推定)。
- (b) 東部主群: 大規模 polygon の連続塊。
用途地域 5 ポリゴンと白地 5 ポリゴンが、基盤 4 ポリゴンを完全分割。
- 2 クラスタ構造は「中心市街地 + 飛地」のロードサイド型実装の典型パターン。
12. 仮説検証と考察
H1〜H6 の仮説検証結果を整理する。
| 仮説 | 主張 | 判定 | 根拠 |
| H1 | 1〜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) |
| H6 | CITY_CD = 108 = 広島市佐伯区 (旧湯来町) | 支持 | 全 6 ファイルで CITY_CD = 108 単一値 |
この表から読み取れること:
- 6 仮説すべてが「支持」。本研究の研究問いに対する明確な答えが得られた。
- 準都市計画区域は広島県内でたった 1 市町 (CITY_CD=108) のみ、合計 4.58 km² の極小指定。
- 3 兄弟は幾何的に厳密な完全分割を成しており、データ品質は極めて高い。
- カタログ表記「広島市」は実態を正確に反映していない (実体は旧湯来町)。
カタログ表記の素朴解釈は誤解を生む ─ 監査未経シリーズの教訓。
考察 1: なぜこの 1 箇所だけなのか
広島県内に準都市計画区域が広島市佐伯区 (旧湯来町) の 4.58 km² だけしか指定されていない理由:
- 合併の経緯: 2005 年に佐伯郡湯来町が広島市佐伯区へ編入された際、
旧町域の中心市街地 + 国道沿い拠点を制度的に保全するため、
準都市計画区域として指定。合併によって急に都市計画区域に編入するのを避ける緩衝。
- 制度の歴史的特殊性: 準都市計画区域 (都計法第 5 条の 2) は元々、
高速道路 IC 周辺の中山間部でロードサイド型開発を抑制する目的で
1992 年に創設された制度。広島県内では IC 周辺のロードサイド開発圧力が
湯来地区以外には強く出なかったため、追加指定が発生していない。
- 市町中心の都市計画体制: 広島県は線引き (L18) と非線引き (L27) の組み合わせで
ほぼ全域をカバーしており、両者の隙間に準都市計画区域を必要とする領域がほぼ無い。
考察 2: 「最も使われていない都市計画制度」の研究的意義
本研究は少件数の制度を扱うが、これこそが研究的に意義深い:
- 少件数 = データの希少性は制度自体の希少性を反映する。
量的に小さいことが「使われていない」事実の傍証となる。
- L27 (非線引き) と L29 (準都市計画) を比較すると、両者とも「緩い制御」だが、
L27 が 900 km² なのに L29 は 4.58 km² ─ 2 桁の差。
これは「都市計画区域内で緩い制御 (L27)」と
「都市計画区域外で緩い制御 (L29)」の使い分けの実情を示す。
- カタログ網羅プロジェクトの観点: 広島県オープンデータの 551 件中
準都市計画区域シリーズは 6 件 (= 1.1%)。件数比に対して制度の理解は不可欠 ─
「6 件しかないから無視」ではなく、6 件こそが制度の周縁性そのものを表現している。
考察 3: 監査未経シリーズの落とし穴
L26 (監査未経) → L27 (互補ペア) → L28 (隣接 dsid) → L29 (3 兄弟) と進めて学んだこと:
- カタログ表記 ≠ 実体: 「広島市」と書いてあっても実体は旧湯来町。
CITY_CD でクロスチェックする習慣が必須。
- 同名列の意味が違う: KUIKI_TB は L19 の KUIKI_CD と命名が似ているが、
意味は単なる連番 ID で全く違う。
- 市町別 ds と県全域 ds の関係: 通常は「県全域 = 全市町合算」だが、
本シリーズは「県全域 = 単一市町と同じ」 ─ 制度実態に応じた特殊構造。
- これらは実データを開いて構造調査しないと分からない。
取得 → 構造 probe → 仮説 → 分析 の順序が監査未経シリーズには必須。
13. 発展課題
結果X → 新仮説Y → 課題Z の 3 段で書く (要件 E)。
発展 (i): 全国比較 ─ 広島県は珍しいのか
- 結果 X: 広島県内の準都市計画区域は 4.58 km² の 1 箇所のみ。県土比 0.054%。
- 新仮説 Y: 全国の他都道府県でも準都市計画区域指定は同程度に希少。
とくに大都市圏 (東京・大阪・名古屋) は線引きで尽きるためゼロに近い。
長野・静岡・栃木など中山間部 + 高速 IC 多数の県は数 10 km² 以上の指定があるかもしれない。
- 課題 Z: 国土交通省「都市計画現況調査」(年次公表) から各都道府県の
準都市計画区域面積を抽出 → 地域差ランキング → 広島県の希少さを定量化。
発展 (ii): 用途地域 7 ポリゴンの実地調査
- 結果 X: 用途地域 (use) は東部主群 5 + 西部小群 2 の合計 7 polygon。
最大は 0.42 km² (東部の TB=1)。
- 新仮説 Y: 東部主群 5 ポリゴンは旧湯来町中心市街地 (湯来役場・湯来温泉周辺) に対応し、
西部小群 2 ポリゴンは国道 488 号沿いの拠点(伴峠 IC など) に対応する。
- 課題 Z: 各 polygon の代表点座標を Google Maps / 国土地理院地図に重ねて、
実際の建物利用 (商店・GS・住宅) を現地観察。さらに L13 (建物利用現況) の polygon と
sjoin して「ロードサイド型建物の集中」を確認する。
発展 (iii): 旧湯来町の合併前後比較
- 結果 X: 2005 年合併で旧湯来町が広島市佐伯区へ編入された結果、
準都市計画区域として指定された。
- 新仮説 Y: 合併前の湯来町は都市計画区域外で、合併直後に「準」として継承指定された。
合併から 20 年経った 2026 年現在、人口減少に伴い指定縮小or 廃止の議論があるかもしれない。
- 課題 Z: 広島市の都市計画変更告示 (1990 年代〜2025 年) を時系列で追跡 →
湯来地区の準都市計画区域の指定経緯と、地区計画への移行有無を確認。
発展 (iv): L27/L29 のロードサイド比較
- 結果 X: L29 用途地域は 0.72 km² の細片性 (compactness 平均 ≈ 0.4)。
L27 (非線引き用途地域) は 50 km² だが、ポリゴン平均面積は L29 より大きい。
- 新仮説 Y: L29 はより「精密なロードサイド指定」であり、L27 は地形に応じた
「広めのまとまり指定」。L29 のほうが「制度の意図 = ロードサイド抑制」の
幾何的実装が純粋に表れている。
- 課題 Z: L27/L29 両シリーズについて compactness 分布を比較し、
Mann-Whitney U 検定で「L29 のほうが有意に細長い」を統計的に検証。
発展 (v): 制度シミュレーション ─ もし湯来地区が普通の都市計画区域だったら
- 結果 X: 旧湯来町が「準」で済まされたため、用途地域は 0.72 km² のみで指定されている。
- 新仮説 Y: もし普通の都市計画区域 + 線引きが導入されていれば、
市街化区域 (用途地域指定) は 1.5〜2 km² (現在の 2〜3 倍) になっていたはず。
- 課題 Z: L17 の隣接市町 (大竹市・廿日市市) の市街化区域パターンから、
湯来地区に同様の指定を仮想付与した場合の面積を推定。
実 4.58 km² の 70%程度を市街化区域とする想定 → 現指定の 4 倍規模に相当することを示す。