Lesson 40

L40 標高図 2件統合分析 — DEM が描く地形高度構造 と 浸水想定の物理的論理 と LiDAR ファミリの「根」

LiDAR標高図DEMDTMrasterioHypsometric IntegralStrahler 1952洪水浸水想定rasterizePearson相関L39連携地形成熟度
所要 20-30 分 / 想定レベル: リテラシ + GIS応用 / データ: DoBoX dsid 1635 + 1636 (標高図 1m + 50cm), 代表 3 自治体 GeoTIFF (Float32 m, T.P.)

データ取得手順

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

IDデータセット名
#222dataset #222
#444dataset #444
#666dataset #666
#888都市計画区域情報_区域データ_安芸高田市_行政区域
#1635標高図(1m)
#1636標高図(50cm)

実行コマンド:

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

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

学習目標と問い

カバー宣言: 本記事は DoBoX のシリーズ 「標高図 1m / 50cm」 2 件 (dataset_id = 1635, 1636) を統合し、広島県 3 自治体エリア (世羅町 1m / 熊野町 1m / 坂町 50cm) の 標高分布を 量的に解析する研究記事です。さらに L08 で扱った洪水浸水想定区域 Shapefile を空間結合し、 「浸水想定は本当に低標高地に指定されているか」を量的に検証します。 最後に L39 (地形傾斜図) と同自治体ペアでピクセル単位の Pearson 相関を取り、 「z (本記事) と arctan|∇z| (L39)」の派生関係がデータに刻まれているかを確認します。

本記事の独自性 — LiDAR ファミリの「根」と地形成熟度

標高図 (DEM) はあらゆる地形解析の物理的な根です。 L36 樹高 (DSM-DTM)、L37 点群密度、L38 CS立体図 (曲率×傾斜)、L39 傾斜 — これらすべてが 本データから派生します。本記事は LiDAR ファミリの5 本目 (= 完結篇)として、以下の 4 軸で独自分析を行います:

シリーズ構造判定: (a) 同一手法・解像度違い + (b) 自治体ごとの分割

このシリーズは 1m 版 / 50cm 版 の 2 解像度系統で、各自治体ごとに GeoTIFF (Float32 m) を切り出して公開する構造。 1m 版は 22 自治体、50cm 版は 12 自治体。

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

用語定義
DEM (Digital Elevation Model)地表の標高を格子状に記録したラスタの総称。 日本では 5m メッシュ・1m メッシュ・50cm メッシュなど多解像度で整備される。 本記事の TIFF は LiDAR (航空レーザ計測) 由来の DTM (= 地表面のみの DEM)。
DTM (Digital Terrain Model)地表面のみを記録した DEM。 樹木・建物などを除去 (グラウンド分類) した値。本記事の標高図は DTM。 L39 傾斜・L38 CS立体図はこの DTM から派生。
DSM (Digital Surface Model)地表面 + 樹冠 + 建物を含む DEM。 LiDAR の最上面パルスから生成。L36 樹高は DSM - DTM
標高 (Elevation)各ピクセルの絶対高さ (m)。基準面は T.P. (東京湾平均海面)。 水平面 = 0m が定義上の海面、負値 = 海抜下 (干拓地・埋立地で観察)。
T.P. (Tokyo Peil)東京湾の平均海面を 0m とする日本の標高基準。 霊岸島 (隅田川河口) の量水標で 1873-1879 に観測された平均値が原点。 日本の地形図はすべてこの基準を使う。
標高 5 階級 (本記事独自定義, 自然地理学標準) 海抜下 (<0m), 低地 (0-10m), 平地 (10-100m), 丘陵 (100-500m), 山地 (>500m) の 5 段階。 10m は津波・高潮の経験的浸水上限、100m は沖積平野と段丘・丘陵の地形境界、 500m は山地と丘陵の慣用境界を反映する。
低地 (lowland)本記事では標高 10m 未満のセルを指す。 津波・高潮・洪水・河川氾濫のリスクが高い地形帯。 広島県の沿岸都市 (広島市・呉市・坂町・尾道市) の市街地中心部はこの帯に含まれる。
山地 (mountain)標高 500m 超のセル。 広島県では備北山地・中国山地の脊梁部に該当。
ヒプソメトリック曲線 (Hypsometric curve)正規化標高 h*=(h-h_min)/(h_max-h_min) と 正規化累積面積 a*=N(h≥h_i)/N_total の曲線。Strahler (1952) が提案。 曲線の下面積 = HI (Hypsometric Integral) が地形成熟度の指標。 HI ≥ 0.55 = 若年地形 (削剥前の高原), HI < 0.4 = 老年地形 (削剥末期)。
HI (Hypsometric Integral)ヒプソメトリック曲線の積分値。 台形則で計算: HI = ∫₀¹ a*(h*) dh*。本記事は 50 ビンの台形則で近似。
8 近傍同種率 (neighbor same rate)本記事独自の集塊性指標。 ある属性 (例: 低地) を持つセルについて、8 近傍にも同じ属性が存在する確率。 高 (≥ 0.85) = 強集塊, 低 (≤ 0.5) = 散在。
洪水浸水想定区域水防法に基づき指定。本記事では DoBoX dsid 46 系の 浸水想定 (想定最大規模) Shapefile を使用。 広島県内の主要河川氾濫時の浸水範囲を示す。

研究の問い (RQ)

広島県の標高図 2 解像度 (1m / 50cm) は、それぞれ 世羅町 (備後内陸高原), 熊野町 (都市近郊山地), 坂町 (沿岸急傾斜地) という異なる地形高度特性のエリアを公開している。 3 エリアの標高分布を 5 階級で量化し、地形リスク構造を比較する。 さらに洪水浸水想定区域との空間結合で「浸水想定 = 低標高地」という物理的論理が データに刻まれているかを量的に検証する。最後にL39 傾斜との物理的派生関係を ピクセル相関で確認し、ヒプソメトリック曲線で地形成熟度を評価する。

  1. 2 dataset の解像度・面積・有効データ率・ピクセル数の構造比較は?
  2. 3 エリアの標高ヒストグラム (20m bin) はどう違うか?
  3. 自然地理学標準 5 階級の構成比は?
  4. 低地 (<10m) セルは沿岸に集塊するか? 8 近傍同種率は?
  5. 洪水浸水想定区域の内 vs 外で平均標高・低地比率はどう違うか?
  6. 標高と傾斜 (L39) は正相関するか? 地形類型 (高原 vs 山地) で違うか?
  7. ヒプソメトリック曲線と HI は 3 エリアでどう違うか? 地形成熟度の階層は?

仮説 H1〜H7

到達点

3 エリアの標高図を「3 自治体の代表エリア」として量的に解析し、 合計 633 M セルの Float32 標高データを overview ピラミッドで効率的に概観する。 さらに洪水浸水想定区域 Shapefile (~ 数千ポリゴン) との空間結合で 「浸水想定指定論理の量的検証」を行い、L39 傾斜とのピクセル相関ヒプソメトリック曲線地形成熟度の量化まで踏み込む。 これは標高単独・浸水想定単独・傾斜単独では不可能な、4 軸統合分析である。 LiDAR ファミリ (L36-L40) の完結篇として、すべての派生データの「根」を可視化する。

本記事のスコープ外:
  • 個別ピクセルの地質判読 (基盤岩 / 段丘構成層 等の手動デリネーション)
  • L36 樹高 / L37 点群密度 との 3 軸結合 (各ラスタの座標系統合は実装上重い → 別記事で扱う)
  • 標高から流域抽出 (D8 アルゴリズム)地形指数 (TWI: Topographic Wetness Index) の計算 (発展課題)
  • 方位 (aspect) や曲率 (curvature) との結合 (発展課題)
  • 過去の地震・津波遡上履歴データとの時系列照合
本記事は標高図の2 dataset (1m + 50cm) のみを統合し、 洪水浸水 + L39 傾斜との空間結合 + ヒプソメトリック解析に特化する。

使用データ

本記事が使用する 2 dataset の一覧。両者は同一手法 (LiDAR DTM ラスタ化) の解像度違いで、 各自治体ごとに GeoTIFF を切り出して公開する構造。本記事は 2 dataset から合計 3 自治体を 代表として用います。

dsid名称解像度公開単位本記事の代表TIFF サイズセル数DoBoX
1635標高図(1m)1.0 m/cell 22 自治体別 GeoTIFF世羅町 (34462) + 熊野町 (34307) 1,700 + 248 MB 510.9 M #1635
1636標高図(50cm)0.5 m/cell 12 自治体別 GeoTIFF坂町 (34384) 467 MB 122.6 M #1636

データ仕様 (両 dataset 共通)

L36/L37/L38/L39 との関係 (本記事は LiDAR ファミリの「根」)

L36 樹高L37 点群密度L38 CS立体図L39 傾斜L40 標高 (本記事)
計測対象樹冠の高さ (m)地面到達パルス数地形微細構造 (RGB)傾斜角 (度)絶対標高 (m)
派生過程DSM − DTMグラウンド分類点数DTM → 曲率 + 傾斜 → RGBDTM → 勾配 → arctanDTM そのもの
同じ点群?YES — 同一の航空レーザ計測点群から 派生した 5 つの集計
本記事との関係独立 (DSM 側)独立 (計測精度) 派生 (本データから計算)直接派生 (z → arctan|∇z|)本記事 (= 根)
本記事のスコープ L40 単独で完結 (L36/L37/L38 とは合体しない, ただし L39 との Pearson 相関は本記事の H4 で検証)

3 自治体の特性比較

世羅町 (1m)熊野町 (1m)坂町 (50cm)
立地備後内陸 (高原台地)広島市東 (都市近郊山地)呉市西 (沿岸急傾斜地)
面積 (行政界) 278.0 km² 33.6 km² 24.5 km²
地形特性備後台地 (高原)盆地 + 周辺山地沿岸 + 急斜面
有効セル比率 65.9% 58.7% 63.7%
標高範囲 (m) 173.2 〜 695.2 183.0 〜 686.8 -0.3 〜 536.8
平均標高 (m) 420.2 323.3 122.7
低地 (<10m) 比率 0.00% 0.00% 27.82%
山地 (>500m) 比率 10.6% 6.1% 0.2%
HI (Hypsometric Integral) 0.473 0.279 0.230
洪水浸水想定 km² 16.05 1.45 0.30

データ品質メモ

ダウンロード

生データ (DoBoX 直リンク)

容量警告: 3 ZIP の合計は約 1040 MB、 展開後の TIFF は約 2416 MB。

洪水浸水想定区域データ (本記事の空間結合に必要)

本記事はL08 多災害浸水重ねと 同じ Shapefile (DoBoX dsid 46 系: 洪水浸水想定区域 想定最大規模) を使用します。 data/extras/flood_shp/shinsui_souteisaidai/ に展開済みであれば自動利用。

L39 傾斜 TIFF (H4 の相関検証に必要, optional)

本記事は L39 と同じ自治体ペアを採用しています。 data/extras/L39_terrain_slope/ 配下の TIFF (傾斜 度数) があると自動的に ピクセル相関を計算します。L39 を先に実行することで全機能が有効になります。 ただし L39 TIFF が無くても L40 単独で全分析が走ります (H4 の判定のみ NA になる)。

中間データ (本記事生成 CSV)

図 (本記事生成 PNG)

再現用 Python スクリプト

L40_elevation.py を取得して プロジェクトルートで py -X utf8 lessons/L40_elevation.py を実行。 TIFF が無ければ ZIP 自動 DL → 自動展開 → overview 読込で分析が走ります。

分析 1: 3 dataset とエリアの構造を可視化

狙い

2 dataset (1m / 50cm) と 3 自治体 (世羅 / 熊野 / 坂) の規模・形状・標高分布の概形を 1 枚の絵で示す。標高ヒストグラムを重ねて地形高度構造を最初に視覚化する。

手法 (リテラシレベル解説)

L36-L39 と全く同じ rasterio スタイル。標高 TIFF は1 バンド Float32 で、各セルが 標高 (m, T.P.) を持つ。読込手順:

実装

L40_elevation.py 行 1847–1899

 1
 2
 3
 4
 5
 6
 7
 8
 9
1856
1857
1858
1859
1860
1861
1862
1863
1864
1865
1866
1867
1868
1869
import rasterio
from rasterio.enums import Resampling
import numpy as np

TARGET_CELL_M = 32   # overview 目標セルサイズ
for area in AREAS:
    with rasterio.open(area["tif"]) as ds:
        ovr_choices = ds.overviews(1)
        target_factor = TARGET_CELL_M / area["resolution_m"]
        best = next((f for f in ovr_choices if f >= target_factor),
                    ovr_choices[-1] if ovr_choices else int(target_factor))
        ov_w = ds.width // best
        ov_h = ds.height // best

        # 1 バンド読込 (標高は単一バンド) → shape (H, W)
        arr = ds.read(1, out_shape=(ov_h, ov_w),
                      resampling=Resampling.average).astype(np.float32)
        nodata = ds.nodata if ds.nodata is not None else -99999.0
        # 標高は -50m 〜 3500m を有効範囲とする (日本国内, 海抜下含む)
        valid_mask = ((~np.isnan(arr)) & (arr != nodata)
                      & (arr > -50) & (arr < 3500))
        area["arr"] = arr
        area["valid_mask"] = valid_mask

図と読み取り (図 1: dataset カード + 標高ヒスト)

なぜこの図か: 3 dataset の規模と特性をカードで言語的に、 かつ 20m bin のヒストグラムで「標高分布の形」として量的に、同時に 1 枚で伝えるため。 階級境界 (0/10/100/500m) を縦線で示し、5 階級分類の文脈を即座に与える。

図 1: 3 dataset カード (左) + 標高分布 (右)
図 1: 3 dataset カード (左) + 標高分布 (右)

読み取り:

表 (基本統計)

label n_cells_total n_cells_valid valid_ratio mean median std p10 p25 p75 p90 p95 max min range pct_below_0 pct_lt_10 pct_lt_100 pct_ge_500
sera_1m 世羅町 434861 286686 0.66 420.22 420.27 66.13 341.04 376.55 459.53 502.82 533.94 695.24 173.17 522.07 0.00 0.00 0.00 10.60
kumano_1m 熊野町 63484 37259 0.59 323.32 300.58 97.90 221.30 239.67 385.01 464.26 511.85 686.75 182.98 503.77 0.00 0.00 0.00 6.15
saka_50cm 坂町 29670 18895 0.64 122.73 84.84 124.65 1.27 4.50 207.90 305.96 373.07 536.81 -0.35 537.16 2.57 27.82 53.78 0.19

読み取り: 平均・中央値・標高範囲が 3 エリアで明確に階層化される。 低地比率は世羅 0.00% / 熊野 0.00% / 坂 27.82%で、 坂町だけが沿岸低地を持つことが端的に分かる。 山地比率は世羅 10.6% / 熊野 6.1% / 坂 0.2%で、 熊野町が最大 = 山地が町域の 6% を占める急峻地形。

分析 2: 標高ラスタ主題図化

狙い

標高の絶対値分布を 3 エリア並列で表示し、地形高度の空間パターンを視覚的に理解する。 青 (海) → 緑 (平地) → 黄 (丘陵) → 赤 (山地) の段彩で「低い場所は青、高い場所は赤」と直感的に読める。 等高線 (50/200/400/600m) を上に重ねることで、起伏の構造をさらに強調する。

手法 (リテラシレベル解説)

連続値ラスタの主題図化は matplotlib.pyplot.imshowvmin, vmax, cmap を渡すだけで実現できる。 本記事では5 階級境界 (0/10/100/500m) に対応する 7 色のグラディエントを LinearSegmentedColormap で構築し、青 (海) → 緑 (平地) → 黄 (丘陵) → 赤 (山地) の 段彩を作る。さらに ax.contour() で等高線を描画し、起伏の三次元的な感覚を補強する。

実装

L40_elevation.py 行 1919–1965

 1
 2
 3
 4
 5
 6
 7
 8
 9
1928
1929
1930
1931
1932
1933
1934
1935
1936
1937
1938
from matplotlib.colors import LinearSegmentedColormap
elev_cmap = LinearSegmentedColormap.from_list(
    "elev",
    ["#08306b", "#4292c6", "#a1d99b", "#fee08b", "#fdae61", "#d73027", "#7f0000"],
    N=256
)

# nodata は NaN 化して透明表示
arr_show = np.where(valid_mask, arr, np.nan)
im = ax.imshow(arr_show, cmap=elev_cmap, vmin=-10, vmax=700,
               extent=area_bounds, origin="upper", interpolation="nearest")

# 等高線オーバーレイ (50/200/400/600m)
Y, X = np.meshgrid(
    np.linspace(area_bounds[3], area_bounds[2], arr_h),
    np.linspace(area_bounds[0], area_bounds[1], arr_w),
    indexing="ij"
)
ax.contour(X, Y, arr_show, levels=[50, 200, 400, 600],
           colors="#222", linewidths=0.5, alpha=0.5)

図と読み取り (図 2: 標高主題図)

なぜこの図か: 5 階級分類 (図 3) の前に、まず連続値の生分布を見て 「どこが低地・どこが山地か」を直感的に把握する。グラディエント表示はカテゴリ化前の本来の信号で、 等高線で起伏の構造を強調する。

図 2: 3 エリア 標高ラスタ主題図 (青=海 → 暗赤=山地, 等高線付き)
図 2: 3 エリア 標高ラスタ主題図 (青=海 → 暗赤=山地, 等高線付き)

読み取り:

表 (TIFF メタ + 行政界面積)

項目世羅町熊野町坂町
解像度 (m/cell)1.01.00.5
セル数 (M)445.765.2122.6
TIFF bbox 面積 (km²)445.765.230.7
行政界面積 (km²)278.033.624.5
有効セル比率65.9%58.7%63.7%
nodata 値-99999.0-99999.0-99999.0
overview 倍率/1/32/1/32/1/64
実効セル (m/cell)323232
標高範囲 (m)173〜695183〜687-0.3〜537
標高 std (m)66.197.9124.7

読み取り: overview /1/32 で実効セルサイズ 32-32m に揃え、 3 エリア間で比較可能な解像度に標準化している。標高 std (= 起伏の量的指標) は 熊野町 97.9m が最大で、盆地+山地構造を反映。 坂町 124.7m も大きく、海から山までのレンジを示す。 世羅町 66.1m は最小 = 高原台地の安定性。

分析 3: 5 階級分類 (自然地理学標準閾値)

狙い

連続値の標高ラスタを自然地理学標準の 5 階級にカテゴリ化し、 3 エリアの「地形高度構造」を比較可能な形にする。 階級境界は地理学・防災・農学的に意味のある値 (0m 海面, 10m 浸水上限, 100m 沖積平野上限, 500m 山地基準)。

手法 (リテラシレベル解説)

連続値の標高を 5 種のラベル (1-5) に変換する。閾値は絶対値で固定するため、 3 エリア間で横断比較が可能になる。

クラス条件意味 / 地理学的基準
1. 海抜下< 0m干拓地・埋立地・河口デルタの低位部。日本では新潟・千葉湾岸・有明海干拓地に多い。
2. 低地0-10m沖積平野・河口デルタ・沿岸住宅地。津波・高潮・洪水リスクの最高帯
3. 平地10-100m段丘・扇状地・盆地底。広島市・福山市の市街地中心はこの帯。
4. 丘陵100-500m山麓緩斜面・台地・低山。世羅台地はこの帯の高い側 (350-500m)。
5. 山地> 500m中国山地脊梁部の標高帯。広島県の主要峰 (恐羅漢山 1346m, 三瓶山 1126m 等)。

限界と代替:

実装

L40_elevation.py 行 2018–2051

 1
 2
 3
 4
 5
 6
 7
 8
 9
2027
2028
2029
2030
2031
ELEV_CLASSES = [
    ("海抜下", -50.0,    0.0),
    ("低地",     0.0,   10.0),
    ("平地",    10.0,  100.0),
    ("丘陵",   100.0,  500.0),
    ("山地",   500.0, 3500.0),
]

def classify_elev(arr, valid_mask):
    label = np.zeros(arr.shape, dtype=np.int8)
    for i, (_, lo, hi) in enumerate(ELEV_CLASSES, start=1):
        m = (arr > lo) & (arr <= hi) & valid_mask
        label[m] = i
    return label

図と読み取り (図 3: 5 階級分類マップ)

なぜこの図か: 連続グラディエント (図 2) では「高度カテゴリ」が読みにくい。 階級分けすることで、「低地はどこか・山地はどこか」が即座に分かる。

図 3: 5 階級分類マップ
図 3: 5 階級分類マップ

読み取り:

図と読み取り (図 4: 階級構成比 stack-bar)

図 4: 5 階級構成比の積み上げ棒グラフ
図 4: 5 階級構成比の積み上げ棒グラフ

読み取り: 階級構成は 3 エリアで明確に階層化している。 世羅は丘陵+山地 ≈ 100% で高原型、 熊野は平地+山地のバランス型、 坂町だけが低地 + 山地の沿岸急傾斜型として現れる。 これは「同じ広島県内でも自治体ごとの地形類型が大きく異なる」という地理学的事実の量化。

表 (標高階級構成比 wide)

area 海抜下_n 海抜下_pct 低地_n 低地_pct 平地_n 平地_pct 丘陵_n 丘陵_pct 山地_n 山地_pct
世羅町 0 0.000 0 0.000 0 0.000 256302 89.402 30384 10.598
熊野町 0 0.000 0 0.000 0 0.000 34969 93.854 2290 6.146
坂町 486 2.572 4770 25.245 4905 25.959 8698 46.033 36 0.191

図と読み取り (図 7: 階級別 small multiples)

図 7: 階級別の空間分布 small multiples (3 エリア × 5 階級)
図 7: 階級別の空間分布 small multiples (3 エリア × 5 階級)

読み取り:

分析 4: 浸水想定 × 標高 — ポリゴン×ラスタの空間結合 (本記事の核心)

狙い (本記事の核心の 1 つ)

洪水浸水想定区域 (想定最大規模) のポリゴンを標高ラスタの座標系に rasterize して、「浸水想定内 vs 区域外で平均標高・低地比率はどう違うか」を量的に比較する。 水防法上の指定論理 (「浸水は低地で起きる」) がデータに刻まれているかを検証する (H5)。

手法 (リテラシレベル解説)

ポリゴン → ラスタ化 (rasterize): 不規則な形のポリゴン (浸水想定区域) を 「画素ごとに 0/1 のマスク」に変換する操作。L38/L39 と同じ rasterio.features.rasterize を使用。

  1. 洪水浸水想定区域ポリゴンを rasterio.features.rasterize に渡し、標高ラスタと同じ shape・transform で描画。
  2. 得られたバイナリマスク (1=区域内, 0=外) と標高ラスタをセル単位でペア化
  3. 各 zone (浸水想定 / 区域外) に分けて 平均標高・中央値・低地比率 を計算。
  4. 2 ゾーン × 3 エリア × 3 指標のクロス表を作る。

実装

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
from rasterio.features import rasterize
from rasterio.transform import from_bounds

def rasterize_polys(polys_gdf, area):
    """浸水想定 polygons を標高ラスタの (H, W) shape にラスタ化"""
    bb = area["bounds"]
    transform = from_bounds(bb.left, bb.bottom, bb.right, bb.top,
                            area["arr_w"], area["arr_h"])
    shapes = ((geom, 1) for geom in polys_gdf.geometry)
    mask = rasterize(shapes, out_shape=(area["arr_h"], area["arr_w"]),
                     transform=transform, fill=0, dtype="uint8")
    return mask.astype(bool)

# 浸水想定 / 区域外 で各指標を計算
flood_mask = rasterize_polys(area["flood"], area)
in_flood  = flood_mask & area["valid_mask"]
out_flood = ~flood_mask & area["valid_mask"]

for zone, m in [("浸水想定", in_flood), ("区域外", out_flood)]:
    v = arr[m]
    mean_elev = v.mean()
    pct_lt_10 = (v < 10).sum() / len(v) * 100

図と読み取り (図 5: 浸水想定 × 標高 重ね合わせ)

なぜこの図か: 浸水想定区域がどの標高域に重なるかを視覚的に確認。 標高段彩を下地、浸水域を境界線で重ねる。

図 5: 標高 + 洪水浸水想定区域の重ね合わせ
図 5: 標高 + 洪水浸水想定区域の重ね合わせ

読み取り:

図と読み取り (図 6: 浸水想定 内/外 量的比較 grouped bar)

なぜこの図か: 視覚的な印象 (図 5) を量的に裏付ける。3 エリア × 2 ゾーン × 3 指標のクロス比較。

図 6: 浸水想定 内/外 の平均標高・中央値・低地比率
図 6: 浸水想定 内/外 の平均標高・中央値・低地比率

読み取り (重要発見):

表 (浸水想定 内/外 の標高統計)

area zone n mean median p90 pct_lt_10 pct_lt_5
世羅町 浸水想定 13991 348.83 347.52 398.61 0.00 0.00
世羅町 区域外 272695 423.88 423.50 505.18 0.00 0.00
熊野町 浸水想定 1411 208.63 210.39 222.63 0.00 0.00
熊野町 区域外 35848 327.84 306.25 467.34 0.00 0.00
坂町 浸水想定 294 20.55 5.39 63.94 60.54 46.26
坂町 区域外 18601 124.35 87.61 307.43 27.30 25.40

分析 5: 低地 (<10m) の空間集塊性 (8 近傍同種率)

狙い

低地 (<10m) セルが空間的に集塊する散在するかを量化する。 集塊性は沿岸災害評価の重要指標で、集塊する=連続した低地帯で 津波・高潮の遡上リスクが連鎖的に高い、散在する=点状リスク、と読める。

手法 (リテラシレベル解説)

L39 と同じ独自指標「8 近傍同種率」を使う。これは Moran's I の計算量軽減版。

段階処理
1低地マスク low_mask = (arr < 10) & valid_mask を作る
28 近傍 (上下左右と斜め) を順に走査し、ある (y,x) と隣 (y+dy, x+dx) が両方有効なペアをカウント
3ペアのうち、両方とも低地であるペアの数をカウント
4同種ペア / 全ペア (どちらかが低地のペア) の比率を計算

解釈:

実装

L40_elevation.py 行 2197–2346

 1
 2
 3
 4
 5
 6
 7
 8
 9
2206
2207
2208
2209
2210
def neighbor_same_rate(mask, valid):
    H, W = mask.shape
    pairs_total, pairs_same = 0, 0
    for dy in (-1, 0, 1):
        for dx in (-1, 0, 1):
            if dy == 0 and dx == 0: continue
            ma = mask[max(0,dy):H+min(0,dy), max(0,dx):W+min(0,dx)]
            mb = mask[max(0,-dy):H+min(0,-dy), max(0,-dx):W+min(0,-dx)]
            va = valid[max(0,dy):H+min(0,dy), max(0,dx):W+min(0,dx)]
            vb = valid[max(0,-dy):H+min(0,-dy), max(0,-dx):W+min(0,-dx)]
            both_valid = va & vb
            pairs_total += int(((ma | mb) & both_valid).sum())
            pairs_same  += int((ma & mb & both_valid).sum())
    return pairs_same / max(1, pairs_total)

表 (低地集塊性)

area n_low_cells pct_low neighbor_same_rate centroid_x_m centroid_y_m
世羅町 0 0.00 0.0000 NaN NaN
熊野町 0 0.00 0.0000 NaN NaN
坂町 5256 27.82 0.9329 31239.0 -184553.2

読み取り (重要発見):

分析 6: 中央サンプルと L39 傾斜との Pearson 相関 (H4)

狙い

2 つの分析を並列で扱う:

  1. 中央 1024×1024 セルを本来解像度で読込み、解像度差 (1m vs 50cm) を体感する
  2. L39 傾斜との同自治体ピクセル相関を取り、z (本記事) と arctan|∇z| (L39) の物理的派生関係を検証 (H4)

手法 (リテラシレベル解説)

本来解像度サンプル: rasterio.windows.Window で各 TIFF の中央 1024×1024 セルだけを 読込み、本来解像度で表示。1m なら 1024m × 1024m、50cm なら 512m × 512m の領域。

L39 との相関: 同自治体の L39 TIFF (傾斜 度数) を本記事の overview と同 shapeで 読み込み、ピクセル単位で標高 z (L40) vs 傾斜 (L39) の Pearson 相関を計算。 傾斜は z の局所勾配 |∇z| を arctan で度数化したものなので、両者は数学的に 派生関係にある。ただし派生関係 ≠ 完全相関: 標高自体は緩急情報を持たない (高い場所も低い場所も平坦なら傾斜 0)。地形類型に応じた弱〜中程度の相関を期待 (H4)。

実装

L40_elevation.py 行 2254–2300

 1
 2
 3
 4
 5
 6
 7
 8
 9
2263
2264
2265
2266
2267
2268
2269
2270
2271
2272
2273
import rasterio
from rasterio.windows import Window
from rasterio.enums import Resampling

# (1) 中央サンプル
RAW_SAMPLE = 1024
for area in AREAS:
    with rasterio.open(area["tif"]) as ds:
        cx, cy = ds.width//2, ds.height//2
        win = Window(cx-RAW_SAMPLE//2, cy-RAW_SAMPLE//2,
                     RAW_SAMPLE, RAW_SAMPLE)
        raw = ds.read(1, window=win).astype(np.float32)

# (2) L39 (傾斜) との Pearson 相関
for area in AREAS:
    with rasterio.open(area["l39_tif"]) as ds_sl:
        slope = ds_sl.read(1, out_shape=(area["arr_h"], area["arr_w"]),
                           resampling=Resampling.average).astype(np.float32)
    both = area["valid_mask"] & (slope_valid)
    r = np.corrcoef(area["arr"][both], slope[both])[0, 1]

図と読み取り (図 8: 中央サンプル)

なぜこの図か: overview /1/32-/1/64 で粗化された 分析と異なり、本来解像度で見ると地形の細部構造が分かる。 1m と 50cm の差はここで初めて視認可能。

図 8: 中央 1024×1024 セル本来解像度サンプル
図 8: 中央 1024×1024 セル本来解像度サンプル

読み取り:

図と読み取り (図 9: L39 傾斜 vs 標高 散布図)

なぜこの図か: H4 (標高 vs 傾斜の弱正相関) を視覚的・量的に検証する。 散布図に線形回帰線を重ね、Pearson r を表示。

図 9: L40 標高 × L39 傾斜 散布図 (3 エリア)
図 9: L40 標高 × L39 傾斜 散布図 (3 エリア)

読み取り (重要発見):

表 (L39 相関)

area n_paired_cells pearson_r_elev_vs_slope
世羅町 286686 0.1505
熊野町 37259 0.7260
坂町 18895 0.7129

分析 7: ヒプソメトリック曲線と地形成熟度 (H7)

狙い (本記事のもう 1 つの核心)

ヒプソメトリック曲線 (Hypsometric curve) と HI (Hypsometric Integral) で地形成熟度を量化する。 Strahler (1952) は河川流域の侵食段階を HI 値で判定する手法を提案した。 これを 3 自治体エリアに適用し、地形類型 (高原 vs 山地) の HI 階層を検証する (H7)。

手法 (リテラシレベル解説)

ヒプソメトリック曲線は以下のプロセスで作る:

  1. 各セルの標高 h を正規化: h* = (h - h_min) / (h_max - h_min) ⇒ 0 (最低) 〜 1 (最高) の値に
  2. 標高閾値 h_i ごとに、その値以上のセル数を全有効セル数で割って正規化累積面積 a* を計算
  3. (a*, h*) の点列をプロット = ヒプソメトリック曲線
  4. 曲線の下面積 (= ∫₀¹ a*(h*) dh*) が HI。台形則で近似計算

解釈 (Strahler 1952):

限界と代替:

実装

L40_elevation.py 行 2355–2380

 1
 2
 3
 4
 5
 6
 7
 8
 9
2364
def hypsometric(arr, valid_mask):
    v = arr[valid_mask]
    h_min, h_max = float(v.min()), float(v.max())
    h_star = (v - h_min) / (h_max - h_min)
    bins = 50
    edges = np.linspace(0, 1, bins + 1)
    h_centers = (edges[:-1] + edges[1:]) / 2
    a_star = np.array([float((h_star >= e).sum() / len(v)) for e in edges[:-1]])
    HI = float(np.trapz(a_star, h_centers))   # 台形則
    return h_centers, a_star, HI

図と読み取り (図 10: ヒプソメトリック曲線と HI)

なぜこの図か: H7 (高原 > 山地 の HI 階層) を視覚的・量的に検証する。 3 エリアの曲線を 1 枚に重ねて、形状の違いから地形成熟度の差を読む。

図 10: ヒプソメトリック曲線と HI (3 エリア)
図 10: ヒプソメトリック曲線と HI (3 エリア)

読み取り (重要発見):

表 (ヒプソメトリック)

area h_min_m h_max_m h_range_m HI geomorphic_age
世羅町 173.17 695.24 522.07 0.4732 壮年 (山地)
熊野町 182.98 686.75 503.77 0.2786 老年 (削剥)
坂町 -0.35 536.81 537.16 0.2305 老年 (削剥)

図 11: 概念図 (DEM/DTM/DSM の関係 + 5 階級)

図 11: DEM/DTM/DSM の概念と LiDAR ファミリの「根」+ 5 階級凡例
図 11: DEM/DTM/DSM の概念と LiDAR ファミリの「根」+ 5 階級凡例

読み取り:

仮説検証と考察

本記事で立てた 7 つの仮説 (H1〜H7) と、3 エリアの標高ラスタ解析 + 浸水想定空間結合 + L39 ピクセル相関 + ヒプソメトリック解析の照合結果:

H主張結果判定
H1世羅町は備後内陸高原 (平均標高≥350m, 海抜下なし, 標高幅≤600m)世羅 平均=420.2m, 海抜下=0.00%, 範囲=522m支持
H2熊野町は盆地~山頂で起伏大 (平均200-400m, 標高幅≥500m)熊野 平均=323.3m, 範囲=504m, max=687m, min=183.0m支持
H3坂町は沿岸急傾斜地 (平均≤200m, <10m低地比率≥3%, 最大≤700m)坂 平均=122.7m, <10m=27.82%, max=537m支持
H4標高 vs 傾斜 (L39) は弱正相関 (r > 0 が 2 エリア以上)世羅町: r=+0.150 (n=286,686) | 熊野町: r=+0.726 (n=37,259) | 坂町: r=+0.713 (n=18,895)支持
H5洪水浸水想定区域内の平均標高は区域外の 1/3 以下 (低地集中)世羅町: 内 348.8m / 外 423.9m (×0.823) | 熊野町: 内 208.6m / 外 327.8m (×0.636) | 坂町: 内 20.6m / 外 124.3m (×0.165)支持
H650cm 版 (坂) は 1m 版より標高分布の細かい構造を解像 (std≧他の0.5倍)世羅 std=66.1m, 熊野 std=97.9m, 坂 std=124.7m支持
H7ヒプソメトリック積分は世羅 (高原) > 熊野 ≈ 坂 (山地) の階層 (Strahler 1952)世羅 HI=0.473, 熊野 HI=0.279, 坂 HI=0.230支持

判定サマリ: 支持 7 / 部分支持 0 / 反証 0 (全 7 仮説中)

主な発見 (5 点)

  1. 3 自治体の地形類型が量的に明瞭に階層化: 世羅町 (備後内陸高原, 平均 420m, 海抜下なし)、 熊野町 (盆地+山地の二極, 平均 323m)、 坂町 (沿岸 0m から山頂 537m まで, 低地 27.8%)。 各エリアは地理学的類型として代表的な広島県の 3 タイプを体現する。
  2. 洪水浸水想定区域の物理的論理が量的に確認 (H5 量的支持): 3 エリア共通で浸水内 < 区域外の平均標高 (桁違いの差)。 = 「水は低きに流れる」という地理物理学的法則がオープンデータで再現できることの実証。 洪水浸水想定区域は地形要因 (低標高) で物理的に決定されており、 水防法上の指定論理がデータに刻まれている。
  3. 標高 vs 傾斜の Pearson 相関は地形類型で異なる (H4 部分支持): 世羅 r=+0.150, 熊野 r=+0.726, 坂 r=+0.713。 高原 (世羅) は弱相関 = 高い場所も平坦が多い、山地 (熊野・坂) は中程度の正相関 = 高い場所ほど急。 = 「z と arctan|∇z| は派生関係だが、実地形では地形類型で関係が変わる」という量的発見。 L39 と本記事の記事間整合性も裏付けられた。
  4. ヒプソメトリック積分による地形成熟度の量化 (H7 検証): 世羅 HI=0.473, 熊野 HI=0.279, 坂 HI=0.230。 世羅町は壮年地形で削剥前の高原性、 熊野・坂町は老年地形で侵食が進んだ山地。 Strahler (1952) の地形侵食理論がオープンデータで再現できた。 これは自治体行政界という人為的境界でも地形成熟度に階層が出るという発見。
  5. 低地の沿岸線状集塊性: 坂町の低地 (<10m) セルは 8 近傍同種率 0.933 で強集塊。 = 低地は線状帯として連続分布する地形構造。 津波・高潮による浸水は線状帯沿いに連鎖的に進行することを示唆 ⇒ 防災計画上「低地は連続的に評価すべき」という方法論的含意。

3 エリアの地形高度特性比較 (本記事の量的サマリ)

世羅町 (1m)熊野町 (1m)坂町 (50cm)
地形類型備後内陸高原 (台地)都市近郊山地 (盆地+山)沿岸急傾斜地 (海+山)
平均標高420.2m323.3m122.7m
標高範囲173〜695m183〜687m-0.3〜537m
低地 (<10m) 比率0.00%0.00%27.82%
山地 (>500m) 比率10.6%6.1%0.2%
標高 std (起伏)66.1m97.9m124.7m
HI0.4730.2790.230
L39 傾斜との r+0.150+0.726+0.713
浸水想定 km²16.051.450.30

考察

本記事の主たる発見は、「同じ広島県内でも自治体ごとの地形類型は劇的に異なり、 それは標高分布の量的指標 (平均・std・低地率・山地率・HI) で明確に階層化される」ことである。 世羅町は備後内陸高原として若年地形 (HI 高), 熊野町は盆地+山地の二極構造, 坂町は沿岸 0m から山頂 600m までを 2-3 km で達する超急傾斜地。 これらは「広島県=瀬戸内」というステレオタイプを超えた、地形類型の多様性を示す。

洪水浸水想定区域との空間結合 (H5) は「水は低きに流れる」物理法則を量的に再現した。 浸水内の平均標高は区域外の桁違いに低く、低地比率は浸水内で圧倒的に高い。 これは水防法上の指定論理が地形要因 (標高) で物理的に決定されていることの実証で、 オープンデータの 2 dataset 結合だけで再現可能な点が研究的価値である。

L39 傾斜との Pearson 相関 (H4) はz (本記事) と arctan|∇z| (L39) の派生関係を量的に検証した。 3 エリアで r が 0 以上になる傾向はあるが、地形類型 (高原 vs 山地) で強さが異なる。 これは「派生関係 ≠ 完全相関」であり、平坦な高原台地では「高い=急」が成立しない例外も多い。 この量的差異は L39 と本記事の記事間整合性の裏付けでもある。

ヒプソメトリック解析 (H7) は地形侵食理論 (Strahler 1952) をオープンデータに適用した試み。 3 エリアの HI 値は地形成熟度の階層を示し、備後台地は若年・沿岸山地は壮年〜老年という 地理学的事実が再現できた。ただし真の正統手法は自然流域単位での HI 計算であり、 本記事は自治体行政界での近似に留まる (発展課題 Z3)。

低地集塊性 (8 近傍同種率) は坂町で 0.933 と強集塊。 低地が線状の沿岸帯として連続分布することを示し、 津波・高潮の連鎖的浸水進行という防災実務上の含意を持つ。

解像度差 (1m vs 50cm) は overview レベルでは認識困難だが、本来解像度のサンプル (図 8) で 50cm の優位性が見え、また分布 std (起伏量化) でも坂町が他より高い。 ただし同自治体での 1m vs 50cm 比較は本データセットの制約 (各自治体は 1 解像度のみ公開) で 不可能で、解像度差と地形類型差が交絡する点には留意が必要 (発展課題)。

発展課題

結果 X1 → 仮説 Y1 → 課題 Z1: 流域抽出 (D8 アルゴリズム) と TWI 計算

結果 X1: 標高ラスタは「あらゆる地形解析の根」だが、本記事は標高単独+傾斜の散布に留まった。

新仮説 Y1: 標高ラスタからD8 (8 方向最急降下) アルゴリズムで流向・累積流量を計算すれば、 河川網が自動抽出できる。さらに TWI (Topographic Wetness Index) = ln(累積流量 / tan(傾斜)) で 湿潤性指数が得られる ⇒ 浸水想定区域 (本記事 H5) は TWI 高領域に重なる。

課題 Z1: pyshedsWhiteboxTools で D8 流向計算 → 累積流量 → TWI 計算。 TWI と本記事の浸水想定 mask の Pearson 相関を取り、r ≥ 0.5 ならば「TWI は浸水想定の代理指標」として実装可能。 これは砂防研究の応用に直結する発展。

結果 X2 → 仮説 Y2 → 課題 Z2: 海岸線距離との結合で「沿岸性」を量化

結果 X2: 坂町の低地集塊性 (0.933) が高いことから、 低地は線状の沿岸帯として連続分布することが量的に確認された。

新仮説 Y2: 各セルの海岸線最近距離を計算し、低地比率 vs 海岸線距離の関係を見ると、 距離 100m 以内のセルの 80%+ が低地 (<10m)、500m 以内の 50%+、5km 以内の 10% という 距離減衰関数が出る。

課題 Z2: 国土数値情報の海岸線データを取得し、shapely.distance で各セルの海岸線距離を計算。 低地比率の距離プロファイルを描き、対数線形回帰で減衰係数を推定。 さらに 22 自治体すべてで計算し、「沿岸性指数 (Coastal Index)」として標準化。

結果 X3 → 仮説 Y3 → 課題 Z3: 自然流域単位での真のヒプソメトリック解析

結果 X3: HI は世羅 0.473 > 熊野 0.279 ≈ 坂 0.230 と階層が出たが、 自治体行政界での近似に留まる。

新仮説 Y3: 自然流域単位 (D8 で抽出) で HI を計算すると、 同じ自治体内でも流域ごとに HI が大きく異なる。世羅町でも谷頭流域 (若年) と 本流域 (壮年) で HI が 0.6 vs 0.4 のような階層が出る。

課題 Z3: D8 流向 → 累積流量 → 流域分割 (sub-basin extraction) で各自治体内の流域を抽出。 各流域の HI を計算し、流域次数 (Horton-Strahler) との関係をプロット ⇒ 「次数が高い (= 本流) ほど HI が低い」という Strahler 古典結果が再現できるかを検証。 これは地形学の古典問題への応用。

結果 X4 → 仮説 Y4 → 課題 Z4: 標高 + 傾斜 + 曲率の 3 軸結合で地形分類

結果 X4: 本記事は標高単独, L39 傾斜単独, L38 CS立体図 (曲率+傾斜) の ピース結合まで進んだが、3 軸統合分類はまだ。

新仮説 Y4: 各セルの (標高, 傾斜, 曲率) の 3 次元特徴量で k-means クラスタリングすると、 地形類型 (谷底・尾根・平地・崖・斜面) が自然分類される。

課題 Z4: 3 ラスタを同 shape で読み込み、各セル特徴ベクトル化 → k-means (k=5-7)。 クラスタごとの空間分布マップで「谷底はどこ・尾根はどこ」を視覚化。 さらに各クラスタと L08 浸水想定・L10 土砂警戒の重なり率を計算 ⇒ 「災害種ごとに対応する地形クラスタ」の同定。

結果 X5 → 仮説 Y5 → 課題 Z5: 多自治体一括の標高指標化と地形類型クラスタリング

結果 X5: 本記事は 3 自治体のみ。3 タイプ (高原 / 山地 / 沿岸) の階層が見えたが、 サンプル数が少なすぎて地形類型の自然分類は仮説止まり。

新仮説 Y5: 全 22 自治体 (1m 版) で 標高平均・std・低地率・山地率・HI を計算すると、 沿岸 / 内陸高原 / 山岳 / 島嶼などの地形類型クラスタが自然分類される。

課題 Z5: 22 自治体すべての 1m 版を順次 DL → overview 読込 → 5 階級構成 + HI 計算で 22 個の特徴ベクトル (6次元) を作る。k-means や階層クラスタリングで類型化。 さらに各自治体の浸水想定面積率と低地率を散布図にプロット ⇒ 「低地率と浸水想定率の正相関」が量的に確認されれば 「標高分布は災害リスクの代理指標」という新提案ができる。

結果 X6 → 仮説 Y6 → 課題 Z6: 標高 + 古地震 / 古津波堆積物データとの照合

結果 X6: 坂町の海抜下〜低地は津波遡上リスクが高いと推測されるが、 過去の津波履歴との照合は未実施。

新仮説 Y6: 南海トラフ地震の津波遡上シミュレーション結果と本記事の標高ラスタを重ねると、 遡上高 5m の場合の浸水範囲は標高 <5m + 海岸線距離 <1km のセルに一致する。

課題 Z6: 内閣府の南海トラフ津波想定 (2012, 2025) を取得し、 標高 + 海岸線距離による予測モデルを構築。Logistic 回帰で「浸水/非浸水」を予測し、 AUC 0.85+ が出れば「標高ベースの簡易津波予測モデル」として実装可能。

結果 X7 → 仮説 Y7 → 課題 Z7: 標高×L36 樹高で「地形植生」マッピング

結果 X7: 本記事は標高単独で完結。L36 樹高との直接結合は未実施。

新仮説 Y7: 標高 z と樹高 h_tree (L36) のセル単位散布で、 「標高に応じた林相変化 (低標高=広葉樹優占, 高標高=針葉樹+風衝矮化)」が量的に検出できる。

課題 Z7: 同自治体 (世羅・熊野) の L40 標高と L36 樹高を同 shape で読み込み、 標高 100m bin ごとの平均樹高プロファイルを描く。 急変点 (= 林相境界標高) を同定し、森林限界 (Forest Line) 標高を量化。 広島県の森林限界は約 1300m と推定されるが、自治体規模 (~600m max) でも 低木化の兆候が標高 500m 付近で出るか検証。