Lesson 75

道路カメラ・冬期道路情報 単独 3 研究例分析 — 142 観測地点 / 国道+主要 88.0% × 標高 ≥ 200m 75.4% × 中山間 63.4% / L02 ↔ L75 一致 92.3% を読む

L75道路カメラ冬期道路情報リアルタイム監視凍結注意チェーン規制監視ネットワーク道路特化監視重要路線優先設計凍結リスク監視ネットワーク機能分化データ層別化RQ×3Format BgeopandasPOINT (CSV)L02連携 (県内カメラ)L73連携 (winter冬期閉鎖)L74連携 (走行注意)中山間集中
所要 50 分 / 想定レベル: 中級 / データ: DoBoX dataset 1260 (4 リソース, ~9.8 MB)

データ取得手順

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

IDデータセット名
#333dataset #333
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1260道路カメラ・冬期道路情報

実行コマンド:

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

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

学習目標と問い

本記事の対象 — 「道路カメラ・冬期道路情報」 1 件 単独分析

本記事は DoBoX のデータセット 「道路カメラ・冬期道路情報」 (dataset 1260) 1 件を 単独で取り上げ、 広島県の道路カメラ・冬期道路情報 142 観測地点 / カメラ画像 ~129 枚 / 雪情報 25 地点3 つの独立した研究角度で並列に分析する記事である。 他のシリーズ (県内カメラ L02 / 事前通行規制 L73 / 走行注意 L74 / 緊急輸送 道路 L72) と本記事は 合体しない。 RQ2 で L73 winter (冬期閉鎖) と L74 (走行注意, 落石)、 RQ3 で L02 (県内カメラ, 351 台) を参照するが、 これは 「県の道路特化監視ネットワークの位置付け」 を明らかにするための既扱データの 従属的参照に留め、 本記事の主軸はあくまで道路カメラ・冬期道路情報 1 dataset の分析である。

「道路カメラ・冬期道路情報」 とは:
広島県土木建築局道路整備課が管理する道路のライブ監視カメラ路面状況リアルタイム情報(積雪深・圧雪深・気温・路面温度・路面状態) を 1 つのデータセットに統合した「道路特化リアルタイム監視ネットワーク」。 ドライバーへの情報提供 (DoBoX Web ポータル) と道路管理者の運用判断 (除雪 出動・チェーン規制決定・交通規制) の双方に使われる。

本データセットの 3 構成要素:
  • 観測所一覧 CSV (resource 32516): 142 観測地点の 位置 (緯度経度) + 路線名 + 路線番号 + 設置場所 (標高埋込) + 表示情報
  • カメラ画像 ZIP (resource 32519): ~135 枚の jpg ライブ画像 (~10 分更新) + camera_time.csv (撮影時刻)
  • 冬期道路情報 ZIP (resource 32518): 25 観測地点の 路面状態リアルタイム CSV (圧雪深・積雪深・気温・路面温度・路面状態)
本記事の主要発見 (3 RQ):
  • RQ1: 県の道路カメラは142 地点、 国道 + 主要地方道が 125 (88.0%)、 標高 ≥ 200m が 107 (75.4%)。 中山間山地に 90 地点 (63.4%)が集中、 「重要路線優先 + 山岳重点」 の物理形が確認。
  • RQ2: 雪情報 25 地点のうち L73 winter 冬期閉鎖 5km 圏内は 7 (28.0%)のみで H2 (≥ 70%) 反証 — 雪情報範囲 ≫ 冬期閉鎖範囲という2 層の冬期 道路安全制度を発見。 道路カメラ全 142 地点の L74 走行注意 5km 圏内は 132 (93.0%)で H3 (< 30%) 反証 — 県の脆弱山岳路線でL75 + L74 + L73 が多重監視する集中配置を発見。
  • RQ3: L02 道路カメラ 131 台 と L75 142 地点の 100m 圏 一致は 131 (92.3%) = 同じ物理カメラの 二重公開。 L75 独自属性 (路線番号 + 路線名 + 標高 + 表示情報 + 雪情報) で L02 の汎用カメラ網を道路特化 5 種属性で強化。

独自に定義する用語 (本記事限定)

研究の問い (3 RQ)

  1. RQ1 (主研究): 広島県の道路カメラ・冬期道路情報の地理分布と設置構造 — 路線種別 × 標高 × 市町 × 表示情報はどう描けるか? 142 観測地点を 4 軸で集計し、 「県の道路特化監視ネットワーク」 の物理形状を初めて系統的に 記述する。 H1 (国道+主要 ≥ 60% かつ 標高 ≥ 200m が ≥ 50%) を検証。
  2. RQ2 (副研究 1): 道路カメラ・冬期道路情報と冬期通行止め (L73 winter) との関連 — 雪道監視ネットワークはどう描けるか? 雪情報 25 地点と L73 winter 26 区間を 5km 圏で sjoin、 さらに L74 走行注意 (381 区間) との対比で「機能的差 — 落石 vs 凍結」 を分離する。 H2 (雪情報 winter 近接 ≥ 70%), H3 (L74 近接 < 30%) を検証。
  3. RQ3 (副研究 2): L02 県内カメラ (351 台) と L75 道路カメラ (142 地点) の棲み分け — 道路特化監視はどう描けるか? L02 の道路区分 + 県所管 (131 台) と L75 を 100m 圏で照合 → 一致率 + 属性差を量化する。 H4 (一致 ≥ 70%), H5 (L75 独自属性 ≥ 3 種) を検証。

仮説 (5)

到達点

本記事を読み終えると、 (1) 県の道路カメラ 142 観測地点・カメラ画像 ~129・雪情報 25 の物理構造を完全に俯瞰、 (2) 雪情報と L73 winter (冬期閉鎖) の補完関係 + L74 走行注意との独立性を量的に把握、 (3) L02 (汎用) と L75 (道路特化) の二重公開設計と道路特化属性の付加価値を 特定できる、 という 3 段階の知識が獲得できる。 これにより県の道路情報配信制度 における「リアルタイム情報提供 (動的) vs 静的予防情報 (規制 + 注意)」 という機能分化、 および「汎用カメラ網 (L02) ⊃ 道路特化監視 (L75)」という データ層別化設計が研究者視点で見えるようになる。

使用データ

本研究で使う 1 つの dataset (4 リソース) を以下の表に示す。 本データは「道路カメラ + 冬期道路情報」 を 1 つのカタログ単位で公開しており、 内部に 4 つの異なる形式のリソース (CSV + xlsx + winter ZIP + image ZIP) が 格納されている統合データセット。

データセット仕様

項目
dataset_id 1260
公式名 道路カメラ・冬期道路情報
公式説明 広島県が管理する道路のカメラ画像,路面状況(積雪深・圧雪深・気温・路面温度・路面状態)
リソース数 4 (CSV + xlsx + winter ZIP + image ZIP)
リソース ID 32516 (一覧 CSV) / 32517 (仕様 xlsx) / 32518 (winter ZIP) / 32519 (image ZIP)
総サイズ 10,311,855 byte (~9.8 MB)
CSV 列 観測地点ID, 観測所名, 設置場所 (標高埋込), 路線名, 緯度, 経度, 路線番号, 表示情報
レコード数 観測地点 142 (camera=117 / slip=13 / slip_camera=12)
カメラ画像数 ~135 jpg (camera + slip_camera = 129)
雪情報レコード数 25 (slip + slip_camera = 25)
座標系 (元) WGS84 (EPSG:4326) → 本記事 EPSG:6671 で処理
ライセンス クリエイティブ・コモンズ表示 (CC-BY)
URL https://hiroshima-dobox.jp/datasets/1260
作成主体 広島県 (土木建築局道路整備課・冬期道路担当)

4 リソースの内訳

リソース形式役割件数
resource 32516 (観測所一覧) CSV (UTF-8 BOM) 142 観測地点の位置 + 属性 142 行 × 8 列
resource 32517 (仕様説明) xlsx (~11 KB, 拡張子は .bin で配信) N_snow.csv と camera_time.csv の列定義 2 sheet
resource 32518 (冬期道路情報) ZIP (~4 KB, 拡張子は .json で配信) 25 観測地点の路面状態 CSV (cp932) 25 ファイル
resource 32519 (道路カメラ画像) ZIP (~10 MB, 拡張子は .json で配信) 129 観測地点のライブ画像 jpg + 撮影時刻 CSV ~135 jpg + 1 CSV

観測所 CSV の列定義

列名意味
観測地点ID1311〜158 のうち本データに含まれる ID。 N_snow.csv のファイル名にも使われる
観測所名中畑地名・施設名等
設置場所呉市安浦町大字中畑【標高106m】住所 + 標高埋込文字列。 標高は正規表現抽出
路線名主要地方道 矢野安浦線路線種別 (国道/主要地方道/一般県道) を含む
緯度34.30031WGS84
経度132.71399WGS84
路線番号広島県道34号個別路線の識別子
表示情報cameracamera (画像のみ) / slip (路面のみ) / slip_camera (両方)

N_snow.csv の列定義 (cp932 エンコーディング)

列番号意味
1観測日 (yyyy-mm-dd)2026-04-01
2観測時間 (hh:mm:ss)07:50:00
3圧雪深 (cm)0 (4 月時点 = 凍結期外)
4積雪深 (cm)0
5気温 (℃)11
6路面温度 (℃)13
7路面状態乾燥 / 湿潤 / 凍結 / 圧雪 / シャーベット / ---

形式特性の注意点

ダウンロード

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

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

このスクリプト本体

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

図 (PNG, 直 DL 可)

【RQ1】 道路カメラの地理分布と設置構造 — 路線種別 × 標高 × 市町 / 142 観測地点 / 国道+主要 88.0% / 標高 ≥ 200m 75.4%

狙い (RQ1)

RQ1 では「県の道路特化監視ネットワーク」 の物理構造を初めて系統的に 記述する。 具体的には 142 観測地点を路線種別 (国道/主要地方道/一般県道) × 標高クラス × 市町 × 表示情報 (camera/slip/slip_camera)の 4 軸で集計し、 「カメラがどの路線・どの標高・どの市町に重点配置されるか」 を 1 枚で俯瞰 できるようにする。 H1 (国道+主要 ≥ 60% かつ 標高 ≥ 200m が ≥ 50%) は 「重要路線優先 + 山岳重点設計」 の中心仮説を検証する。

手法 — 4 ステップ

  1. STEP 1: CSV パース + 路線種別判定
    観測所一覧 CSV (UTF-8 BOM, 142 行 × 8 列) を read_csv() で読込み、 路線名 列の先頭から「国道」 「主要地方道」 「一般県道」 を文字列マッチで判定する。 これは公式分類ではなく本記事の独自分類。
  2. STEP 2: 標高の正規表現抽出
    標高は CSV の独立列ではなく設置場所列に「標高Nm」 と埋込されている (例: 「呉市安浦町大字中畑【標高106m】」 → 106)。 正規表現 r"標高(\d+)m" で抽出し、 標高_m 列を派生。 欠損 (標高表記なし) は NaN。
  3. STEP 3: GeoDataFrame 化 + 投影変換
    緯度経度 → shapely.geometry.Point → GeoDataFrame に変換、 to_crs("EPSG:6671") で平面直角第 III 系に投影 → 距離・面積が m 単位で計算可能に。
  4. STEP 4: 4 軸で集計 + 中山間判定
    代表点 sjoin で市町判定 → 中山間 8 市町 vs 平野・沿岸都市 vs 沿岸島嶼を 区別。 路線種別 × 標高クラス × 表示情報 のクロス集計で監視ネットワークの 物理構造を量化。

実装 (主要部のみ抜粋)

L75_road_cameras.py 行 1594–1679

 1
 2
 3
 4
 5
 6
 7
 8
 9
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
1628
1629
1630
1631
1632
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point
import re

# (1) 観測所 CSV を読込み (UTF-8 BOM)
df = pd.read_csv("data/extras/L75_road_cameras/station_list.csv",
                 encoding="utf-8-sig")

# (2) 設置場所列から「標高Nm」 を正規表現で抽出
def extract_alt(s):
    m = re.search(r"標高(\d+)m", str(s))
    return int(m.group(1)) if m else None
df["標高_m"] = df["設置場所"].apply(extract_alt)

# (3) 路線名から路線種別 (国道/主要地方道/一般県道) を判定
def route_class(name):
    s = str(name)
    if "国道" in s: return "国道"
    if "主要地方道" in s: return "主要地方道"
    if "一般県道" in s: return "一般県道"
    return "その他"
df["路線種別"] = df["路線名"].apply(route_class)

# (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) 標高クラスでビニング
import pandas as pd
gdf["標高クラス"] = pd.cut(gdf["標高_m"],
                          bins=[-1, 100, 300, 500, 1000],
                          labels=["低 (<100m)", "中 (100-300m)",
                                  "高 (300-500m)", "山岳 (>=500m)"])

# (6) 路線種別 × 標高 集計
print(gdf.groupby("路線種別").size())
print(gdf.groupby("標高クラス", observed=True).size())
print(f"総地点数: {len(gdf)}")

結果 1: 県全域 路線種別別 マップ (図 1)

なぜこの図か: 4 種の路線種別が県内にどう分布するかを県全域地図に 重ねて一目で確認したい。 国道 (赤) + 主要地方道 (橙) + 一般県道 (青) + その他 (灰) で色分けすることで、 「国道・主要地方道に重点配置」 の物理形状が 直感できる。

図 1 (RQ1): 道路カメラ 路線種別別マップ
図 1 (RQ1): 道路カメラ 路線種別別マップ

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

結果 2: 標高色分けマップ (図 2)

なぜこの図か: H1 の標高仮説を直感検証するため、 142 地点を標高 カラーマップ (青=低 → 黄=中 → 赤=山岳) で色分けし、 県北部・西部の山岳道路 に重点配置されているかを地形に重ねて確認する。

図 2 (RQ1): 道路カメラ 標高色分けマップ
図 2 (RQ1): 道路カメラ 標高色分けマップ

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

結果 3: 路線 + 標高 + 地理クラス 3 角度 (図 3)

なぜこの図か: H1 (路線種別 + 標高) を 3 パネルで多角検証。 (1) 路線 種別別件数で「国道+主要地方道」 の支配率、 (2) 標高ヒストで 200m 閾値、 (3) 地理クラスで中山間集中度を 1 枚で見る。

図 3 (RQ1): 路線種別 × 標高 × 地理クラス
図 3 (RQ1): 路線種別 × 標高 × 地理クラス

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

結果 4: 表示情報 + 中山間境界 重ね合わせマップ (図 4)

なぜこの図か: camera (青○) / slip (橙△) / slip_camera (赤■) の 3 種を 中山間境界 (橙背景) と沿岸島嶼 (青背景) と重ねて、 表示情報の地理分布パターン (camera は全域、 slip + slip_camera は山岳集中) を地図で直接見せる。

図 4 (RQ1): 表示情報 + 中山間境界 重ね合わせ
図 4 (RQ1): 表示情報 + 中山間境界 重ね合わせ

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

結果 5: 路線・標高・地理・市町 詳細表

表示情報サマリ:

表示情報 ラベル 地点数 シェア_%
camera カメラのみ 117 82.4
slip 雪情報のみ 13 9.2
slip_camera 両方 (camera + slip) 12 8.5

表示情報 表から読み取れること: camera (117, 82.4%) が圧倒的多数。 slip (13) と slip_camera (12) を合わせた雪情報持ち = 25 地点 (17.6%) は中山間山岳道路に集中する冬期監視の中核。

路線種別サマリ:

路線種別 地点数 標高平均_m 標高中央_m 標高最大_m シェア_%
国道 75 362.0 346.0 784 52.8
主要地方道 50 328.0 310.0 667 35.2
一般県道 17 307.0 293.0 774 12.0

路線種別 表から読み取れること: 国道 が 75 (52.8%) で最多、 国道 + 主要地方道で88.0%。 標高中央値は路線種別で 異なり、 国道は中央 346 m と 山岳重点、 一般県道は低標高 (沿岸島嶼路線) を含むため中央値が低い。

標高クラスサマリ:

標高クラス 地点数 シェア_%
低 (<100m) 16 11.3
中 (100-300m) 47 33.1
高 (300-500m) 47 33.1
山岳 (>=500m) 32 22.5

標高クラス 表から読み取れること: 標高 ≥ 200m が75.4%。 山岳 (≥500m) が 32 地点 — チェーン規制重要箇所。 低 (<100m) は沿岸国道 + 県道に限定される。

地理クラス別サマリ:

地理クラス 地点数 シェア_%
中山間山地 90 63.4
平野・沿岸都市 51 35.9
沿岸島嶼 1 0.7

地理クラス 表から読み取れること: 中山間山地 が 90 (63.4%) で最多。 中山間集中度 63.4%は L73 / L74 と比較しても道路カメラが 最高水準で、 「監視ネットワーク = 中山間道路重視」 の制度設計を量的支持。

路線種別 × 標高クラス クロス:

標高クラス 路線種別 低 (<100m) 中 (100-300m) 高 (300-500m) 山岳 (>=500m)
一般県道 5 4 4 4
主要地方道 3 21 17 9
国道 8 22 26 19

クロス 表から読み取れること: 国道 + 主要地方道は標高 200-500m に集中 (山岳幹線重点)、 一般県道は標高分布が広い (沿岸-山岳混在)。 これは「国道 = 主要交通路の山岳越え 監視」 の制度位置付けを示す。

市町別サマリ (Top 15):

市町名 地理クラス 地点数
三次市 中山間山地 26
安芸太田町 中山間山地 25
庄原市 中山間山地 24
不明 (代表点が県外/海上) 平野・沿岸都市 17
安芸高田市 中山間山地 13
廿日市市 平野・沿岸都市 13
福山市 平野・沿岸都市 9
東広島市 平野・沿岸都市 5
呉市 平野・沿岸都市 4
府中市 中山間山地 2
三原市 平野・沿岸都市 2
大竹市 平野・沿岸都市 1
江田島市 沿岸島嶼 1

市町別 表から読み取れること: 三次市 (26 地点)が最多、 2 位 安芸太田町 (25 地点)、 3 位 庄原市 (24 地点)。 中山間市町 + 沿岸島嶼が上位を独占し、 平野都市部 (広島市・福山市) は限定的。

路線番号別 Top 10 (個別路線):

路線番号_clean 路線種別 地点数 標高中央_m
国道186号 国道 13 588.0
国道375号 国道 9 199.0
国道183号 国道 8 319.0
国道432号 国道 8 422.0
国道191号 国道 8 542.0
国道261号 国道 6 395.0
国道182号 国道 6 294.0
広島県道40号 主要地方道 6 544.0
国道433号 国道 5 328.0
広島県道39号 主要地方道 5 438.0

路線番号 表から読み取れること: 国道186号 が 13 地点で最多 — 県内で最も重点監視される路線。 国道 186 号 (廿日市〜山口県境の山岳越え) や 国道 375 号 (尾道〜三次の中山間縦貫) などが上位を占め、 これらは「冬期チェーン規制候補 + 落石歴あり + 主要県外接続」 の三重要素を持つ路線。

【RQ2】 冬期道路情報ネットワーク — 雪情報 ⊂ L73 winter / L75 ⊥ L74 落石注意 / 雪情報 winter 近接 28.0%

狙い (RQ2)

RQ1 で「道路カメラの構造」 が分かったが、 これはL75 単独の話。 RQ2 では「冬期道路情報ネットワーク」を 2 軸で見る: (1) 雪情報点 と L73 winter (冬期閉鎖) の補完関係(雪情報 = 冬期閉鎖の前線監視か?)、 (2) 道路カメラ全 142 地点 と L74 走行注意 (落石注意) との独立性(機能分化の検証)。 H2 (雪情報 winter 近接 ≥ 70%) と H3 (L74 近接 < 30%) の 2 仮説を検証する。

手法 — 5km バッファ + sjoin (intersects)

狙い: L73 winter (26 区間) に対して5km バッファを作成 (= 冬期 閉鎖区間 + 周辺の前線監視範囲)、 雪情報持ち地点を intersects で 近接判定。 同様に L74 (走行注意 381 区間) に対しても 5km バッファで全 142 地点の近接を判定し、 機能分化を量化。

項目意味
L75 道路カメラ 142 地点 (camera + slip + slip_camera) 本記事の主データ
L73 winter (既扱) 26 区間 / 97 km 12-3 月の冬期閉鎖区間 (機械的閉鎖)
L74 走行注意 (既扱) 381 区間 落石注意 (rakuseki_03 + rakuseki_04)
バッファ幅 5000 m (5 km) 冬期閉鎖区間 + 周辺の前線監視範囲 / 落石区間 + 周辺の地質類似範囲
近接判定 sjoin (intersects) 1 観測地点が L73/L74 buffer に含まれれば近接

注意: なぜ 5km バッファか — 道路カメラは点配置 (POINT)、 L73/L74 は LineString。 道路は山岳谷沿いに連続するため、 「同じ路線・同じ流域・同じ 地形条件」 を判定する範囲として 5 km が適切。 L74 で使った 30m / 100m は 道路敷地直近の判定だったが、 RQ2 では「機能の同一範囲かどうか」 という 広域近接性が問題。 5km は「同じ山岳谷 = 同じリスク条件」 を含む広域空間判定。

実装 (主要部)

L75_road_cameras.py 行 1821–1956

 1
 2
 3
 4
 5
 6
 7
 8
 9
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
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
1880
1881
1882
1883
1884
import json, zipfile, re
import geopandas as gpd
from shapely import wkt as swkt
from shapely.geometry import LineString

# (1) 雪情報 (N_snow.csv) を ZIP から読み込み (cp932)
snow_rows = []
with zipfile.ZipFile("data/extras/L75_road_cameras/winter_road.json") as z:
    for name in z.namelist():
        m = re.search(r"snow_data/snow/(\d+)_snow.csv", name)
        if not m: continue
        sid = int(m.group(1))
        with z.open(name) as f:
            text = f.read().decode("cp932").strip()
        parts = text.split(",")
        if len(parts) < 7: continue
        snow_rows.append({
            "観測地点ID": sid, "雪_観測日": parts[0],
            "圧雪深_cm": parts[2], "積雪深_cm": parts[3],
            "気温_C": parts[4], "路面温度_C": parts[5],
            "路面状態": parts[6],
        })

# (2) L73 winter (冬期閉鎖) を読込み LineString 化
with open("data/extras/L73_pre_traffic_restriction/pre_traffic.json",
          "r", encoding="utf-8") as f:
    raw = json.load(f)
geoms_w, rows_w = [], []
for r in raw["results"]:
    if r.get("type") != "winter": continue
    try:
        geoms_w.append(swkt.loads(r.get("kukanroot") or r.get("kukan", "")))
    except Exception: continue
    rows_w.append({"id_l73": r.get("id"), "rosen": r.get("rosenname")})
gdf_winter = gpd.GeoDataFrame(rows_w, geometry=geoms_w, crs="EPSG:4326")
gdf_winter = gdf_winter.to_crs("EPSG:6671")

# (3) 5km バッファ → 雪情報持ち地点 sjoin
gdf_winter_buf = gdf_winter.copy()
gdf_winter_buf["geometry"] = gdf_winter.geometry.buffer(5000)
buf_union = gdf_winter_buf.geometry.union_all()
gdf["near_winter_5km"] = gdf.geometry.intersects(buf_union)

# 雪情報持ち地点のうち winter 5km 圏内
mask_snow = gdf["表示情報"].isin(["slip", "slip_camera"])
n_snow_near = (mask_snow & gdf["near_winter_5km"]).sum()
print(f"雪情報点 winter 5km: {n_snow_near}/{mask_snow.sum()}")

# (4) L74 走行注意 5km 圏内 (落石注意との独立性検証)
def load_l74_lines():
    lines = []
    for level in ("rakuseki_03", "rakuseki_04"):
        p = f".../L74_caution_segments/.../04_warning_{level}.json"
        with open(p, encoding="utf-8") as f:
            text = f.read()
        for seg in json.loads("[" + text + "]"):
            if isinstance(seg, list) and len(seg) >= 2:
                lines.append(LineString([(pt["e"], pt["d"]) for pt in seg]))
    return lines
gdf_l74 = gpd.GeoDataFrame(geometry=load_l74_lines(),
                            crs="EPSG:4326").to_crs("EPSG:6671")
buf_l74 = gdf_l74.geometry.buffer(5000).union_all()
gdf["near_l74_5km"] = gdf.geometry.intersects(buf_l74)
print(f"道路カメラ 142 地点 L74 5km: {gdf['near_l74_5km'].sum()}/{len(gdf)}")

結果 1: 雪情報点 + L73 winter 重ね合わせマップ (図 5)

なぜこの図か: 「雪情報 = 冬期閉鎖の前線監視」 仮説 (H2) を 地図で直接見せる。 L73 winter (青線) + 5km バッファ (薄青塗り)、 雪情報点 (slip 橙△ + slip_camera 赤■) を重ねて、 雪情報点と冬期閉鎖区間の 空間関係 (近接 or 広域分散) を確認する。

図 5 (RQ2): 雪情報点 + L73 winter 冬期閉鎖
図 5 (RQ2): 雪情報点 + L73 winter 冬期閉鎖

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

結果 2: L74 走行注意 + 道路カメラ 重ね合わせマップ (図 6)

なぜこの図か: 「道路カメラと落石注意は独立分布」 仮説 (H3) を 地図で直接見せる。 L74 (薄橙線) + 道路カメラ全 142 地点 (路線種別色) を 重ねて、 「両者が同じ路線で重なるか? 別路線か?」 を確認する。

図 6 (RQ2): 道路カメラ + L74 走行注意 重ね合わせ
図 6 (RQ2): 道路カメラ + L74 走行注意 重ね合わせ

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

結果 3: 雪情報 × 冬期閉鎖 + L74 4 カテゴリ詳細表

雪情報点 ↔ L73 winter 近接:

カテゴリ 地点数 シェア_%
雪情報持ち + winter 5km 圏内 7 28.0
雪情報持ち + winter 5km 圏外 18 72.0

雪情報 winter 表から読み取れること: 雪情報持ち 25 地点のうち、 winter 5km 圏内が 7 (28.0%)。 H2 仮説 70% 閾値に 対して非成立。 雪情報 = 冬期閉鎖の前線 監視という制度的補完関係が 反証された (前線監視より広域分散)。

142 地点 × L74 / L73 winter 4 カテゴリ:

カテゴリ 地点数 シェア_%
winter 5km 圏内のみ 3 2.1
L74 5km 圏内のみ 109 76.8
両方 5km 圏内 23 16.2
どちらも 5km 圏外 7 4.9

4 カテゴリ 表から読み取れること: 142 地点を「L73 winter / L74 走行注意」 の 2 軸で 4 カテゴリ分類した。 winter 5km 圏内のみはチェーン規制重点、 L74 5km 圏内のみは落石注意路線にあるカメラ、 両方 5km 圏内はチェーン規制 + 落石二重リスク箇所、 どちらも 5km 圏外は平地都市部のライブカメラ。 これは「カメラがどの目的別ネットワークに属するか」 を量化する。

雪情報持ち地点の路面状態分布 (本記事観測時刻 2026-04 = 凍結期外):

路面状態 地点数
乾燥 4
欠測 14
湿潤 7

路面状態 表から読み取れること: 本記事の観測時刻は2026-04-01 07:50 (凍結期外)のため、 路面状態は 「乾燥」 「---」 (欠測) が支配的。 冬期 (12-3 月) であれば「凍結」 「圧雪」 「シャーベット」 等のカテゴリが出現するはずで、 これらは DoBoX Web ポータルで ドライバーへリアルタイム表示される。 4 月の「乾燥」 多数は冬期センサが 通年運用されている証拠でもある。

【RQ3】 L02 県内カメラとの棲み分け — 道路特化監視 / 100m 圏一致 92.3% / L75 独自属性 5 種

狙い (RQ3)

RQ1, RQ2 で「道路カメラの構造と機能」 が分かった。 RQ3 では別 dataset L02 県内カメラ (351 台横断) との棲み分けを量化する。 L02 は 道路 + 河川 + ため池 + 海岸 + 港湾 + その他の汎用カメラ網で、 L75 は道路特化。 両者の関係は「重複か独立か」、 「L02 ⊃ L75 か L75 ⊃ L02 か」、 「属性差は 何か」 を量的に解明する。 H4 (一致率 ≥ 70%) と H5 (L75 独自属性 ≥ 3 種) を 検証する。

手法 — 100m 距離マッチ + 属性差量化

狙い: L02 のうち管理区分=道路 + 所管=広島県の 131 台を 抽出 (= L75 と直接比較対象)、 100m バッファで L75 142 地点とマッチング。 さらに両 dataset の属性列差を量化し、 L75 独自の道路特化属性を特定。

dataset件数性質独自属性
L02 (1279) 県内カメラ 351 台 (全体) / 131 台 (道路区分 + 県所管) 用途横断 (道路 + 河川 + ため池 + 海岸 + 港湾 + その他) 管理区分 (用途分類) + 公開URL (ライブ視聴 URL)
L75 (1260) 道路カメラ 142 地点 道路特化 (国道 + 県道 + 主要地方道のみ) 路線番号 + 路線名 + 標高 (設置場所内) + 表示情報 + 雪情報 (圧雪深・積雪深・気温・路面温度・路面状態)

マッチング基準:

実装 (主要部)

L75_road_cameras.py 行 1594–1668

 1
 2
 3
 4
 5
 6
 7
 8
 9
1603
1604
1605
1606
1607
1608
1609
1610
1611
1612
1613
1614
1615
1616
1617
1618
1619
1620
1621
1622
1623
1624
1625
1626
1627
import pandas as pd
import geopandas as gpd
from shapely.geometry import Point

# (1) L02 県内カメラ 351 台を読込み
df_l02 = pd.read_csv("data/camera_list.csv", encoding="utf-8-sig")
df_l02 = df_l02.dropna(subset=["緯度", "経度"])

# 道路区分 + 広島県所管 のみ抽出 (L75 と直接比較対象)
df_road = df_l02[(df_l02["管理区分"] == "道路") &
                  (df_l02["所管"] == "広島県")].copy()
print(f"L02 道路カメラ 県所管: {len(df_road)} 台")

# (2) GeoDataFrame 化
geom = [Point(lon, lat) for lon, lat in zip(df_road["経度"], df_road["緯度"])]
gdf_l02 = gpd.GeoDataFrame(df_road, geometry=geom,
                            crs="EPSG:4326").to_crs("EPSG:6671")

# (3) 100m バッファでマッチング (L02 → L75 と L75 → L02 双方向)
gdf_l02_buf = gdf_l02.copy()
gdf_l02_buf["geometry"] = gdf_l02.geometry.buffer(100)
match = gpd.sjoin(gdf, gdf_l02_buf, how="left", predicate="within")
gdf["has_l02_match"] = match.dropna(subset=["index_right"]).index.isin(gdf.index)

# 一致率
n_matched = gdf["has_l02_match"].sum()
print(f"L75 ↔ L02 100m 一致: {n_matched}/{len(gdf)} = {100*n_matched/len(gdf):.1f}%")

# (4) 属性差: L75 独自属性は ?
l02_attrs = set(df_l02.columns)   # No., カメラ名, 住所, 路河川名等, 緯度, 経度, 公開URL, 所管, 管理区分
l75_attrs = set(gdf.columns) - {"geometry"}
l75_unique = l75_attrs - l02_attrs   # 路線番号, 標高_m, 表示情報, 雪情報列 等
print(f"L75 独自属性数: {len(l75_unique)}")
print(f"独自属性: {l75_unique}")

結果 1: L02 ↔ L75 重ね合わせマップ (図 7)

なぜこの図か: 「同じ物理カメラの二重公開」 を地図で直接見せる。 L02 道路のみ (紫×) + L75 のみ (橙△) + L02 ∩ L75 (緑○) の 3 色分けで、 両 dataset の棲み分けが空間的にどうなっているかを確認。

図 7 (RQ3): L02 県内カメラ ↔ L75 道路カメラ 棲み分け
図 7 (RQ3): L02 県内カメラ ↔ L75 道路カメラ 棲み分け

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

結果 2: 一致率 + 属性比較 (図 8)

なぜこの図か: H4 (一致率) と H5 (属性差) を 2 パネルで定量検証。 左パイで 3 カテゴリ件数比較、 右バーで両 dataset の件数 + 属性列数を見比べる。

図 8 (RQ3): L02 ↔ L75 一致率 + 属性比較
図 8 (RQ3): L02 ↔ L75 一致率 + 属性比較

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

結果 3: 棲み分け + 属性 詳細表

L02 ↔ L75 棲み分け 3 カテゴリ:

カテゴリ 件数
L02 道路 + L75 両方一致 (100m 圏内) 131
L75 のみ (L02 に該当なし) 11
L02 道路のみ (L75 に該当なし) 1

3 カテゴリ 表から読み取れること: L02 ∩ L75 が131 地点 = L75 の 92.3%。 これは同じ物理カメラの二重公開の量的事実。 L75 のみ (11) は L02 に登録されていない slip 単独地点 + 配信時期で L02 に未反映の新設点を含む可能性。 L02 道路のみ (1) は L75 142 地点に含まれない L02 道路カメラで、 国管理国道 (国土交通省直轄) の境界付近や対象範囲差を反映。

L02 vs L75 属性比較:

dataset 件数 道路カメラのみ 属性列数 独自属性
L02 (1279) 351 131 10 管理区分 (道路/河川/ため池/海岸/港湾/その他), 公開URL
L75 (1260) 142 142 8 路線番号 + 路線名 + 設置場所 (標高埋込) + 表示情報 (camera/slip/slip_camera) + 雪情報 (圧雪深/積雪深/気温/路面温度/路面状態)

属性比較 表から読み取れること: L02 = 351 台の用途横断データセット、 L75 = 142 地点の 道路特化データセット。 L02 は管理区分 (道路/河川/ため池/海岸/港湾/その他) で多用途検索が可能だが路線情報・標高・雪情報を持たない。 L75 は 路線番号 + 路線名 + 標高 + 雪情報の 5 種属性で道路管理者向けの精密分析 (国道別集計・標高別配置・冬期路面監視等) を可能にする。 これは「同じ物理 カメラを用途別ユーザに最適な属性レベルで提供する」 データ層別化戦略の事例。

L02 道路カメラ用途別 (参考):

応用シナリオ:

仮説検証総合

仮説検証総合 (H1〜H5)

本記事冒頭で立てた 5 仮説の検証結果を以下にまとめる。 すべての仮説の検証根拠は本記事中の図表に明示されており、 再現可能。

仮説 観測値 判定 詳細解説
H1 路線種別 + 標高: 国道+主要 ≥ 60% & 標高 ≥ 200m が ≥ 50% (RQ1) 観測 = 国道+主要 125/142 (88.0%) / 標高 ≥ 200m 107/142 (75.4%) 強支持 H1 強支持: 道路カメラ 142 地点のうち国道 + 主要地方道125 (88.0%)標高 ≥ 200m107 (75.4%)。 国道 (赤) + 主要地方道 (橙) で 県内主要交通路を、 標高 ≥ 200m の中山間 + 山岳道路に重点配置という 「重要路線優先設計」 の物理形が実証された。 標高最大は784 m (廿日市市吉和の国道 186 号沿い 700m 級峠)、 標高中央318 m。 これは「ライブカメラ = 平地都市部の防犯カメラ」 の常識を覆し、 「道路カメラ = 山岳重要路線のリアルタイム監視装置」という制度設計を量化。
H2 雪情報 ⊂ 冬期閉鎖 5km 圏内: ≥ 70% (RQ2) 観測 = 雪情報点 winter 5km 圏内 7/25 (28.0%) 反証 H2 反証: 雪情報を持つ 25 地点 (slip + slip_camera) のうち、 L73 winter 冬期閉鎖区間 (26 区間 / 97 km) の 5km 圏内に位置するのは 7 地点 (28.0%) のみで、 70% 閾値に届かない。 これは 「雪情報範囲 ≫ 冬期閉鎖範囲」という重要な発見を意味する: 県は 冬期閉鎖 (26 区間 / 97 km) よりはるかに広い 範囲(残り 18 地点 = 72.0%) で雪情報監視を行っている。 つまり雪情報は 「冬期閉鎖の前線監視」 ではなく「冬期閉鎖されない区間の通行可否判断 + 自主的予防対策の根拠データ」として広域配置されている。 これは 「L73 winter = 自動規制 (狭い)、 L75 雪情報 = 全県凍結監視 (広い)」という2 層の冬期道路安全制度を量的に発見した — 規制発動の自動判断は 限定路線、 凍結リスク広域監視は L75 が担う制度分化。
H3 L75 ⊥ L74 走行注意: L74 近接 < 30% (RQ2) 観測 = 142 地点 L74 5km 圏内 132 (93.0%) 反証 H3 反証: L75 道路カメラ 142 地点のうち L74 走行注意 (381 区間) 5km 圏内に位置するのが 132 地点 (93.0%)と、 30% 閾値を大幅に上回る。 これは「道路カメラと落石注意は独立」 という 当初仮説を反証する重要な発見である: 県の主要山岳道路では道路カメラ が L74 走行注意区間と同じ路線群に設置されている。 これは「同じ脆弱地形 = 同じ路線」 であり、 制度目的は異なる (L74 = 静的予防情報 / L75 = リアル タイム監視) が、 物理的には共通の山岳重要路線群に集中する。 つまり 「県の脆弱山岳道路網」は L74 の落石静的予防、 L75 の凍結 + 路面 動的監視、 L73 の雨量自動規制、 という 3 制度で多重に監視される。 H3 反証は「機能分化と空間集中の同時成立」 という制度設計の発見。
H4 L02 ↔ L75 100m 圏一致 ≥ 70% (RQ3) 観測 = L75 ↔ L02 100m 圏一致 131/142 (92.3%) 強支持 H4 強支持: L02 (dataset 1279) の道路区分 + 広島県所管 131 台 と L75 (dataset 1260) の 142 地点を 100m 圏で照合した一致は 131/142 = 92.3%。 同じ物理カメラが両 dataset に登録される「データセット重複公開」を量的に 確認した。 L02 = 用途横断 (道路+河川+ため池+海岸+港湾) の汎用 dataset、 L75 = 道路特化 + 雪情報統合の専門 dataset で、 同じカメラを異なる属性セットで 提供する「制度的二重公開」の存在を実証。
H5 L75 独自属性 ≥ 3 種 (RQ3) 観測 = L75 独自属性 = 路線番号 + 路線名 + 標高 (設置場所内) + 表示情報 + 雪情報 = 5 種 強支持 H5 強支持: L75 が L02 に対して持つ独自属性は(1) 路線番号 (国道 186 号 / 県道 30 号 等)(2) 路線名 (主要地方道 矢野安浦線 等)(3) 標高 (設置場所列に「標高Nm」 と埋込)(4) 表示情報 (camera/slip/slip_camera)(5) 雪情報 (圧雪深・積雪深・気温・路面温度・路面状態)の 5 種。 L02 単独では「国道 186 号沿いのカメラを抽出」 や 「標高 500m 以上の山岳カメラを集計」 が不可能だが、 L75 を併用すれば これらの道路特化分析が実装可能。 L02 vs L75 の「汎用 vs 専門」 二重公開設計は、 用途別ユーザに異なる属性レベルを提供する「データ層別化」戦略の量的事例。

主要発見の整理

  • RQ1 主発見: 県の道路カメラは142 観測地点、 国道 + 主要地方道が88.0%、 標高 ≥ 200m が 75.4% (H1 強支持)。 中山間山地に 63.4%集中し、 標高最大 784 m。 これは「重要路線優先 + 山岳重点設計」 という県の道路特化監視 ネットワーク制度を初めて系統的に記述。
  • RQ2 主発見: 雪情報持ち 25 地点のうち L73 winter 5km 圏内が 7 (28.0%) (H2 反証)。 道路カメラ全 142 地点の L74 5km 圏内が 132 (93.0%) (H3 反証)。 H2 反証 = 雪情報範囲 ≫ 冬期閉鎖範囲という重要発見: L73 winter (26 区間 / 97 km) は限定的自動規制 路線、 L75 雪情報は全県凍結監視として広域配置される2 層の冬期 道路安全制度を量的同定した。 H3 反証 = 県の脆弱山岳路線で 多重制度監視: L75 道路カメラ (93.0%) ・ L74 走行注意 (381 区間) ・ L73 winter (冬期閉鎖) が同じ山岳重要路線群に 重畳配置される「3 制度多重監視」を発見。
  • RQ3 主発見: L02 道路カメラ 131 台 と L75 142 地点の 100m 圏一致は131 (92.3%) (H4 強支持)。 L75 独自属性 = 路線番号 + 路線名 + 標高 + 表示情報 + 雪情報 = 5 種 (H5 強支持)。 これは 「同じ物理カメラの二重公開」 + 「データ層別化」戦略の量的事例で、 汎用横断 dataset (L02) と道路特化 dataset (L75) が用途別ユーザに最適な 属性レベルを提供する設計を実証。

本記事の独自貢献

  1. 「道路特化監視ネットワーク」 の概念定量化: 道路カメラ + 冬期道路 情報 142 観測地点を路線種別 × 標高 × 表示情報 × 市町の 4 軸で初めて系統的に集計。 県の道路特化監視が「国道+主要地方道 88.0% × 標高 ≥ 200m 75.4% × 中山間集中 63.4%」という制度に整理されていることを実証。
  2. 「冬期道路安全 2 層制度」 の発見: L75 雪情報 (25 地点) と L73 winter (26 区間 / 97 km) の 5km 圏 sjoin で 雪情報範囲 ≫ 冬期閉鎖範囲(雪情報 winter 5km 圏内 28.0%) を発見。 「規制 (狭い自動閉鎖) + 監視 (広い凍結状態把握)」 の2 層補完 設計を量的同定。 H2 反証は「前線監視」 仮説の修正 → 「広域監視 + 限定 規制」 という新しい制度像の発見。
  3. 「3 制度多重監視」 概念フレームの提案: L75 動的監視 (カメラ + 雪情報) + L74 静的予防情報 (落石注意) + L73 winter 自動規制 (冬期閉鎖) が県の脆弱山岳路線群に多重配置される構造を 5km 圏 sjoin で量化 (93.0% が L74 近接)。 H3 反証は「機能分化」 仮説の修正 → 「機能は分化しつつ空間的に集中する」 という制度設計の発見。 「重要路線 への制度集中投資」 の物理形を初めて記述。
  4. 「データ層別化」 戦略の事例研究: L02 (汎用 351 台) と L75 (道路特化 142 地点) の 100m 圏マッチで「同じ物理カメラの二重公開」を 量的に確認。 用途別ユーザ (一般市民 vs 道路管理者) に異なる属性レベルを 提供する制度設計を「データ層別化」 として概念化。
  5. L02 + L73 + L74 との横断連携 (4 dataset 統合): 道路カメラ (L75, 1 dataset) + 県内カメラ (L02, 既扱) + 事前通行規制 winter (L73, 既扱) + 走行注意 (L74, 既扱) の 4 dataset を sjoin で組合わせ、 県の道路情報配信制度ネットワークに道路カメラを位置付ける初の 研究。
  6. 「設置場所列の標高埋込」 解読パターン例示: 公開 CSV の 「設置場所」 列に「標高Nm」 形式で埋め込まれた数値を正規表現で抽出する 手法を例示。 公式属性化されない情報を実装で復元する実用パターン。
  7. 「N_snow.csv の cp932 エンコーディング + 列名なし形式」 解読: ZIP 内 25 ファイルの shift JIS CSV を一括パース、 ファイル名から 観測地点 ID を抽出して結合する手法を例示。

本記事の限界

発展課題

発展課題 — 結果 X → 新仮説 Y → 課題 Z 形式

発展課題 1 (RQ1 拡張): 標高欠損地点の DEM 補完

発展課題 2 (RQ1 拡張): 路線交通量との相関分析

発展課題 3 (RQ2 拡張): 冬期連続観測データでの凍結検出精度評価

発展課題 4 (RQ2 拡張): カメラ画像 CV 解析による自動路面判定

発展課題 5 (RQ3 拡張): L02 用途別カメラ網の比較分析

発展課題 6 (展望): 道路カメラと走行データのリンク (Connected Vehicle 連携)

発展課題 7 (展望): SNS 走行報告との統合 — 集合知の活用