Lesson 77

L77 道路台帳付図 単独 3 研究例分析

道路GISオープンデータ公開設計L72連携
所要 35〜50 分 / 想定レベル: リテラシ〜中級 / データ: 道路台帳付図 (1 dataset / 2 リソース) — 14,463 図郭 / 319 路線

データ取得手順

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

IDデータセット名
#222dataset #222
#333dataset #333
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1445道路台帳付図

実行コマンド:

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

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

学習目標と問い

本記事は単独データセット系 Format B: 1 つのデータセット 「道路台帳付図」 を 3 つの独立した研究角度 (RQ1 / RQ2 / RQ3) で並列に 分析する。 RQ1 でデータ構造、 RQ2 で L72 緊急輸送道路との照合、 RQ3 で公開設計を評価する 3 段階アプローチ。

独自用語の定義 (本記事限定)

研究の問い (3 RQ)

  1. RQ1 (主研究): 広島県の道路台帳付図のデータ構造 — 公開単位 (路線/図郭) × 路線種 × 図番接頭辞 × 管理事務所はどう描けるか? 14,463 図郭を 4 軸で集計し、 「県の道路情報公開の物理形状」 を初めて 系統的に記述する。 H1 (国道 路線<10% かつ 図郭>=20%) / H2 (国道 >= 主要 >= 県道 の図郭密度) を検証。
  2. RQ2 (副研究 1): 道路台帳付図とL72 緊急輸送道路 (630 セグ / 2789 km) との照合 — 重要路線優先公開はどう描けるか? 14,463 図郭が L72 1km 圏内かを sjoin、 「防災重要路線優先公開」 仮説を 量的検証する。 H3 (全L72 1km >=60%) / H4 (国道 > 主要 > 県道 の L72 重なり率) を検証。
  3. RQ3 (副研究 2): データ公開設計 — 学習者の機械可読性と再利用 可能性はどう評価できるか? 1.1GB ZIP / 14,463 PDF / CSV 関係資料の 3 層構造を学習者目線で評価し、 「PDF は人間可読だが機械可読性が低い」 「CSV 関係資料は機械可読だが PDF 中身は不可」 の非対称公開構造を 量的記述する。 H5 (ZIP/CSV >=300倍) を検証。

仮説 (5)

到達点

本記事を読み終えると、 (1) 県管理道路 319 路線 / 14,463 図郭の データ構造を路線種・管理事務所・図番接頭辞の 3 軸で完全に俯瞰、 (2) L72 緊急輸送道路との1km 重なり率 64.1%を路線種別に分解し 「重要路線優先公開」 の量的証拠を獲得、 (3) ZIP 1.07 GB / CSV 3.40 MB の非対称 2 層公開構造を機械可読性 5 軸スコアで定量化、 という 3 段階の知識が獲得できる。 これにより県の道路情報 オープンデータ戦略の物理形状・防災連携・公開設計思想が研究者視点で見えるよう になる。

使用データ

本研究で使う 1 つの dataset (2 リソース) を以下の表に示す。 本データセットは「PDF 本体 (1.1GB) + 関係資料 CSV (3.4MB)」 という非対称 2 層構造で公開されている。 本記事では関係資料 CSV のみを主データ として用い、 PDF 本体 (ZIP) は取得しない (1.1GB を学習者環境で扱うのは 非現実的、 また RQ1〜RQ3 の問いは CSV のメタ情報で完結するため)。

データセット仕様

項目
データセット ID DoBoX #1445
データセット名 道路台帳付図
公開組織 広島県 道路河川管理課
リソース数 2 (ZIP 本体 + 関係資料 CSV)
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
更新日 (本記事時点) 2023-11-22
対象路線種 国道 / 主要地方道 / 一般県道 (= 県管理 3 路線種)
対象路線数 319 路線
対象図郭数 (PDF) 14,463 図郭
総延長 (推定) 県管理道路約 4,000 km (路線種別公開なし)
ファイル形式 PDF (帯状図, 1:500〜1:1,000)

2 リソースの内訳

リソース形式サイズ役割本記事での扱い
resource 93894 (道路台帳付図_2023-11-22) ZIP (PDF 集合) 1.07 GB (14,463 PDF) 帯状図本体 (人間可読) 取得しない (1.1GB は教材外)
resource 93895 (道路台帳付図_関係資料_2023-11-22) CSV (UTF-8 BOM) 3.40 MB (14,463 行 × 9 列) 路線・図番・位置のメタ表 (機械可読) 本記事の主データ

関係資料 CSV の列定義

列名意味
路線種国道 / 主要地方道 / 一般県道 道路法上の路線分類 (3 種)
路線名433号 / 三原東城線 路線の正式名称 (国道は番号、 県道は地名+地名形式)
路線番号433 / 4032 路線番号 (国道は同名の数字、 県道は 4000 番台)
管理事務所名西部建設事務所 / 東部建設事務所三原支所 路線を管理する県の出先機関 (9 区分)
道路台帳図番D251-4 / N175 / N182-1 図郭の識別番号 (D=詳細図, N=基本図, 後ろは連番)
ファイル/01西部建設事務所/01r3433一般国道433号/...pdf ZIP 内 PDF への相対パス
緯度34.80880 図郭中心点の WGS84 緯度
経度132.70933 図郭中心点の WGS84 経度
利用規約https://data.hiroshima-dobox.jp/.../利用規約.pdf 本データの利用規約 PDF (全行で同一)

形式特性の注意点

ダウンロード

本記事の再現に必要なすべてを直リンクで提供する。 HTML だけ読めば学習者が完全再現できることが目標 (要件 A)。

注意: ZIP 本体 (1.07 GB) は本記事ではダウンロードしない。 本記事は関係資料 CSV (3.40 MB) のみで完結する設計。 PDF 本体は学習者が個別の路線について実際の帯状図を見たい場合に手動で 入手すること (DoBoX のページから DL ボタン)。

生データ (DoBoX 1 dataset, 2 リソース)

このスクリプト本体

中間 CSV (本記事生成、 再利用可)

図 (PNG, 直 DL 可)

【RQ1】データ構造研究 — 路線×事務所×図番の 4 軸

狙い (RQ1)

RQ1 では「県の道路情報公開の物理形状」を初めて系統的に記述する。 具体的には 14,463 図郭 / 319 路線を路線種 × 管理事務所 × 図番 接頭辞 × 路線あたり図郭密度の 4 軸で集計し、 「どの路線種にどれだけの 図郭があり、 どの事務所が管理し、 どの図番が多いか」 を 1 枚で俯瞰できる ようにする。 H1 (国道 路線<10% かつ 図郭>=20%) は「国道は路線数では 少数派だが図郭としては優先公開される」 仮説、 H2 (国道 >= 主要 >= 県道 の図郭密度) は「路線種 = 整備優先度」 という階層構造を量的検証する。

手法 — 4 ステップ

  1. STEP 1: CSV パース + 列名正規化
    関係資料 CSV (UTF-8 BOM, 14,463 行 × 9 列) を read_csv() で 読込み、 列名前後の空白を除去。 「路線番号」 を pd.to_numeric() で 整数化。 緯度経度欠損行 (今回は 0 件) を除外。
  2. STEP 2: 管理事務所名を 9 区分に正規化 (本記事独自分類)
    CSV の「管理事務所名」 列は9 種類のラベルを含む (西部本所 / 西部呉支所 / 西部廿日市支所 / 西部安芸太田支所 / 西部東広島支所 / 東部本所 / 東部三原 支所 / 北部本所 / 北部庄原支所)。 文字列先頭マッチで頑健に分類する独自関数 office_top() を実装。
  3. STEP 3: 図番接頭辞 (D/N/その他) を判定 (本記事独自分類)
    道路台帳図番の先頭 1 文字 (D / N / A / B / C / E / G / H / I) から D 系 (詳細図/分図) / N 系 (基本図/標準) / その他の 3 分類に集計。 D 系 = 詳細図、 N 系 = 基本図 という解釈は本記事独自で、 公式定義は データセット内に含まれない。
  4. STEP 4: GeoDataFrame 化 + EPSG:6671 投影 + 4 軸集計
    緯度経度 → shapely.geometry.Point → GeoDataFrame に変換、 to_crs("EPSG:6671") で平面直角第 III 系に投影 (距離計算で 正確になる)。 その後、 路線種・管理事務所・図番接頭辞・路線種×図番接頭辞 の 4 集計を groupby() で生成。

実装

狙いと方法を踏まえた実装コードは以下の通り。 列名 (路線種・路線名・路線番号・ 管理事務所名・道路台帳図番・ファイル・緯度・経度) は CSV からそのまま使い、 独自分類列のみ追加する設計とした。

L77_road_register.py 行 1377–1549

 1
 2
 3
 4
 5
 6
 7
 8
 9
1386
1387
1388
1389
1390
1391
1392
1393
1394
1395
1396
1397
1398
1399
1400
1401
1402
1403
1404
1405
1406
1407
1408
1409
1410
1411
1412
1413
1414
1415
1416
1417
1418
1419
1420
1421
1422
1423
1424
1425
1426
1427
1428
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

# (1) 関係資料 CSV を読込み (UTF-8 BOM, 14,463 行 × 9 列)
df = pd.read_csv("data/extras/L77_road_register/road_register_relations.csv",
                 encoding="utf-8-sig")
df.columns = [c.strip() for c in df.columns]

# (2) 管理事務所名 → 上位 9 区分への正規化 (本記事独自分類)
def office_top(name):
    s = str(name)
    if s.startswith("西部建設事務所東広島"): return "西部 東広島支所"
    if s.startswith("西部建設事務所安芸太田"): return "西部 安芸太田支所"
    if s.startswith("西部建設事務所廿日市"): return "西部 廿日市支所"
    if s.startswith("西部建設事務所呉"): return "西部 呉支所"
    if s.startswith("西部建設事務所"): return "西部 本所"
    if s.startswith("東部建設事務所三原"): return "東部 三原支所"
    if s.startswith("東部建設事務所"): return "東部 本所"
    if s.startswith("北部建設事務所庄原"): return "北部 庄原支所"
    if s.startswith("北部建設事務所"): return "北部 本所"
    return "その他"
df["事務所区分"] = df["管理事務所名"].apply(office_top)

# (3) 図番接頭辞 (D/N/その他) を判定 (本記事独自分類)
def fig_prefix(s):
    s = str(s).strip()
    if s.startswith("D"): return "D系 (詳細図/分図)"
    if s.startswith("N"): return "N系 (基本図/標準)"
    return "その他 (A/B/C/E/G/H/I 系)"
df["図番接頭辞"] = df["道路台帳図番"].apply(fig_prefix)

# (4) GeoDataFrame 化 + EPSG:6671 投影変換 (距離計算で正確になる)
geom = [Point(lon, lat) for lon, lat in zip(df["経度"], df["緯度"])]
gdf = gpd.GeoDataFrame(df, geometry=geom,
                        crs="EPSG:4326").to_crs("EPSG:6671")

# (5) 路線種別 4 軸集計
T_rank = (gdf.groupby("路線種")
          .agg(図郭数=("道路台帳図番", "count"),
               路線数=("路線名", "nunique"))
          .reset_index())
T_rank["路線あたり図郭密度"] = (T_rank["図郭数"] / T_rank["路線数"]).round(1)
T_rank["図郭シェア_%"] = (T_rank["図郭数"] / len(gdf) * 100).round(2)
T_rank["路線シェア_%"] = (T_rank["路線数"]
                           / gdf.groupby(["路線種","路線名"]).ngroups
                           * 100).round(2)
print(T_rank)

# (6) 管理事務所別 + 図番接頭辞別
print(gdf.groupby("事務所区分").size())
print(gdf.groupby("図番接頭辞").size())

結果と読み取り

(a) 路線種別 4 軸集計

なぜこの表か: 路線種 (国道 / 主要地方道 / 一般県道) ごとの図郭シェア vs 路線シェア vs 路線あたり図郭密度を一覧することで、 「公開の偏り」 を 路線数と図郭数の不一致として量的に把握する。

路線種 図郭数 路線数 図郭シェア_% 路線シェア_% 路線あたり図郭密度
国道 3356 18 23.20 5.64 186.4
主要地方道 4822 69 33.34 21.63 69.9
一般県道 6285 232 43.46 72.73 27.1

表から読み取れること:

(b) 管理事務所別 (図 1, 図 2)

なぜこの図か: 14,463 図郭の地理分布を路線種別 / 管理事務所別 の 2 視点で示すことで、 「どの地域・どの組織が管理しているか」 という 行政区分の物理形状を可視化する。 棒グラフではなく地図にする理由は、 県管理道路網が沿岸都市部に集中・中山間山地に薄く広がるという分布特性を 1 枚で示すため (要件 T)。

図 1: 路線種別 道路台帳付図 図郭分布 (国道 赤 / 主要地方道 青 / 一般県道 緑)
図 1: 路線種別 道路台帳付図 図郭分布 (国道 赤 / 主要地方道 青 / 一般県道 緑)

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

図 2: 管理事務所区分別 道路台帳付図 図郭分布 (9 区分)
図 2: 管理事務所区分別 道路台帳付図 図郭分布 (9 区分)

事務所区分 図郭数 路線数 路線種数 シェア_%
西部 本所 1477 47 3 10.21
西部 呉支所 981 27 3 6.78
西部 廿日市支所 824 26 3 5.70
西部 安芸太田支所 1692 34 3 11.70
西部 東広島支所 1756 45 3 12.14
東部 本所 2501 79 3 17.29
東部 三原支所 2384 60 3 16.48
北部 本所 841 20 3 5.81
北部 庄原支所 2007 47 3 13.88

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

(c) シェア × 密度 × 図番 3 角度 (図 3)

なぜこの図か: 路線種別の図郭シェア vs 路線シェア不一致を 左パネルで一目で示し、 中パネルで密度の階層、 右パネルで図番接頭辞の 分布 (D 系 vs N 系) を見せる 3 連結。 H1, H2 + 図番判定の補強根拠。

図 3: 路線種 × 4 軸構造 (シェア×密度×図番)
図 3: 路線種 × 4 軸構造 (シェア×密度×図番)
図番接頭辞 図郭数 シェア_%
N系 (基本図/標準) 14154 97.86
D系 (詳細図/分図) 290 2.01
その他 (A/B/C/E/G/H/I 系) 19 0.13

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

(d) 路線あたり図郭数 分布 (図 4)

なぜこの図か: 路線あたり図郭数の分布形状を Top 15 ランキング + ヒストグラムの 2 視点で示すことで、 「ロングテール vs ヘビーテール」 の判別と、 路線種別の分布形状の違い (= 整備優先度の階層) を量的に把握する。

図 4: 路線あたり図郭数 Top 15 + ヒストグラム
図 4: 路線あたり図郭数 Top 15 + ヒストグラム

路線種 路線名 図郭数
国道 375号 424
国道 432号 394
国道 186号 374
国道 433号 287
国道 486号 277
国道 183号 229
主要地方道 三原東城線 228
国道 184号 218
国道 487号 205
国道 182号 201
主要地方道 瀬野川福富本郷線 192
国道 191号 166
主要地方道 府中世羅三和線 165
国道 314号 147
主要地方道 東広島本郷忠海線 145

路線種 路線名 図郭数
一般県道 備後西城停車場線 1
一般県道 備後落合停車場線 1
一般県道 安登停車場線 1
一般県道 安浦停車場線 1
一般県道 大竹停車場線 1
一般県道 大竹美和線 1
一般県道 向洋停車場線 1
一般県道 大乗停車場線 1
一般県道 新市停車場線 1
一般県道 広停車場線 1

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

(e) 地理クラス × 路線種 クロス (図 8)

なぜこの図か: 路線種別の図郭分布が地理 (平野 / 中山間 / 沿岸島嶼) ごとにどう違うかを積み上げ棒グラフで示し、 「中山間に多い路線種 vs 平野 都市部に多い路線種」 の偏在を量的に明らかにする。

図 8: 地理クラス × 路線種 クロス積み上げ
図 8: 地理クラス × 路線種 クロス積み上げ

地理クラス 図郭数 路線数 シェア_%
平野・沿岸都市 6764 194 46.8
中山間山地 5837 124 40.4
その他/不明 1571 64 10.9
沿岸島嶼 291 8 2.0

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

【RQ2】L72 緊急輸送道路との照合研究 — 重要路線優先公開

狙い (RQ2)

RQ2 では「重要路線優先公開」仮説を量的検証する。 県地域防災計画で 指定されたL72 緊急輸送道路 (630 セグ / 2789 km)を 基準線として、 道路台帳付図 14,463 図郭が L72 の 1km 圏内にどれだけ重なるか を空間結合で量化する。 H3 (全L72 1km >=60%) は中心仮説、 H4 (国道 > 主要 > 県道 の重なり率) は「路線種 = L72 重要度」 の階層構造仮説。

手法 — 5 ステップ

  1. STEP 1: L72 NDJSON 風 JSON のパース
    L72 の 4 階層 JSON は厳密な JSON ではなく、 dict / array が「,」 区切りで 並ぶ NDJSON 風形式 (= JSON.parse 不可)。 テキストを [] でラップしてから json.loads でパースする工夫が必要。
  2. STEP 2: LineString GeoDataFrame の構築
    各セグメントの点列 ({e: 経度, d: 緯度}) を shapely.LineString に 変換、 階層 ID + GeoDataFrame に統合 → to_crs("EPSG:6671") で 平面直角第 III 系へ投影 (距離が m 単位で正確になる)。
  3. STEP 3: 1km バッファの生成
    第 1〜2 次のみ (431 セグ) と全階層 (630 セグ) について buffer(1000) を適用 → union_all() で 1 つの multi-polygon に統合。 14,463 POINT × 1 ポリゴンの intersects は ~5 秒で完了する設計。
  4. STEP 4: 14,463 図郭 × バッファ判定
    各 POINT に対し p.intersects(buf) で True/False を判定、 0/1 列として gdf に追加。 これで「L72 1km 圏内」 フラグが完成。
  5. STEP 5: 最近接 L72 距離 (sindex 活用)
    各図郭の最近接 L72 セグメントまでの距離 (km)を計算。 全 14,463 × 630 セグメントの全件距離計算は ~3 分かかるため、 sindex で 5km bbox に絞ってから p.distance(line) を計算する高速化を 実装 (~10 秒以内)。

実装

狙いと方法を踏まえた実装コードは以下の通り。 NDJSON 風パース + バッファ intersects + sindex 高速距離計算の 3 段構成。

L77_road_register.py 行 1602–1712

 1
 2
 3
 4
 5
 6
 7
 8
 9
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
1633
1634
1635
1636
1637
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
import json
import geopandas as gpd
from shapely.geometry import LineString

# (1) L72 緊急輸送道路 NDJSON 風 JSON を 4 階層分読込み
def load_l72_lines(idx):
    p = f"data/extras/L72_emergency_road/.../05_kinkyu_route_{idx}.json"
    with open(p, "r", encoding="utf-8") as f:
        text = f.read()
    arr = json.loads("[" + text + "]")  # NDJSON 風 → JSON 配列
    lines = []
    for seg in arr:
        if isinstance(seg, list) and len(seg) >= 2:
            coords = [(pt["e"], pt["d"]) for pt in seg]
            lines.append(LineString(coords))
    return lines

l72_records = []
for idx in ["01", "02", "03", "04"]:
    for ln in load_l72_lines(idx):
        l72_records.append({"rank": idx, "geometry": ln})
gdf_route = gpd.GeoDataFrame(l72_records, crs="EPSG:4326").to_crs("EPSG:6671")

# (2) 第 1〜2 次 1km バッファ + 全階層 1km バッファ
gdf_route12 = gdf_route[gdf_route["rank"].isin(["01", "02"])]
buf12 = gdf_route12.geometry.buffer(1000).union_all()
buf_all = gdf_route.geometry.buffer(1000).union_all()

# (3) 14,463 図郭 POINT × multi-polygon の intersects 判定
gdf["near_l72_12"] = gdf.geometry.apply(lambda p: 1 if p.intersects(buf12) else 0)
gdf["near_l72_all"] = gdf.geometry.apply(lambda p: 1 if p.intersects(buf_all) else 0)

# (4) 路線種別 1km 圏内率
T_l72_rank = (gdf.groupby("路線種")
              .agg(図郭数=("seg_id", "count"),
                   L72_全1km圏内=("near_l72_all", "sum"),
                   L72_第12次1km圏内=("near_l72_12", "sum"))
              .reset_index())
T_l72_rank["全1km率_%"] = (100 * T_l72_rank["L72_全1km圏内"]
                              / T_l72_rank["図郭数"]).round(1)
print(T_l72_rank)

# (5) 各図郭の最近接 L72 距離 (sindex で高速化)
sindex = gdf_route.sindex
geoms = list(gdf_route.geometry)
def nearest_km(p):
    bbox = (p.x-5000, p.y-5000, p.x+5000, p.y+5000)
    cand = list(sindex.intersection(bbox)) or list(range(len(geoms)))
    return min(p.distance(geoms[i]) for i in cand) / 1000
gdf["dist_l72_km"] = [nearest_km(p) for p in gdf.geometry]

結果と読み取り

(a) 図郭 + L72 重ね合わせマップ (図 5)

なぜこの図か: L72 の 4 階層 (赤 / 青 / 緑 / 橙) を背景線として描画し、 道路台帳付図 14,463 図郭をL72 1km 圏内 (緑) vs 圏外 (赤)で色分け点で 重ね合わせることで、 「重要路線優先公開」 仮説の空間的真偽を 1 枚で示す。 棒グラフではなく重ね合わせマップにする理由は、 「圏内・圏外の図郭がどこに 分布するか」 という地理的偏在を見るため (要件 T)。

図 5: 道路台帳付図 図郭 vs L72 緊急輸送道路 重ね合わせ
図 5: 道路台帳付図 図郭 vs L72 緊急輸送道路 重ね合わせ

l72_status 図郭数 シェア_%
第1〜2次 1km 圏内 7120 49.2
第3〜4次 1km 圏内のみ 2157 14.9
圏外 (>1km) 5186 35.9

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

(b) 路線種別 L72 1km 圏内率 + 距離分布 (図 6)

なぜこの図か: 路線種ごとの L72 1km 圏内率の階層構造を左パネルで 示し、 右パネルで距離分布の路線種別差をヒストグラムで補強する 2 視点。 H4 を量的に証明する中心図。

図 6: 路線種別 L72 1km 圏内率 + 最近接距離分布
図 6: 路線種別 L72 1km 圏内率 + 最近接距離分布

路線種 図郭数 L72_全1km圏内 L72_第12次1km圏内 全1km率_% 第12次1km率_%
国道 3356 3149 3011 93.8 89.7
主要地方道 4822 3305 2165 68.5 44.9
一般県道 6285 2823 1944 44.9 30.9

統計
最小 (km) 0.000
25% 0.006
中央 (50%) 0.260
75% 1.708
90% 3.201
最大 (km) 9.547
平均 (km) 1.027

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

【RQ3】データ公開設計研究 — 機械可読性の非対称評価

狙い (RQ3)

RQ3 では「公開設計の機械可読性評価」を行う。 道路台帳付図データセットは 2 つのリソース (ZIP 本体 1.1GB / CSV 関係資料 3.4MB) から成る非対称構造で 公開されており、 それぞれが異なる利用者層に向けて設計されている。 ZIP は 人間が PDF で道路区域・幅員を確認するための人間可読層、 CSV は機械的に 索引・統計・空間結合するための機械可読層。 これを5 軸 × 5 段階で 評価し、 学習者にとっての再利用可能性を量化する。 H5 (ZIP/CSV >=300倍) は 「機械可読層は本体の 0.3% 以下」 という非対称性の中心仮説。

手法 — 3 ステップ

  1. STEP 1: リソース容量実測
    ZIP 本体 (1,147,323,651 bytes = 1.07 GB) と関係資料 CSV (3,560,806 bytes = 3.40 MB) のサイズを実測比較。 比 = 322 倍、 CSV シェア = 0.309%
  2. STEP 2: 機械可読性 5 軸評価 (本記事独自指標)
    表構造性 / 検索性 / 大規模解析容易性 / プログラム解析 / 学習者再現性の 5 軸を 1 (不可) 〜 5 (容易) で評価。 PDF 集合は表構造性 1 (= 帯状図は OCR + 図形解析が必要)、 CSV は表構造性 5 (= pandas で即時)。 評価は本記事独自で、 公式評価尺度ではない。
  3. STEP 3: スコア比較 + 公開設計の解釈
    ZIP / CSV の平均スコアを比較し、 「PDF 集合は人間可読 / CSV は機械可読」 の 非対称性を量的に示す。 さらに「CSV があるからこそ全 14,463 PDF を機械的に 索引できる」 という非対称 2 層公開の利点も論じる。

実装

狙いと方法を踏まえた実装コードは以下の通り。 容量比は実測値、 5 軸スコアは 本記事独自の評価。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
# RQ3: 公開設計の機械可読性 5 軸評価
import pandas as pd

ZIP_BYTES = 1_147_323_651          # ZIP 本体 (PDF 集合)
CSV_BYTES = 3_560_806              # 関係資料 CSV
ratio = ZIP_BYTES / CSV_BYTES      # = 322 倍
share_csv_pct = 100 * CSV_BYTES / (ZIP_BYTES + CSV_BYTES)  # = 0.31%

# 5 軸 × 5 段階 (1=不可, 5=容易) でリソース 2 種を比較
T_machine = pd.DataFrame([
    {"評価軸": "表構造性",        "ZIP": 1, "CSV": 5},
    {"評価軸": "検索性",         "ZIP": 2, "CSV": 5},
    {"評価軸": "大規模解析容易性", "ZIP": 1, "CSV": 5},
    {"評価軸": "プログラム解析",  "ZIP": 1, "CSV": 3},
    {"評価軸": "学習者再現性",    "ZIP": 1, "CSV": 5},
])
T_machine["差"] = T_machine["CSV"] - T_machine["ZIP"]
print(T_machine)
print(f"CSV 平均 {T_machine['CSV'].mean():.1f} vs ZIP 平均 {T_machine['ZIP'].mean():.1f}")
print(f"ZIP/CSV サイズ比 = {ratio:.0f} 倍 / CSV シェア = {share_csv_pct:.3f}%")

結果と読み取り

(a) リソース容量比較 + 機械可読性 5 軸 (図 7)

なぜこの図か: 容量比 (左パネル, 対数軸) と機械可読性スコア (右パネル, 水平棒) を並置することで、 「サイズの非対称」 と「機械可読性の非対称」 が 同時並行している事実を 1 枚で示す。 棒グラフのみではなく対数軸 + スコア ヒートマップという 2 種類の表現を併用する理由は、 サイズ 322 倍差を 線形で見ると CSV が消えてしまうため。

図 7: ZIP/CSV 容量比較 + 機械可読性 5 軸スコア
図 7: ZIP/CSV 容量比較 + 機械可読性 5 軸スコア

評価軸 ZIP (PDF集合) CSV (関係資料) 備考
表構造性 (rows × cols) 1 (PDF は構造化されない) 5 (14,463 行 × 9 列) PDF は OCR + 帯状図解析が必要
検索性 (= 路線・図番から1件特定) 2 (ファイル名検索のみ) 5 (DataFrame 1 行で特定) CSV からファイル名を引くと PDF にたどり着く設計
大規模解析容易性 (= 全件統計集計) 1 (1.1GB / 14,463 PDF を順次解析) 5 (3.4MB / pandas で即時) ZIP 内 PDF を一括テキスト化するには数時間
プログラム解析 (内容アクセス) 1 (図形・幅員等は PDF 中の図のみ) 3 (位置 + メタ情報のみ、 内容は無し) CSV は "目次"、 中身は別途必要
学習者再現性 (1コマ授業内) 1 (DL 1.1GB は教室回線で 30 分超) 5 (DL 数秒) 本記事は CSV のみで完結する設計

指標
総ファイル数 (PDF) 14,463 図郭
総路線数 319 路線
ZIP 本体サイズ 1.07 GB
関係資料 CSV サイズ 3.40 MB
ZIP/CSV サイズ比 322 倍
CSV / 全データ容量比 0.309%
PDF 1 枚あたり平均サイズ 77.5 KB
L72 重要路線 1km 圏内 64.1%
中山間山地分布率 40.4%
市町判定不明 1571 件

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

(b) 公開設計の解釈 (本記事の見立て)

なぜこの解釈か: 数字だけでは見えない「非対称公開の意義」を、 学習者 が今後似たデータを扱う際の判断基準として整理する。

視点ZIP (PDF 本体)CSV (関係資料)
主目的 道路法上の法定図面の電子保管 PDF へのインデックス (索引) + 位置情報
主想定利用者 道路管理者 / 工事業者 / 占用申請者 (個別路線の現場確認) 研究者 / 学習者 / 開発者 (機械的索引・統計・空間結合)
強み 原本の完全情報 (図形 + 凡例 + 寸法) 容量小さい + 機械可読 + 1 ファイル
弱み 機械的解析不可 (1.1GB の PDF 集合) 図形・幅員・横断構成等の中身は無し
本記事の活用 取得しない (教材外) RQ1〜RQ3 すべての主データ

解釈から読み取れること:

仮説検証総合

仮説検証総合表

仮説 閾値 実測 判定
H1 (RQ1, 国道優先公開) 国道 路線<10% かつ 図郭>=20% 路線 5.64% / 図郭 23.2% 支持
H2 (RQ1, 階層的図郭密度) 国道 >= 主要 >= 県道 国道 186.4 / 主要 69.9 / 県道 27.1 支持
H3 (RQ2, L72 重なり) L72 1km 圏内 >= 60% 64.1% 支持
H4 (RQ2, 路線種 → L72 階層) 国道 > 主要地方道 > 一般県道 93.8% > 68.5% > 44.9% 支持
H5 (RQ3, 機械可読の非対称) ZIP/CSV >= 300倍 322 倍 (CSV シェア 0.309%) 支持

結果の総合解釈

3 RQ × 5 仮説の検証結果から、 広島県の道路情報公開戦略について以下の 3 つの実証的知見が得られた:

  1. (RQ1 — データ構造) 国道優先公開の階層構造
    路線種別の図郭シェア vs 路線シェアの不一致 (国道 路線 5.64% / 図郭 23.2%) と、 路線あたり図郭密度の明確な階層 (186.4 / 69.9 / 27.1) は、 県の道路情報 公開が「路線種 = 整備優先度 = 図郭密度」 という3 重の階層構造に 従っている物理的証拠。 H1, H2 ともに支持。
  2. (RQ2 — L72 照合) 防災重要路線優先公開の量的証明
    道路台帳付図の64.1%が L72 緊急輸送道路 1km 圏内に位置し、 路線種別の重なり率は国道 93.8% > 主要 68.5% > 県道 44.9%と階層的。 県の道路情報オープンデータ戦略と防災計画 は事実上一体運用されている制度横断的整備の物理的証拠。 H3, H4 ともに支持される結果。
  3. (RQ3 — 公開設計) 非対称 2 層公開の構造
    ZIP 本体 (1.07 GB) と CSV 関係資料 (3.40 MB) の容量比 322 倍、 機械可読層は本体の0.309% のみ。 これは「人間可読本体 + 機械可読インデックス」 の意図的非対称設計 で、 利用者層別に最適化された公開戦略。 H5 支持。

3 RQ を統合した「県道路情報公開」 の見立て

RQ1 〜 RQ3 を統合すると、 広島県の道路情報公開戦略は「3 重の選択的公開」 として描ける: (1) 路線種で選別 (国道優先で図郭密度を高く)、 (2) 防災で連携 (L72 重要路線と 連動)、 (3) 形式で分離 (人間可読 PDF + 機械可読 CSV の非対称 2 層)。 これは 単なる「道路情報のオープンデータ化」 ではなく、 「行政が利用者層を意識して 階層的に設計した公開戦略」であり、 オープンガバメント研究の対象として 価値がある。

発展課題

結果から導かれる新たな問い

発展課題 1: PDF 中身の機械解析 — 横断構成の自動抽出

結果 X: RQ3 で示した通り、 関係資料 CSV は位置 + メタのみで、 道路の幅員・横断構成・占用物件等の中身は PDF にしか記録されていない (機械可読性スコア 1)。
新仮説 Y: 14,463 PDF に対しOCR + 帯状図の図形認識を適用すれば、 県管理道路の幅員分布・路肩比率・歩道整備率等の横断構成統計を自動抽出 できる。 仮説: 国道は歩道整備率が一般県道より有意に高い
課題 Z: (1) 14,463 PDF を pdfplumber で 1 枚ずつテキスト化 + 帯状図領域の自動検出。 (2) 図形要素の塗り分けから車線幅・歩道幅を抽出する 画像認識モデルを訓練。 (3) 県内全路線の横断構成統計を生成し、 路線種別比較 分析 + 整備格差の可視化。 サンプリングで 100 PDF だけで予備分析するのが 現実的。

発展課題 2: 図郭中心点の代表性検証 — 1 図郭が表す距離の推定

結果 X: RQ1 / RQ2 では「図郭中心点」 1 点で 1 図郭を表したが、 実際は 数百メートルの帯状区間を 1 PDF で記録している (路線種により 200〜500m 程度)。 路線あたり図郭数 (186.4 / 69.9 / 27.1) と 路線延長の関係は明らかになっていない。
新仮説 Y: 国道の路線あたり図郭密度が高い (186.4 図郭/路線) のは 路線が長いからか、 1 図郭あたり距離が短い (= 詳細図化) からか? 仮説: 国道は路線延長が長いことが主因で、 1 図郭あたり距離は路線種によらず ほぼ一定 (~500m)。
課題 Z: (1) 全路線の連続する図郭の緯度経度間距離を計算 (= 隣接 図郭間の中心距離)。 (2) 路線種別に「1 図郭あたり平均距離」 を集計。 (3) 国道 432 号 (237 図郭) など特定路線で図郭順序 + 累積距離を可視化し、 1 PDF が表す典型距離を推定。 (4) 路線あたり総距離 (= 図郭数 × 1 図郭距離) の路線種 別差を統計検定。

発展課題 3: 道路台帳付図の経年比較 — 整備事業の時系列追跡

結果 X: 本記事は 2023-11-22 時点の道路台帳付図データを扱った。 道路台帳 は道路法上 5 年ごとの更新義務があり、 整備事業 (拡幅 / 新設 / 廃止) があれ ば次の更新で図郭が変わる。
新仮説 Y: DoBoX が今後数年に渡って道路台帳付図を更新公開すれば、 図郭追加 / 削除 / 更新を時系列で追跡することで、 県の整備優先路線が 特定できる。 仮説: 整備事業はL72 緊急輸送道路 + 中山間山地に偏在する。
課題 Z: (1) DoBoX が次回データセットを更新したら、 関係資料 CSV を新旧 比較 (路線×図番のキーで結合)。 (2) 追加 / 削除 / 緯度経度変更を分類集計。 (3) 整備 事業の地理偏在を市町別マップで可視化、 L72 重なり率と相関分析。 1 年〜2 年の スパンで継続的に観測する縦断研究。

発展課題 4: 路線種境界の検証 — 国道と主要地方道の重複区間

結果 X: RQ1 で国道 432 号は4 つの管理事務所にまたがるという 組織横断的事実を発見した。 一方、 国道と主要地方道は重複指定 (= 同じ 道路区間が 2 つの路線種に属す) があるとされる。
新仮説 Y: 道路台帳付図 14,463 図郭の緯度経度に363 件の重複がある (検出済) のは、 D 系 (詳細図) が N 系 (基本図) と同じ場所を別解像度で記録する ためだけでなく、 路線種重複指定も部分的原因か?
課題 Z: (1) 緯度経度重複 363 行を抽出し、 路線種ペアで集計。 (2) 同一座標 で「国道+主要地方道」 の組合せが何件あるか確認。 (3) 路線重複の地理分布マップ + 路線種境界の制度的曖昧さの量的記述。

発展課題 5: CSV メタの充実度評価 — 他県オープンデータとの比較

結果 X: RQ3 で広島県の道路台帳付図は位置 + 路線メタ + 管理事務所 の 9 列で公開されている。 他県 (例: 静岡県・岡山県) の同種データはどんな列を 公開しているか?
新仮説 Y: 他都道府県の道路台帳オープンデータと比較すると、 広島県は 機械可読層の充実度が中程度で、 「幅員」 「種別 (一般/自専)」 「整備年度」 等を追加すれば機械可読性スコアが大幅に向上する余地がある。
課題 Z: (1) 静岡県・岡山県・福岡県・東京都等の道路台帳オープンデータ ページを調査、 公開列を比較表化。 (2) 機械可読性 5 軸を全県で再評価。 (3) 広島県に追加すべき列の具体提案を、 制度的可能性と技術的容易性の 2 軸で 整理。