A and B、A or B、A xor B、A nor B といった論理演算というものがありますが、GIS でもオーバーレイ解析の一つとして複数のデータを重ね合わせて条件に一致する・しないといった論理処理を行うことがあります。
1ビット論理演算による変化抽出
論理演算を行うことで変化があった箇所を抽出することができます。論理演算とは「あるかないか」「0 か 1」で考える方法です。下の図で 0 が水域、1 が陸地として、例えば大雨で河川が氾濫した際にどの地域が湛水したかを抽出したいとします。
もし、水域(0)はすべて水域のままで、陸地(1)に変化することがない前提であれば、「変化がおこったところ(1 → 0)という条件である排他的論理和(XOR)によって対象地域を抽出することができます。
しかし、元々水域(0)だったものが陸地(1)になった箇所も存在すると、排他的論理和(XOR)では絞り込むことができません。
複数ビットによる論理演算
論理演算は 1ビット(0 か 1 のみ)しか使ってはいけないというルールはありません。複数ビットを使うことで「陸地→水域」になった箇所のみを抽出することができます。変化前と変化後にそれぞれ別の値を割り当てます。複数ビットとは、2 の乗数を使用するということです。0 を使うこともできますが、今回の場合、水域、陸地、変化前、変化後なので、1、2、4 、8 の 4種類の数値を使い、4パターンの結果を得ました。
変化前 水域 (1) | 変化前 陸域 (2) | |
---|---|---|
変化後 水域 (4) | 5 | 6 |
変化後 陸域 (8) | 9 | 10 |
変化前は陸域で変化後は水域になった箇所は「6」に該当する箇所と判断できます。
ビット定数
数値の足し算で結果を求めたい場合は、2の乗数を使用します。なぜ2の乗数ではないといけないのかというと、たとえばフラグとして 1、2、3、4、、、とすべての整数で同じことをやってみます。そうすると結果が「5」になるパターンが 2つ存在することになっています。「変化前 陸域→変化後 水域」と「変化前 水域→変化後 陸域」の値が同じ「5」なので、どちらを指しているのかが分かりません。
変化前 水域 (1) | 変化前 陸域 (2) | |
---|---|---|
変化後 水域 (3) | 4 | 5 |
変化後 陸域 (4) | 5 | 6 |
同じ数値同士は足さない前提とすると、2の乗数同士の足し算では必ずユニークな値となるのです。これは二進数に置き換えてみると分かります。
十進数 | 二進数 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
4 | 0100 |
8 | 1000 |
二進数では各桁には 0 か 1 しか使われないので、これをスイッチの ON / OFF のように考えると「6」になりうるパターンは 1つの組み合わせでしか起きないため該当箇所が絞り込めるのです。ビット定数には 0 を使っても問題ないですが、今回は変化前後という 2つの掛け合わせなので必ず 2 つのビットを立てる、という意味で 0 を除外しました。
変化前 水域 (1) | 変化前 陸域 (2) | |
---|---|---|
変化後 水域 (4) | 5 (0101) | 6 (0110) |
変化後 陸域 (8) | 9 (1001) | 10 (1010) |
まとめ
「複数のビットを立てる」という方法で特定パターンの変化抽出箇所を求めることができました。2の乗数の値を「ビット定数」と呼んだりもしますが、今回の例に限らず、プログラムでビット定数が使われることも多々あります。ArcGIS Desktop の中にも結構あり、たとえばあるプロパティに複数チェックが設定できる GUI を定数値で設定する場合に利用されています。ArcObjects のビット定数でこのようなものがあります。
今回は 2通りで 2時期の変化抽出に利用しましたが、これに限らず 1、2、4、8、16、32、64、128、、、と利用すれば複数通りで多時期間の特定変化も抽出できます。
ArcGIS での具体的な処理では、洪水時の湛水箇所判定では、たとえば合成開口レーダー衛星を使うと水域を判定することができます。洪水前後の画像が入手できるなら、ラスター演算の CON関数で水域・陸地を分類して数値を割り当て、加重合計でセルの足し算を行いビット判定することで目的の箇所を自動抽出することができます。