GRASS7: 集水域を計算する

(使用したGRASSバージョン): 7.8.4

GRASSで集水域を計算する際の一連の手順をまとめてみました。

下準備

ロケーションは投影座標系で作成されたものを使用します。基盤地図情報のDEMを使用する場合はGRASSにインポートする前にロケーションに合わせて投影変換を行っておきます。このとき、変換後のピクセル解像度は必ず確認しておきましょう。基盤地図情報DEMの場合は緯度によってピクセル解像度が異なります。目安として、東京付近であれば11m弱です。また、その際の内挿法も注意しましょう。個人的にはDEMの内挿法はlinearが適切なのかなと思います。

インポートが完了したら、まず現在のリージョンをインポートしたDEMレイヤに合わせたのち、r.fill.dirで凹陥地を埋める処理を行います。

r.fill.dir画面

inputにDEMを指定し、outputに凹陥地を埋めたレイヤを指定します(ここではfill)。また、これ以降使用はしませんが、必須項目である流路方向を示すdirection出力レイヤ名も指定します。

計算のもととなるレイヤを作成

次に、集水域計算のもととなるレイヤをr.watershedコマンドで作成します。

r.watershed入力画面
r.watershed出力画面

“Input”タブの”elevation”に、先ほど作成したfillを指定します。次に”Output”タブにある”accumulation”と”drainage”にそれぞれ出力レイヤ名を指定します(ここではそれぞれaccum、drainage)。”Option”タブには流路決定に関するいくつかのチェック項目があります。それぞれの設定が完了したらコマンドを実行します。

drainageレイヤ
accumulationレイヤ

流路ネットワークの作成

ある地点の集水域は、大まかにいうと谷底以外の場所では集水面積が非常に小さくなるので、有効な場所をある程度絞り込んでおく必要があります。そこで、事前にr.stream.extractコマンドで流路ネットワークを作成しておき、有効な場所を図示しておきます。

r.stream.extract Requiredタブ

“Required”タブには入力レイヤとしてfillと”threshold”の値を指定します。”threshold”は流路の起点となる最小の集水面積で、セル数単位で指定します。

r.stream.extract Input mapsタブ

“Input map”タブでは、”accumulation”のところにaccumレイヤを指定します。

r.stream.extract Output mapsタブ

最後に、”Output maps”タブに出力レイヤ名を指定します。ここではベクタレイヤだけ指定しておけばいいかと思います。

実行すると以下のように落水線が生成されます。このライン上のセルは集水面積がthreshold以上ある箇所ということになります。

r.stream.extract実行結果

集水域の計算

集水域の計算を行うコマンドはr.water.outletです。

r.water.outlet画面

“input”にはdrainageレイヤを指定します。出力は指定した地点の集水域ラスタになります。”coordinates”は座標を入力しますが、右側にある矢印ボタンを押してMap上をクリックすることで座標値を得ることができます。このとき、r.stream.extractで作成した線上をクリックすることでそれなりに面積がある集水域ラスタが生成されます。

r.water.outlet実行結果

出力ラスタはリージョンの範囲全体なので、DEMの範囲が広い場合は集水域がありそうなところだけにリージョンを限定したほうがいいでしょう。

座標値がファイルなどで指定されている場合

この場合、指定された座標値が落水線上にきっちり乗っていなくて、集水域が作成されない恐れがあります。そのような場合は指定された座標値を計算起点とするのではなく、落水線上に適切に移動した地点を指定しなければなりません。一例として、指定された座標のポイントレイヤを作成し、落水線レイヤに対してv.distanceで最短距離のベクタレイヤを作成し、その端点を計算起点にするといった処理が必要になります。

アーカイブ