QGISで数値樹冠高モデルから樹頂点を抽出してみよう Part3
はじめに
みなさん、こんにちは。研究開発室の大道です。
前回のブログではQGISのプロセシングを用いて数値樹冠高モデルから樹頂点を抽出しましたが、今回はその手続きを自動化していきます。
全3パートのうち今回はPart3になります。
- Part1: 航空写真と数値樹冠高モデルを重ねて表示してみよう
- Part2: プロセシングを使って数値樹冠高モデルから樹頂点を抽出してみよう
- Part3: モデルデザイナーを使って樹頂点抽出処理を自動化してみよう
これ以降、便宜上、数値樹冠高モデルを樹冠高モデルと呼称します。
想定読者
- QGISを少し触ったことのある方
- 地理空間情報のデータ活用に興味のある方
実行環境
- Windows10
- QGIS 3.34.6
モデルデザイナーを使って樹頂点抽出処理を自動化してみよう
1. モデルデザイナーとは?
モデルデザイナーは様々なアルゴリズムを組み合わせて複雑なワークフローを作ることができます。
Part2では7つのアルゴリズムを使用しましたが、手続きが多くなるほど手作業で操作するのは大変です。
そこで、モデルデザイナーで一連の処理をグラフィカルにつなげて作っておくと手作業の複雑さがなくなります。
また、作成したワークフローはモデルとして保存ができ、複数のワークフローを組み合わせることも可能です。
モデルデザイナーはメニューツールバーの[プロセシング]⇒[モデルデザイナー]から開けます。

(出典:PLATEAU-Ortho、High Resolution Canopy Height Maps by WRI and Metaを加工して作成)
また、プロセシングツールボックスの歯車マークから[新規モデルを作成]でも開けます。


2. モデルデザイナーを使ってみる
2.1 入力パラメータの定義
モデルデザイナーで一連の処理を作る前に、まずは入力パラメータを事前に用意しましょう。
今回は樹冠高モデルのみを使用しますので[ラスタレイヤ]が必要になります。
入力パネルから[パラメータ]⇒[ラスタレイヤ]を白いキャンバスにドラッグ&ドロップしましょう。

すると、パラメータ定義のウィンドウが開くので、説明に「DCM1」と入力します。

OKを押すとキャンバスにラスタレイヤが追加されます。
これが入力パラメータとなります。

2.2 ワークフローの定義
それでは実際にPart2のアルゴリズムをつなげてワークフローを定義していきます。
ただ、最初から全部を定義するのは大変なので、まずは「領域の切り出し」と「フィルタリング」の処理をつなげて出力する所までを順番にやっていきましょう。
アルゴリズムパネルから[GDAL]⇒[ラスタ抽出]⇒[範囲を指定して切り抜く]をキャンバスにドラッグ&ドロップします。

- 入力レイヤ:DCM
- 切り抜く範囲:15238608.5725,15241034.3522,4187900.5975,4190076.1989 [EPSG:3857]
- このnodata値を出力バンドに割り当てる[オプション]:0

入力レイヤの複数の歯車マークはモデル入力のことで、ここでは先程定義したDCMになります。
OKを押すと「範囲を指定して切り抜く」が入力パラメータのDCMとつながってキャンバスに追加されます。

次にフィルタリングの処理を追加しましょう。
アルゴリズムパネルから[GRASS]⇒[Raster]⇒[r.neighbors]をキャンバスにドラッグ&ドロップします。
- Input raster layer:「範囲を指定して切り抜く」の出力ファイル
- Neighborhood operation[オプション]:maximum
- Neighborhood size(must be odd)[オプション]:7
- Neighbors: output_filteredDCM


Input raster layerの単一の歯車マークはアルゴリズム出力のことで、今までのアルゴリズムの出力を入力にしたい場合に使用します。
上図だと1つ前の「範囲を指定して切り抜く」の出力ファイルを入力にしています。
また、このアルゴリズムで一度最終結果を出力する場合は、「Neighbors」に文字を入力して最終結果にするようにします。
ここの文字列は任意ですので、最終結果であることがわかるように調整してみてください。
OKを押すと、以下のようなワークフローが出来上がったと思います。

2.3 モデルの実行
ワークフローが定義できたら、実行ボタンを押して実行ウィンドウを開きます。

DCMの入力を「133002030」に設定して、実行をクリックします。

(出典:PLATEAU-Ortho、High Resolution Canopy Height Maps by WRI and Metaを加工して作成)
実行すると「output2」というレイヤが出力されます。
これは「領域の切り出し」と「フィルタリング」の処理を一つにつなげた結果であり、複数の手続きを1回の実行でできるようになりました。
3. Part2の手続きを自動化してみよう
この後はPart2の手続きをつなげていくだけなので、練習として以下の手続きをつなげてPart2のワークフローを完成させましょう。
以下の太文字はPart2からの変更点です。
- アルゴリズムパネル:[GDAL]⇒[ラスタその他]⇒[ラスタ計算機]
- 入力レイヤ A:「r.neighbors」のNeighbors
- Aのラスタバンド数:バンド1(Palette)
- 入力レイヤ B[オプション]:「範囲を指定して切り抜く」の出力ファイル
- Bのラスタバンド数[オプション]:バンド1(Gray)
- gdalnumeric構文で計算。:A==B
- 出力のnodata値を設定[オプション]:0
- アルゴリズムパネル:[GDAL]⇒[ラスタ変換]⇒[ラスタをベクタ化(polygonize)]
- 入力レイヤ:「ラスタ計算機」の出力レイヤ
- アルゴリズムパネル:[ベクタジオメトリ]⇒[重心]
- 入力レイヤ:「ラスタをベクタ化(polygonize)」のベクタ化
- アルゴリズムパネル:[GDAL]⇒[ラスタ解析]⇒[ベクタレイヤにラスタ値を付加]
- 入力レイヤ:「重心」の重心
- ラスタレイヤ:「範囲を指定して切り抜く」の出力ファイル
- ラスタ値を収納するカラム名の接頭辞[オプション]:height_
- アルゴリズムパネル:[ベクタ選択]⇒[属性による抽出]
- 入力レイヤ:「ベクタレイヤにラスタ値を付加」のサンプリング出力
- 選択基準になる属性:height_1
- 演算子:≥
- 値[オプション]:5
- 抽出された属性:output_treePoints
最終的には以下のようなワークフローができます。

上図のワークフローを実行すると樹頂点がレイヤ上に出力されます。

(出典:PLATEAU-Ortho、High Resolution Canopy Height Maps by WRI and Metaを加工して作成)
実際に手を動かしてみるとより理解が深まると思いますので、是非チャレンジしてみてください。
以上がモデルデザイナーを用いた樹頂点抽出処理の自動化でした。
4. その他機能
モデルデザイナーは他にも様々な機能があります。
- グループボックス
- 作成したモデルをpythonスクリプトとして出力
- 作成したモデルをプロジェクトファイルに保存
- 処理途中の出力
- etc…
上記以外でも便利な機能がありますので詳しくは公式ドキュメントをご参照ください。
おわりに
今回はQGISのモデルデザイナーを用いてPart2の手続きを自動化することができました。
私自身QGISはまだまだ使い始めて日が浅いので、説明において未熟な点が多かったかもしれません。
ただ、非常に強力なGISソフトウェアですので、今後も様々な地理空間情報を活用して知見を共有していきたいです。
Part3までお付き合い頂き、ありがとうございました。