iRIC/DHABSIMの魚の生息場計算結果をQGISで分析する

HabitatModel

iRIC/DHABSIMは簡単に魚の住みよい河川かどうかを調べることができるツールです。計算結果は色分け表示されるので、目で見て判断するには良いのですが、数値としてどうなの?ということを調べるのはちょっと難しい。QGISを使って数値で結果を表してみます。

iRIC/DHABSIMの計算結果ってどんなもの?

下図左はiRIC/DHABSIMの計算で使われた水深を表示したもの、下図右は魚の棲みかとしての良否を表す生態環境多様性指数(EED)を表示したものです。EEDは1に近い赤色ほど良い棲みか、0に近い青色ほど悪い棲みかを表しています。河川の中のEEDの分布は一目でわかるのですが、例えば河川改修をしてEEDが変化したとき、この区間全体として良くなったのか悪くなったのかを端的に数字で表す方法が提供されていません。

iRIC/DHABSIMの計算結果例
iRIC/DHABSIMの計算結果例

例えばこの区間のEEDの平均値を出せれば良いのですが、2023年2月現在のiRIC/DHABSIMの出力は、河川内の水が流れているが魚の棲みにくい場所も、河川外の水が流れておらず魚が棲まない場所も、同じEED=0という値が出力されており、単純に計算結果全体を平均してしまうと値が小さくなってしまうのです。

iRIC/DHABSIMのEED計算結果を数値化する考え方

考え方は単純で、EEDの計算結果をQGISに取り込み、集計したい範囲を示すマスクポリゴンを作成して、マスクポリゴン内のEED値だけを平均すれば良いのです。他の多くのiRICソルバと違いDHABSIMの計算格子は領域全体に同じ大きさの正方形なので、このような単純な処理が可能です。マスクポリゴンは手で描いても良いのですが、本稿の例のように水際の形が不整な計算結果の場合、作業する人によって集計結果が変わってしまう恐れがあります。

そこで本稿では、水がある範囲を元にして機械的にマスクポリゴンを作成することを考えます。

iRIC/DHABSIMの計算結果をエクスポートする

マスクをつくる元になる水深データと、EED計算結果をエクスポートします。前節の図左のオブジェクトブラウザーで赤枠で囲んだiRICZone – Depthが水深、前節の図右のオブジェクトブラウザーで赤枠でEvaluationpoints – Diversity(EED)がEEDです。

下図のように、ファイルメニューから「エクスポート」ー「計算結果」をクリックするとダイアログが表示されるので、iRICZoneを選択すると水深などのデータが、Evaluationpointsを選択するとEEDがExportされます。下図ではそれぞれGrids_1.csv, EED_1.csvとして出力しています。iRIC/DHABSIMは流量の時間変化に伴うEED変化も計算していますが、ここでは「全タイムステップ」のチェックを外し、最終結果だけをCSVファイルにしています。

iRIC/DHABSIMの計算結果のエクスポート
iRIC/DHABSIMの計算結果のエクスポート

出力されたCSVファイルをテキストエディタで表示したものが下図です。左のGrids_1.csvには水深(Depth)の他、点の座標や流速も含まれています。右のEED_1.csvには点の座標とEEDが含まれています。

Grids_1.csvとEED_1.csvの内容
Grids_1.csvとEED_1.csvの内容

iRIC/DHABSIMの計算結果をQGISにインポートする

QGISのメニュー「レイヤ」ー「レイヤを追加」ー「CSVテキストレイヤを追加…」を選ぶと、下図の「データソースマネージャ|CSVテキスト」ダイアログが開きます。このダイアログで、Grids_1.csvとEED_1.csvを読み込みます。

Grids_1.csv(左)、EED_1.csv(右)をQGISのレイヤに読み込む
Grids_1.csv(左)、EED_1.csv(右)をQGISのレイヤに読み込む

インポートした結果は下図左のようになります。ポイントデータとして読み込まれます。念のためにそれぞれのレイヤの属性テーブルを開き、値がきちんと読み込まれているか確認してください。自動的にデータの型(実数か整数かなど)が決定されるのですが、1行目に整数のデータがあると、2行目以降に実数のデータがあっても整数として読まれることが過去のバージョンではありました。QGIS3.22ではうまく読まれているようです。

インポートしたら属性テーブルを確認する
インポートしたら属性テーブルを確認する

データの値を詳しく確認する

それぞれのレイヤを右クリックし、「プロパティ」ー「シンボロジ」ダイアログを開いて表示形式を「連続値による定義」に変更し、下図のようにDepth(左)とEED(右)について、特に0付近を詳細に色分けしてみましょう。ポイント数が多いので、シンボルのストローク色を透明にし、サイズを1とか0.5とか小さく設定する必要があるかもしれません。

Grids_1レイヤ、EEDレイヤの色分け表示
Grids_1レイヤ、EEDレイヤの色分け表示

上図左の水深図から、この計算結果では河川堤防などの本来水がないはずの場所でも水深はゼロではなく、3mm以下の小さな水深が記録されていることがわかります。このあたりはiRICの流況計算ソルバーの性質にもよるので、どのソルバーでもかならずそうなっているとは限りませんが、本稿では水深3mmより小さい場所は水がないと考えることにします。

上図右のEED図からは、黒色のEED=0のエリアが水がある場所にも水がない場所にも広がっていることがあらためて確認できます。

マスクを作成する

すだくん
すだくん

マスクの作成方法はいろいろ考えられるよ。特に水際のEEDは高くなることが多いから、その場所がマスクからはみ出ていたりすると気になるよね。

下でも使っているTIN内挿で水深ラスタを作って、ラスタ計算機で0.003mより大きいところを1,小さいところを0にしたバイナリ(0-1)ラスタを作成してからポリゴンにする方法など、水際を細かく調整できる(上の0.003を変更する)方法などもあるので、必要に応じて工夫してね。

水がある場所を0、それ以外の場所を-9999としたWaterフィールドを作成する

Grids_1レイヤの属性テーブルを開き、フィールド計算機で整数型の新しいWaterフィールドを作成します。水があれば0、水がなければ-9999とします。計算式は以下のとおりです。

if ("Depth" > 0.003, 0, -9999)
水がある場所を0、それ以外の場所を-999としたWaterフィールドを作成する
水がある場所を0、それ以外の場所を-9999としたWaterフィールドを作成する

CSVのレイヤをエクスポートしてポイントシェープファイルにしておく

CSVから作成したレイヤは編集したり前項のフィールドの追加結果を保存したりできませんので、Grid_1, EED_1両方とも、ここでシェープファイルとして保存しておきます。それぞれのレイヤを右クリックし、「エクスポート」ー「新規ファイルに地物を保存」を選んで、以下のような設定でwater.shpファイル、EED.shpファイルに保存しましょう。

編集不可能なCSVレイヤを編集可能なシェープファイルにエクスポートする
編集不可能なCSVレイヤを編集可能なシェープファイルにエクスポートする

水のある場所を示すラスタを作成する

最終的には水のある場所を示すマスクポリゴンを作りたいのですが、その前段階として、Waterレイヤのポイント値をTINで内挿したラスタファイルを作成します。「TIN内挿(不規則三角網)」ツールを使います。領域はボックス右端のドロップダウンからWaterレイヤの領域を選べば良いです。

TIN内挿で水のある場所を示すラスタを作成する
TIN内挿で水のある場所を示すラスタを作成する

ラスタからポリゴンを作成する

「ラスタをベクタ化(polygonize)」ツールでポリゴンを作成します。

ラスタのベクタ化
ラスタのベクタ化

水がある場所を示すポリゴンを残して他の部分を削除する

下図左は前節で作成されたmaskレイヤで、下図中央がその属性テーブルです。フィールド名の部分をクリックすると昇順・降順に交互に整列します。降順に整列させると、水の存在(DN=0)を表すポリゴンは8個しかありませんが、全体では60万個以上のポリゴンフィーチャが作成されていることがわかります。ここでは、DN=0のフィーチャ以外はすべて削除します。

まず、下図の少ないDN=0のフィーチャを属性テーブルで選択します。このくらいの数ならレコード番号をControl-左クリックで選択していけば良いでしょう。もっと多ければ式で選択します。選択されたものは下図左のように黄色で表示されます。

水がある部分を属性テーブルで選択する
水がある部分を属性テーブルで選択する

次に①「選択部分を反転する」をクリックすると、DN=0以外のフィーチャが選択されますので、②「削除」します。

選択範囲を反転し、選択された部分を削除する
すだくん
すだくん

この削除処理、僕のRazer Blade Stealth 13ではいくら待っても終了しなかったよ。M1 macbook airにコピーして実行すると1,2分で終わった。Razerでいろいろな処理をした後だったので不安定になっていたのかもしれないけれど、そんなこともあることは覚えておいてね。

さらに、目的に合わせて不要なフィーチャを削除しておきます。下図ではまず必要なフィーチャを選択し、前の処理と同様に選択範囲を反転させて削除しました。

水があると判定されたポリゴンからマスクとして使用する部分を残し、他の部分を削除する
水があると判定されたポリゴンからマスクとして使用する部分を残し、他の部分を削除する

さらに、流況計算結果の上流端、下流端は信用できないことが多いので、それらの部分を切り取るためのclipポリゴン(下図の茶色の部分)を作成し、「切り抜く(clip)」ツールで端を切り取ってしまいます。

iRICの計算結果の信頼度が低い上流端、下流端を削除するためのポリゴンを作成し、水のある部分を切り取る
iRICの計算結果の信頼度が低い上流端、下流端を削除するためのポリゴンを作成し、水のある部分を切り取る

作成したマスクでEEDレイヤをクリップする

下図の緑色の部分が、完成したマスクポリゴンです。「切り抜く(clip)」ツールでEEDレイヤを切り抜きましょう。

何故かこの操作だけは、切り抜き結果のボックスにファイル名だけが記入された状態でなければエラーになった。バグかもしれない。
何故かこの操作だけは、切り抜き結果のボックスにファイル名だけが記入された状態でなければエラーになった。バグかもしれない。
かわのさん
かわのさん

この作業では、いつものようにツールダイアログの「切り抜き結果」右端のドロップダウン(上図赤枠右端)から保存するフォルダを開いてファイル名を入力すると、実行しても保存できないエラーが発生したよ。私の場合は、ドロップダウンを開いて保存したいフォルダを表示したら一旦キャンセルして「切り抜き結果」ボックスにフォルダ名は書かずに直接ファイル名だけを記入したら保存できたわ。それでもダメで、シェープファイルではなくGeoPackageで保存すればできたという人もいたわね。QGIS3.22.11と3.22.15で再現したよ。バグっぽいけど、とりあえず覚えておいてね。

EEDの平均値を求める

ここまでの操作で、集計したい範囲のEEDだけを取り出したEED_clippedレイヤができました。「ベクタ解析」-「属性の基本統計量(HTML出力)」ツールで統計値を計算しましょう。

下図のようにツールのダイアログを開き、パラメータを設定して実行すると、QGISウインドウ右下の結果ビュアーにリンクが表示されます。これをクリックすると、下図右のようにブラウザに集計結果が表示されます。とりあえず平均値がこの区間のEED代表値だと思いますが、最大値や標準偏差、個数なども目的によっては役に立つと思いますよ。 Have fun!

属性の基本統計量で平均値を求める
属性の基本統計量で平均値を求める

コメント

タイトルとURLをコピーしました