QGISでTINを用いた標高修正ラスタの作成手順

QGISで標高ラスタを部分修正する:ラインからTIN生成までの全手順

この記事では、以下の流れで標高修正ラスタを作成する方法を解説します:

  1. ラインを作成
  2. 等間隔で点を生成
  3. 点に標高(例:40m)を一括入力
  4. TINメッシュを作成
  5. TINをラスタに変換
  6. 元の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" で保存されます

📥 ダウンロード:

merge_raster_gui.py をダウンロード

7. 結果を確認

出力された *_new.tif をQGISで開いて、変更箇所が反映されているか確認します。


まとめ

  • QGISのGUIとPythonを併用することで、柔軟なラスタ編集が可能になる
  • 「ライン → 点 → TIN → ラスタ」という流れで、局所的な標高修正が視覚的に行える
  • 同様のスクリプトは他のファイルにも使い回し可能

この記事が、あなたの地形解析や災害対応の一助となれば幸いです。

コメント

  1. 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}")

    返信削除

コメントを投稿

このブログの人気の投稿

石川県:土砂災害(特別)警戒区域+CS立体図

日本でよく使う EPSG コード 一覧

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