QGISで標高ラスタを部分修正する:ラインからTIN生成までの全手順
この記事では、以下の流れで標高修正ラスタを作成する方法を解説します:
- ラインを作成
- 等間隔で点を生成
- 点に標高(例:40m)を一括入力
- TINメッシュを作成
- TINをラスタに変換
- 元のDEMと合成して新しいラスタを出力
1. ラインを作成
QGISで「ライン」レイヤを新規作成し、修正したい区間に線を引きます。保存しておきます。
2. 等間隔に点を作成
メニューの ベクタ ▶ ジオメトリツール ▶ 線上に点を配置 を使用し、例えば 10m 間隔で点を生成します。
3. 点に標高を一括入力
生成されたポイントレイヤを右クリック ▶ 属性テーブル ▶ フィールド演算機 で、以下のように数値を一括で入力します:
新規フィールド: z (実数) 式: 40
4. TINメッシュを作成
加工 ▶ TINメッシュの作成 を使って、ポイントレイヤからTIN(三角網)を作成します。
5. TINメッシュをラスタに変換
「TINメッシュからラスタを作成」ツールを使用し、値フィールドに z を選択し、出力解像度を DEM と合わせて 1m または 5m に指定します。
補足:「内挿する領域」に元のDEMを指定すると、グリッドが揃いやすくなります。
6. TINとDEMを合成(Python)
以下のPythonスクリプトで、TINの値がある部分だけをDEMに上書きし、new付きの新しいラスタを作成します。
# merge_raster_gui.py を実行 # → TINとDEMを選ぶと、"DEMファイル名 + _new.tif" で保存されます
📥 ダウンロード:
7. 結果を確認
出力された *_new.tif をQGISで開いて、変更箇所が反映されているか確認します。
まとめ
- QGISのGUIとPythonを併用することで、柔軟なラスタ編集が可能になる
- 「ライン → 点 → TIN → ラスタ」という流れで、局所的な標高修正が視覚的に行える
- 同様のスクリプトは他のファイルにも使い回し可能
この記事が、あなたの地形解析や災害対応の一助となれば幸いです。
import rasterio
返信削除from rasterio.warp import reproject, Resampling
import numpy as np
from pathlib import Path
from tkinter import Tk, filedialog
# --- ファイル選択 GUI ---
root = Tk()
root.withdraw()
print("🟦 部分修正ラスタ(TIN)を選んでください")
tin_file = Path(filedialog.askopenfilename(title="部分修正ラスタを選択"))
print("🟩 全体ラスタ(DEM)を選んでください")
dem_file = Path(filedialog.askopenfilename(title="全体ラスタを選択"))
# 出力ファイル名生成
out_file = dem_file.with_name(dem_file.stem + "_new.tif")
# --- ラスタの読み込みとリプロジェクト ---
with rasterio.open(dem_file) as dem_src, rasterio.open(tin_file) as tin_src:
dem_meta = dem_src.meta.copy()
dem_array = dem_src.read(1)
dem_nodata = dem_meta.get("nodata", -9999)
aligned = np.full_like(dem_array, fill_value=dem_nodata, dtype=np.float32)
reproject(
source=rasterio.band(tin_src, 1),
destination=aligned,
src_transform=tin_src.transform,
src_crs=tin_src.crs,
dst_transform=dem_src.transform,
dst_crs=dem_src.crs,
resampling=Resampling.nearest,
dst_nodata=dem_nodata,
)
# --- 合成処理(TINがある場所を優先) ---
merged = np.where(np.isnan(aligned) | (aligned == dem_nodata), dem_array, aligned)
# --- 出力 ---
dem_meta.update(dtype="float32", nodata=dem_nodata)
with rasterio.open(out_file, "w", **dem_meta) as dst:
dst.write(merged, 1)
print(f"✅ 統合完了: {out_file}")