DEMからTIN作成
1 m DEM から TIN テキストを生成する完全ワークフロー
国土地理院 → QGIS → Python
1. はじめに
河川計算や地形解析で「TIN(三角網)形式」が必要になるケースは少なくありません。しかし国土地理院から取得できる標高データは GeoTIFF(ラスタ)が主体です。本記事ではダウンロード → QGIS → Pythonという最短ルートで TIN.txt(1 行に x y z が 3 点=計 9 値)を作成する方法をまとめました。
2. 準備環境
| 項目 | 推奨バージョン | 備考 |
|---|---|---|
| OS | Windows 10/11 64bit | macOS / Linux でも可 |
| QGIS | 3.36 LTR 以上 | GRASS 8.3 同梱 |
| Python | 3.12 (64bit) | Miniconda / venv どちらでも |
| 主要パッケージ | gdal 3.11.1numpy 1.26.4scipy 1.11.4 | Windows は Christoph Gohlke wheel |
| 巨大 TXT ビューア | EmEditor / glogg | 数百 MB 以上でも快適 |
3. STEP 1 国土地理院の 1 m DEM をダウンロード
- 「基盤地図情報ダウンロードサービス」で地図から対象範囲を選択。
- 「標高 → 1 m 解析」をチェックしてダウンロード。
- ZIP を展開すると
*_1m.tifが得られる。CRS は多くの場合 EPSG:6665(JGD2011/平面直角)を保持。
Tips: タイルが多い場合は ECORIS や VRT でまとめると楽です。
4. STEP 2 QGIS でラスタを整理・タイル分割
- QGIS に
*.tifをドラッグ。 - メニュー 処理ツール → ラスター抽出 →「ラスターを範囲でクリップ」 で不要範囲を切り出す。
マップ上で矩形ドラッグ、または座標を入力。 - 必要に応じて 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 |
| 分割保存 | PowerShell の Get‑Content -ReadCount 1e6 |
7. おわりに
ポイントは「処理前にタイルを小さく切る & skip で点を間引く」こと。これで 1 m DEM でもメモリエラー無しに TIN 生成が行えます。質問や改善案があればコメントで感想をお聞かせください!
コメント
コメントを投稿