17.10. ラスタ計算機。無データ値

注釈

このレッスンでは、ラスタレイヤの上にいくつかの操作を実行するために、ラスタ計算機を使用する方法について説明します。また、無データ値とは何か、それを計算機や他のアルゴリズムがどのように計算し処理するか、説明します。

ラスタ計算機は、あなたが見つける最も強力なアルゴリズムの一つです。それは多くの異なる計算に使用できる非常に柔軟で汎用性の高いアルゴリズムで、すぐにあなたのツールボックスの重要な一部となるであろうものです。

このレッスンでは、それらのほとんどはかなり単純、ラスタ計算機で、いくつかの計算を実行します。これは、私たちはそれを使用する方法を見て、それはそれを見つけるかもしれないいくつかの特別な状況を扱う方法をできるようになります。それを理解することは、一般的にそれに適用される特定の技術を理解するためにも、計算機を使用して、いつ後で期待される結果を取得することが重要です。

このレッスンに対応するQGISプロジェクトを開きます。それにいくつかのラスタレイヤが含まれていることがわかるでしょう。

今すぐツールボックスを開き、ラスタ計算機に対応するダイアログを開きます。

../../../_images/calculator_dialog.png

注釈

インターフェイスは、最近のバージョンで異なります。

ダイアログには、2つのパラメータが含まれています。

  • 分析に使用するレイヤ。これは複数入力であり、望むだけ多くのレイヤを選択することができます。右側のボタンをクリックし、表示されるダイアログで使用したいレイヤを選択します。

  • 適用する式。式は、上記パラメータで選択され、変数名としてアルファベット文字 (a, b, c...) または g1, g2, g3... で命名されたレイヤを使用します。すなわち、式 a + 2 * bg1 + 2 * g2 と同じであり、第一レイヤの値と第二レイヤの値の2倍の合計を計算します。レイヤの順序付けは選択ダイアログに表示されるのと同じ順序です。

警告

計算機では、大文字と小文字が区別されます。

手始めに、メートルからフィートにDEMの単位を変更します。必要とする計算式は、次のいずれかです。

h' = h * 3.28084

レイヤフィールド内でDEMを選択し、式フィールドに a * 3.28084 とタイプします。

警告

英語以外のユーザーの場合:常に「.」(「,」ではない)を使用してください。

アルゴリズムを実行するために 実行 をクリックしてください。入力レイヤの同じ外観を有するレイヤを得るが、異なる値となります。私たちが使用した入力レイヤは、そのすべてのセル内の有効な値を持っているので、最後のパラメータはまったく効果がありません。

それでは別の計算を実行してみましょう。今回は accflow レイヤについて行います。このレイヤは、積算流量、水文学的パラメータの値が含まれています。それの外部データ値 - それがないと、のみ所与流域の領域内でこれらの値を含んでいます。おわかりのように、レンダリングは、値が分散されている方法に起因する非常に有益ではありません。その流れの蓄積の対数を使用すると、はるかに有益な表現が得られます。ラスタ計算機を使用してそれを計算できます。

再びアルゴリズムダイアログを開き、入力レイヤとして accflow レイヤだけを選択し、次の式を入力します: log(a)

これが得られるレイヤです。

../../../_images/log.png

与えられた点でのレイヤの値を知るために 識別 ツールを選択し、たった今作成したレイヤを選択し、流域の外でポイントをクリックすると、無データ値が含まれていることがわかるでしょう。

../../../_images/identify.png

次の演習のためには1つではなく2つのレイヤを使用しようとしていて、第二のレイヤで定義された流域内だけで有効な標高値を持つDEMを得ようとしています。計算機ダイアログを開き、入力レイヤフィールドにプロジェクトの両方のレイヤを選択します。対応するフィールドに次の式を入力します:

a/a * b

a は、積算流量のレイヤを指し(リストに表示される最初のものであるため)、 b はDEMを指します。外部データ値 - ここで式の最初の部分でしていることはそれ自体で積算流量レイヤを割ることです。この結果は流域内で値1、外でデータなし値です。それからDEMを掛け、流域内でそれらのセルの標高値 ( DEM * 1 = DEM )、外でデータなし値( DEM * no_data = no_data )を得ます

結果のレイヤはこれです。

../../../_images/masked.png

この技術は、ラスタレイヤ内で値を マスク するために頻繁に使用され、ラスタレイヤによって使用される任意の矩形領域でない領域のための計算を実行したいときはいつでも有用です。例えば、ラスタレイヤの標高ヒストグラムはあまり意味を持ちません。代わりそれが流域に対応する値のみを使用して(上記の場合のように)計算される場合、得られる結果は実際に流域の構成についての情報を与える有意味なものです。

実行してきたこのアルゴリズムについては、無データ値とそれらがどのように処理されるかを別にしても、他に興味深いものがあります。私たちが掛け算しているレイヤの範囲を見る場合(それは目次のレイヤーの自分の名前をダブルクリックしてそのプロパティを見ることで行うことができます)、同じでないことがわかります、流れ蓄積レイヤによって覆われる範囲は完全DEMの範囲より小さいので。

それが意味するのは、これらのレイヤが一致しないこと、1つまたは両方のレイヤをリサンプリングすることでそれらのサイズと範囲を同じに揃えなければ直接掛け算はできないことです。しかし、私たちは何もしませんでした。QGISではこのような状況の面倒を見てくれて、必要なときに自動的に入力レイヤをリサンプリングします。出力範囲は、入力レイヤから計算された最小の被覆範囲、およびそれらセルサイズの最小セルサイズです。

この場合(そしてほとんどの場合)、これは所望の結果を生成しますが、どんな操作が追加で行われているかには常に注意しておく必要があります。なぜならそれらは結果に影響を与える可能性があるからです。この動作が希望されない場合がある場合には、手動のリサンプリングが事前に適用されるべきです。後の章では、複数のラスタレイヤを使用したときのアルゴリズムの動作について詳細に見るでしょう。

このレッスンを別のマスク作成の練習で終えましょう。私たちは標高が1000メートルと1500メートルの間のすべての地域で傾きを計算しようとしています。

この場合は、マスクとして使用するレイヤはありませんが、計算機を使用して作成できます。

唯一の入力レイヤとしてDEMを、そして次式を使用して計算を実行します

ifelse(abs(a-1250) < 250, 1, 0/0)

おわかりのように、簡単な代数演算を行うためだけでなく、計算機を使用でき、また上記のような条件文を含むより複雑な計算を実行します。

結果は、私たちが作業をしたい範囲内で値1、およびそれ以外のセルで無データを持っています。

../../../_images/elevation_mask.png

無データ値は0/0の式から来ています。それは未定の値であるので、SAGAは、実際にはデータ値として扱うNaN(非数)の値を、追加します。この小さなトリックを使えば、セルの無データ値が何か知らなくても、無データ値を設定できます。

今、プロジェクトに含まれる傾斜レイヤを掛ける必要があるだけで、希望の結果が得られるでしょう。

すべてのことは、計算機で、単一の操作で行うことができます。これは読者の練習として残しておきます。