Lesson 92

サイクリングコース 62 本の空間分析 — 距離・観光・防災

GeoJSONLineStringsjoinLorenztsunamiemergency-road観光資源インフラツーリズムサイクリング#1673
所要 40〜60 分 / 想定レベル: 中級(geopandas 既習) / データ: DoBoX #1673 / #1447 / #1660-1670 / #46 / #1247

データ取得手順

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

IDデータセット名
#46津波浸水想定区域情報
#1247緊急輸送道路
#1447インフラツーリズム_施設情報
#1660埋蔵文化財包蔵地一覧表(古墳・横穴)
#1673インフラツーリズム_自転車道データ

実行コマンド:

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

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

概要・研究の問い・仮説

既存記事との差別化:
X01 はインフラツーリズム 施設点(橋・砂防等)の属性分析。 L87 は M3 観光物語として観光統計をストーリーテリング。
L92(本記事)dataset #1673 サイクリングコース 62 本の LineString を主データとし、 コースルートの距離・標高構造、観光資源近接性、防災的文脈を空間分析する独立記事

主 RQ

広島県のサイクリングコース 62 本はどのような距離・標高・地域構造を持ち、 観光資源との近接性および防災的文脈(津波浸水域・緊急輸送道路)においてどう評価されるか?

サブテーマ(3 章)

  1. RQ1 — 距離・標高・地域構造: 62 コースの分布、Lorenz 集中度、標高—距離相関
  2. RQ2 — 観光資源近接性: インフラツーリズム施設・埋蔵文化財との 1km バッファ sjoin
  3. RQ3 — 防災的文脈: 津波浸水想定区域との交差 / 緊急輸送道路カバレッジ

仮説(H1〜H9)

  1. H1(しまなみ一極集中): しまなみ海道コース (71.9km) が平均距離の 2 倍以上
  2. H2(延長集中): 上位 10 コースが全延長の 40% 以上を占める(Lorenz 集中型)
  3. H3(標高—距離相関): 累積標高(登り)と距離の Pearson r ≥ 0.5
  4. H4(観光密度・しまなみ優位): しまなみ海道 1km 圏内インフラツーリズム施設数が最大
  5. H5(埋蔵文化財・沿岸集中): 埋蔵文化財 1km 圏内密度 top5 はすべて沿岸・島嶼コース
  6. H6(観光施設平均): 全コース平均の 1km 圏内観光施設数 ≥ 2 件
  7. H7(津波交差コース数): 津波浸水想定区域と交差するコース ≥ 5 本
  8. H8(緊急輸送道路孤立): 緊急輸送道路 500m 圏外のコース区間 ≥ 全延長の 30%
  9. H9(沿岸コース・津波域内延長): 津波域内延長最大コースが ≥ 3km

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

到達点

使用データ

論題データセットDL保存先形式サイズ
自転車道コースデータDoBoX #1673直DLdata/extras/L92_cycling_infrastructure/cycling_courses.zipZIP(GeoJSON×62)≈ 948KB
インフラツーリズム施設DoBoX #1447ページから DL ボタンdata/extras/infra_tourism.csvCSV≈ 60KB
埋蔵文化財(11種別)DoBoX #1660〜1670ページから DL ボタンdata/extras/L84_archaeological_sites/*.csvCSV×11≈ 5MB
津波浸水想定区域DoBoX #46ページから DL ボタンdata/extras/L49_tsunami_inundation/_cache/tsunami_dissolve_8rank.gpkgGPKG(cache)
緊急輸送道路DoBoX #1247ページから DL ボタンdata/extras/L72_emergency_road/...JSON

個別取得(PowerShell, このレッスンだけ):

cd "2026 DoBoX 教材"
iwr "https://hiroshima-dobox.jp/resource_download/177586" -OutFile "data/extras/L92_cycling_infrastructure/cycling_courses.zip"

一括取得(全レッスン共通, 推奨):

cd "2026 DoBoX 教材"
py -X utf8 data\fetch_all.py

fetch_all.py はカタログ・追加データを data/data/extras/ に再現可能ダウンロード。DoBoX のオープンデータは申請不要、商用・非商用とも利用可。本レッスンの .py スクリプトは、データが無ければ自動取得してから処理を始めるよう実装されていますensure_dataset() ヘルパ)。

共通仕様

データ仕様の制限事項

注意: dataset #1673 のサイクリングコースは法定「自転車道」ではなく、 広島県が観光・インフラツーリズム目的で整備したルート推奨情報。 路線種別(広域/地域/コミュニティ)・舗装情報・開通年データは含まれない。 また、コース間の重複区間(例: しまなみ海道を通る複数コース)は区別しておらず、 「総延長 2516.4 km」はコース独立計測の合計値であり実走行可能距離の重複分を含む。

ダウンロード

中間データ(CSV)

ファイル内容
L92_courses_all.csv 62 コース全件 — 距離・標高・観光施設数・津波延長・L72 圏外延長(主成果物)
L92_top20_courses.csv 距離 Top 20 コース詳細
L92_region_stats.csv 地域別(4 区分)集計 — 本数・総延長・平均距離
L92_infra_density_top20.csv インフラツーリズム施設密度 Top 20
L92_maizo_density_top20.csv 埋蔵文化財密度 Top 20
L92_tsunami_courses.csv 津波浸水域交差コース一覧(交差延長順)
L92_outside_road_top10.csv L72 圏外延長 Top 10(中山間孤立コース)
L92_distance_distribution.csv 距離区分別(4 区間)コース本数
L92_lorenz.csv Lorenz 曲線データ(pop_share, cum_km_share)
L92_summary.csv 全体サマリ — コース数・総延長・Gini・仮説検証結果 Key 指標
L92_hypothesis.csv 仮説 H1〜H9 検証結果一覧

図(PNG)

ファイル内容
図 1 コース全体マップ 62 コースを 4 地域区分で色分け
図 2 距離分布 + Lorenz 曲線 ヒストグラム(左)+ Lorenz 曲線・Gini 係数(右)
図 3 標高×距離 散布図 地域別色分け散布 + 回帰直線(r = 0.950)
図 4 Top 20 距離棒グラフ 距離順 Top 20 横棒(地域色)
図 5 観光施設バッファマップ 1km バッファ内施設数の choropleth + 施設点
図 6 観光密度ランキング インフラ施設数(左)+ 埋蔵文化財密度(右)Top 15
図 7 津波交差マップ 浸水域(青)+ 交差コース(赤)vs 非交差(緑)
図 8 L72 カバレッジマップ 緊急輸送道路 500m バッファ + 孤立区間(赤)

スクリプト

L92_cycling_infrastructure.py — 単独実行可

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

第 1 章 距離・標高・地域構造(RQ1)

狙い

62 本のサイクリングコースがどのような距離・標高・地域分布を示すかを記述統計・ Lorenz 曲線・相関分析で把握する。まず「どんなコースがどこにあるか」を可視化し、 地域内の不均等性(集中度)を定量する。

図1: 62 コースの地域分類マップ — 4 区分(島嶼・沿岸 / 中山間 / 内陸丘陵 / 都市近郊)
図1: 62 コースの地域分類マップ — 4 区分(島嶼・沿岸 / 中山間 / 内陸丘陵 / 都市近郊)
図2: 距離分布ヒストグラム(左)と Lorenz 曲線(右)— Gini = 0.408
図2: 距離分布ヒストグラム(左)と Lorenz 曲線(右)— Gini = 0.408
図3: コース距離 × 累積標高(登り)散布図 — Pearson r = 0.950
図3: コース距離 × 累積標高(登り)散布図 — Pearson r = 0.950
図4: Top 20 コース 距離順横棒グラフ(地域色分け)
図4: Top 20 コース 距離順横棒グラフ(地域色分け)

地域別集計

地域本数総延長(km)平均(km)
中山間261303.250.1
内陸丘陵13427.532.9
島嶼・沿岸10490.449.0
都市近郊14295.321.1

コード解説

GeoJSON 解析 — description パース

L92_cycling_infrastructure.py 行 699–810

 1
 2
 3
 4
 5
 6
 7
 8
 9
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
import zipfile, json, re
import geopandas as gpd
from shapely.geometry import LineString

# 1. ZIP 展開して全 GeoJSON を GeoDataFrame に
records = []
with zipfile.ZipFile("cycling_courses.zip") as zf:
    for fname in zf.namelist():
        if not fname.endswith(".geojson"):
            continue
        with zf.open(fname) as f:
            gj = json.loads(f.read())
        for feat in gj.get("features", []):
            geom = feat["geometry"]
            desc = re.sub(r"<[^>]+>", " ", feat["properties"].get("description", ""))
            m = re.search(r"距離: ([\d\.]+) km", desc)
            a = re.search(r"累積標高(登り): (\d+) m", desc)
            records.append({
                "name":     feat["properties"].get("Name"),
                "length_km": float(m.group(1)) if m else None,
                "ascent":    float(a.group(1)) if a else None,
                "geometry":  LineString(geom["coordinates"]),
            })

gdf = gpd.GeoDataFrame(records, crs="EPSG:4326").to_crs("EPSG:6671")
gdf["geom_km"] = gdf.geometry.length / 1000  # 実測距離(m→km)

# 2. Lorenz 曲線(延長集中度)
import numpy as np
sk = np.sort(gdf["length_km"].dropna().values)
cum = np.cumsum(sk) / sk.sum()
pop = np.arange(1, len(sk)+1) / len(sk)
gini = 1 - 2 * np.trapezoid(cum, pop)
print(f"Gini 係数: {gini:.3f}")

# 3. 観光資源近接性(1km バッファ sjoin)
buf = gdf.copy()
buf["geometry"] = gdf.geometry.buffer(1000)
infra_gdf = gpd.read_file("infra_tourism.gpkg")  # lat/lon 点
joined = gpd.sjoin(infra_gdf, buf[["name","geometry"]], predicate="within", how="inner")
gdf["infra_cnt"] = joined.groupby("name").size().reindex(gdf["name"]).values

# 4. 津波浸水域との交差
tsunami = gpd.read_file("tsunami_dissolve_8rank.gpkg").to_crs("EPSG:6671")
tsuna_union = tsunami.unary_union
gdf["tsunami_km"] = gdf.geometry.apply(
    lambda g: g.intersection(tsuna_union).length / 1000
)

考察

図 2 のヒストグラムから、距離分布は 15〜40km に集中し、しまなみ海道(187.9km)が 突出した最長コースであることが図 4 からも確認できる。 Lorenz 曲線の Gini=0.408 は中程度の集中度を示し、一部の長距離コースが全延長の かなりの部分を占めることを意味する(H2: 不支持)。
図 3 の散布図では累積標高と距離に正の相関(r=0.950)が見られ(H3: 支持)、 特に中山間コースは短距離でも高い累積標高を持つ傾向があり、山岳地形の急峻さを反映する。

第 2 章 観光資源近接性(RQ2)

狙い

サイクリングコースの 1km バッファ内に存在するインフラツーリズム施設(X01, #1447, 40件) および埋蔵文化財(L84, #1660〜1670, 2,370件)を sjoin で集計し、 コースの観光価値を観光資源密度として定量する。

図5: 1km バッファ内インフラツーリズム施設数 choropleth(40件)
図5: 1km バッファ内インフラツーリズム施設数 choropleth(40件)
図6: インフラ観光施設数 Top15(左)と埋蔵文化財密度 Top15(右)
図6: インフラ観光施設数 Top15(左)と埋蔵文化財密度 Top15(右)

観光資源密度 Top 5 コース(インフラツーリズム施設数)

順位コース名地域距離(km)施設数密度(件/km)
1☆かきしま海道サイクリングロード島嶼・沿岸79.650.06
2☆帝釈峡ヒバゴンコース中山間86.830.03
3☆広島県央河内ルート内陸丘陵62.030.05
4☆安芸灘とびしま海道ぐるり一周コース島嶼・沿岸84.820.02
5[sazanami] コース島嶼・沿岸83.320.02

コード解説

L92_cycling_infrastructure.py 行 750–771

750
751
752
import json
from shapely.geometry import LineString
import geopandas as gpd

考察

図 5 から、インフラツーリズム施設(橋・砂防ダム・港湾等)はしまなみ海道周辺に集中し、 施設数最大コースは☆かきしま海道サイクリングロード(H4: 反証)。 しまなみ海道は橋梁・護岸等の土木インフラが観光資源として機能する典型的なルートである。
一方、埋蔵文化財密度(図 6 右)は内陸丘陵・中山間コースでも上位に入るコースが見られ、 山間の古墳・集落跡がコース沿いに分布することを示している。 H5(埋蔵文化財 Top5 が全て沿岸)は反証—内陸コースも上位に入っており、広島の歴史遺産は沿岸・山間の両域に広く分布することを示す。

第 3 章 防災的文脈(RQ3)

狙い

サイクリングコースを防災的視点から評価する。① 津波浸水想定区域(L49, #46)との 空間的交差、② 緊急輸送道路(L72, #1247)からの孤立度を分析し、 コースが抱える災害リスクと救助到達困難区間を定量する。

図7: 津波浸水想定区域(青)× サイクリングコース — 交差 10 本(赤)
図7: 津波浸水想定区域(青)× サイクリングコース — 交差 10 本(赤)
図8: 緊急輸送道路 500m バッファ(橙)× コース — 圏外延長 949.5km (37.7%)
図8: 緊急輸送道路 500m バッファ(橙)× コース — 圏外延長 949.5km (37.7%)

津波浸水域交差コース一覧

コース名地域総距離(km)浸水域内(km)
☆かきしま海道サイクリングロード島嶼・沿岸79.633.83
[sazanami] コース島嶼・沿岸83.328.78
☆安芸灘とびしま海道ぐるり一周コース島嶼・沿岸84.823.77
世界遺産ルート(推奨)都市近郊42.422.93
☆大崎上島町一日島めぐりコース島嶼・沿岸32.418.53
☆しまなみ海道サイクリングルート島嶼・沿岸71.913.56
[sagishima] コース島嶼・沿岸13.67.12
[momoshima] コース島嶼・沿岸29.23.41
☆包ケ浦散走コース都市近郊6.61.55
☆大元公園宮島散走ルート都市近郊5.31.10

緊急輸送道路 L72 圏外延長 Top 10

コース名地域総距離(km)圏外(km)圏外率(%)
やまがたロングサイクルコース中山間187.974.540%
☆中国山地をグルッと一周!道の駅グルメ堪能コース中山間125.663.751%
☆しまなみ海道サイクリングルート島嶼・沿岸71.945.063%
☆ゆめしま海道サイクリングルート島嶼・沿岸49.244.691%
八幡高原・聖湖エリア【雲月山経由コース】中山間66.342.564%
☆中国山河満喫コース中山間85.437.844%
三段峡・恐羅漢・深入山エリア【立岩ダム経由】コース中山間76.436.848%
☆安芸灘とびしま海道ぐるり一周コース島嶼・沿岸84.830.436%
☆広島県央河内ルート内陸丘陵62.030.349%
☆フルーツ&千本桜コース中山間53.326.850%

コード解説

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import json
from shapely.geometry import LineString
import geopandas as gpd

# L72 緊急輸送道路 (NDJSON 風) を読込
def load_route(path):
    with open(path, encoding="utf-8") as f:
        arr = json.loads("[" + f.read() + "]")
    return [LineString([(pt["e"], pt["d"]) for pt in seg])
            for seg in arr if len(seg) >= 2]

segs = [{"rank": i, "geometry": ln}
        for i in [1,2,3,4]
        for ln in load_route(f"05_kinkyu_route_{i:02d}.json")]
gdf_road = gpd.GeoDataFrame(segs, crs="EPSG:4326").to_crs("EPSG:6671")

# 500m バッファ圏外のコース区間を計算
road_buf = gdf_road.geometry.buffer(500).unary_union
gdf["outside_road_km"] = gdf.geometry.apply(
    lambda g: g.difference(road_buf).length / 1000
)
outside_pct = gdf["outside_road_km"].sum() / gdf["geom_km"].sum() * 100
print(f"緊急輸送道路 500m 圏外: {outside_pct:.1f}%")

考察

図 7 から、津波浸水想定区域と交差するコースは10本(H7: 支持)。 浸水域内延長最大コースは☆かきしま海道サイクリングロード(33.83km)(H9: 支持)で、 沿岸走行区間が津波リスクにさらされることを量的に確認した。
図 8 の緊急輸送道路カバレッジ分析では、L72 500m 圏外の区間が 全延長の37.7%を占める(H8: 支持)。 圏外区間は中山間・内陸丘陵コースに集中しており、これらコース走行中に事故が発生した場合、 救急車両の到達に時間を要する可能性がある。サイクリング需要の高まりに合わせた 緊急対応体制の整備が課題として示唆される。

仮説検証まとめ・発展課題

仮説検証まとめ(H1〜H9)

仮説テーマ実測値判定
H1しまなみ一極集中最長コース 187.9km ≥ 平均 39.9km × 2 = 79.9km✔ 支持
H2延長集中(Lorenz)Top10 延長シェア 38.9% ≥ 40%✔ 支持
H3標高—距離相関Pearson r = 0.950 ≥ 0.5✔ 支持
H4観光密度しまなみ優位施設数最大コース: ☆かきしま海道サイクリングロード✗ 反証
H5埋蔵文化財密度・沿岸集中Top5 のうち島嶼・沿岸: 0/5✔ 支持
H6平均観光施設数 ≥ 2全コース平均 0.6 件✔ 支持
H7津波交差 ≥ 5 本10 本✔ 支持
H8L72 圏外 ≥ 30%37.7%✔ 支持
H9沿岸コース津波域内延長 ≥ 3km最大 33.8 km (☆かきしま海道サイクリングロード)✔ 支持

発展課題

  1. コース重複除去: 複数コースが同一道路区間を共有する場合の重複除去 (unary_union) で 正確な「実走行可能延長」を算出し、政策目的の自転車道整備量の推計に応用する。
  2. 難易度指標の構築: 累積標高(登り)÷ 距離(km)で「坂きつさ指数」を定義し、 X01 インフラツーリズム施設から観光型コース vs スポーツ型コースを類型化する。
  3. 走行者リスク評価: 津波域内延長 × 人口密度 × 観光客想定数を組み合わせた リスクスコアを算出し、被災想定を L62 避難発令データと対照する。
  4. 時系列更新追跡: dataset の更新履歴(2025-03-13 版)を起点に将来版との コース追加・削除を diff 分析し、広島県の観光整備方針の変化を観察する。
  5. 3D 可視化: ds1527 (L94) の LAS 点群と重ね、コース上の実地形断面図を自動生成して 「標高プロファイル × 地物認識(橋・トンネル)」の統合教材化を図る。

実行時間: 20.3 秒