DEMからTIN作成

1 m DEM から TIN テキストを作る完全ワークフロー

1 m DEM から TIN テキストを生成する完全ワークフロー
国土地理院 → QGIS → Python

1. はじめに

河川計算や地形解析で「TIN(三角網)形式」が必要になるケースは少なくありません。しかし国土地理院から取得できる標高データは GeoTIFF(ラスタ)が主体です。本記事ではダウンロード → QGIS → Pythonという最短ルートで TIN.txt(1 行に x y z が 3 点=計 9 値)を作成する方法をまとめました。

2. 準備環境

項目推奨バージョン備考
OSWindows 10/11 64bitmacOS / Linux でも可
QGIS3.36 LTR 以上GRASS 8.3 同梱
Python3.12 (64bit)Miniconda / venv どちらでも
主要パッケージgdal 3.11.1
numpy 1.26.4
scipy 1.11.4
Windows は Christoph Gohlke wheel
巨大 TXT ビューアEmEditor / glogg数百 MB 以上でも快適

3. STEP 1 国土地理院の 1 m DEM をダウンロード

  1. 基盤地図情報ダウンロードサービス」で地図から対象範囲を選択。
  2. 標高 → 1 m 解析」をチェックしてダウンロード。
  3. ZIP を展開すると *_1m.tif が得られる。CRS は多くの場合 EPSG:6665(JGD2011/平面直角)を保持。
Tips: タイルが多い場合は ECORIS や VRT でまとめると楽です。

4. STEP 2 QGIS でラスタを整理・タイル分割

  1. QGIS に *.tif をドラッグ。
  2. メニュー 処理ツール → ラスター抽出 →「ラスターを範囲でクリップ」 で不要範囲を切り出す。
    マップ上で矩形ドラッグ、または座標を入力。
  3. 必要に応じて gdal_translate -tr 2 2 で 2 m グリッドへ粗化すると後工程が高速。

5. STEP 3 Python スクリプトで TIN.txt を生成

5‑1  パッケージをインストール

pip install "https://github.com/cgohlke/geospatial-wheels/releases/download/v2025.7.4/GDAL-3.11.1-cp312-cp312-win_amd64.whl"
pip install numpy==1.26.4 scipy==1.11.4

5‑2  スクリプト (dem2tin_gui.py)

from osgeo import gdal; gdal.UseExceptions()
from scipy.spatial import Delaunay
import numpy as np, tkinter as tk, sys, os
from tkinter import filedialog

def dem_to_pts(path, skip=1):
    ds = gdal.Open(path)
    arr = ds.ReadAsArray().astype(float)
    nd  = ds.GetRasterBand(1).GetNoDataValue()
    if nd is not None:
        arr[arr == nd] = np.nan
    gt = ds.GetGeoTransform()
    rows, cols = arr.shape
    r = np.arange(0, rows, skip)
    c = np.arange(0, cols, skip)
    xv, yv = np.meshgrid(c, r)
    z = arr[r[:, None], c]
    m = ~np.isnan(z)
    x = gt[0] + xv * gt[1] + yv * gt[2]
    y = gt[3] + xv * gt[4] + yv * gt[5]
    return np.c_[x[m], y[m], z[m]]

root = tk.Tk(); root.withdraw()
dem = filedialog.askopenfilename(title="DEM を選択", filetypes=[("GeoTIFF", "*.tif")])
out = filedialog.asksaveasfilename(defaultextension=".txt", title="保存先")
pts = dem_to_pts(dem, skip=2)  # skip=2 → 2 m グリッド相当
tri = Delaunay(pts[:, :2])
with open(out, "w", encoding="utf-8") as f:
    for a, b, c in tri.simplices:
        for i in (a, b, c):
            f.write(f"{pts[i,0]:.3f} {pts[i,1]:.3f} {pts[i,2]:.3f} ")
        f.write("\n")
print("✓ 完了", out)

実行: python dem2tin_gui.py → ダイアログで H:\clip.tif を選択。

6. 巨大ファイルを扱うコツ

用途おすすめツール
閲覧&高速検索glogg
編集・列操作EmEditor 64‑bit
分割保存PowerShellGet‑Content -ReadCount 1e6

7. おわりに

ポイントは「処理前にタイルを小さく切る & skip で点を間引く」こと。これで 1 m DEM でもメモリエラー無しに TIN 生成が行えます。質問や改善案があればコメントで感想をお聞かせください!

コメント

このブログの人気の投稿

IJCAD(AutoCAD互換CAD) コマンド早見表

設計定数を求めるための代表N値について

WEB地図(国土地理院など)のズームレベルについて