今回はGoogle Earth Enigne(GEE)で四則演算を使う方法を紹介します
GEEで四則演算を使おうと思うと、Javascript(JS)やPythonの一般的な四則演算は画像に対して利用できず、GEE内で提供されている関数を利用する必要があります
例えば下記のような足し算を+演算子でやろうと思うとエラーが起きてしまいます
var red = img.select('SR_B4');
var ir = img.select('SR_B5');
var plus_img = red + ir
エラー内容:
not found (does not exist or caller does not have access).
そこで、本記事ではGEEの基本的な四則演算の関数を紹介していきます!
ソースコードはこちら
基本的な四則演算用の関数
基本的な四則演算は下記の4つの関数があります。
- 足し算(add)
- 引き算(subtract)
- 割り算(divide)
- 掛け算(multiply)
これらの関数は画像(ee.Image)に対して利用できます。
関数の引数には下記のように画像、もしくは数値が指定できます。
// バンドの選択
var red = img.select('SR_B4');
var ir = img.select('SR_B5');
// ndvi = (IR - RED) / (IR + RED)
// + 足し算
var plus_img = ir.add(red);
// - 引き算
var minus_img = ir.subtract(red);
// / 割り算
var ndvi = minus_img.divide(plus_img);
// × 掛け算
var multiplied_ndvi = ndvi.multiply(10);
この関数を活用すると上記のように、NDVIを独自に算出できるようになります。
しかし、複雑な演算では、複数の関数を同時に使うことになるので、可読性の低下や行数の増加に繋がります。
そこで、利用できるのがexpression関数です。
Expression関数を利用する方法
expression関数も同じく画像(ee.Image)に対して利用できますが、テキストベースで演算が可能です。
この関数の引数にはテキストでb()の中にインデックス番号やバンド名を指定することにより、演算してくれます。
例えば、インデックス番号を指定する場合は下記のようになります。
※0番スタートなのに注意
var ndvi_exp= '(b(4) - b(3)) / (b(4) + b(3))';
var ndvi_exp_img = img.expression(ndvi_exp);
バンド名を指定する場合は下記のようにbの中に記載するだけです。
バンド名はダブルクォーテーション(“)で囲みます。
var ndvi_exp= '(b("SR_B5") - b("SR_B4")) / (b("SR_B5") + b("SR_B4"))'
var ndvi_exp_img = img.expression(ndvi_exp);
このように記載することで、コードが短くなり可読性の向上につながります。
また、これらの利用方法はPythonでも同様に使えます!
ソースコード
最後に本記事で紹介した四則演算関数を利用して、NDVIを算出する方法を紹介します。
6月から8月までの中央値の画像を作成した後、NDVIを算出しています。
var dataset = ee.ImageCollection('LANDSAT/LC09/C02/T1_L2')
.filterDate('2023-06-01', '2023-08-01');
// Applies scaling factors.
function applyScaleFactors(image) {
var opticalBands = image.select('SR_B.').multiply(0.0000275).add(-0.2);
var thermalBands = image.select('ST_B.*').multiply(0.00341802).add(149.0);
return image.addBands(opticalBands, null, true)
.addBands(thermalBands, null, true);
}
Map.setCenter(130.674, 31.6021, 12);
var pallete = [
'ffffff', 'ce7e45', 'df923d', 'f1b555', 'fcd163', '99b718', '74a901',
'66a000', '529400', '3e8601', '207401', '056201', '004c00', '023b01',
'012e01', '011d01', '011301'
];
// 中央値画像の作成
var img = dataset.map(applyScaleFactors).median();
// バンドの選択
var red = img.select('SR_B4');
var ir = img.select('SR_B5');
// ndvi = (IR - RED) / (IR + RED)
// + 足し算
var plus_img = ir.add(red);
// - 引き算
var minus_img = ir.subtract(red);
// / 割り算
var ndvi = minus_img.divide(plus_img);
Map.addLayer(ndvi, {min: 0, max: 1, palette: pallete,}, 'ndvi');
// × 掛け算
var multiplied_ndvi = ndvi.multiply(10);
Map.addLayer(multiplied_ndvi, {min: 0, max: 10, palette: pallete}, 'multi ndvi');
// expression関数を使う方法
// bandのインデックス番号を指定0スタート。
// もしくは'(b("SR_B5") - b("SR_B4")) / (b("SR_B5") + b("SR_B4"))'のようにバンドの名前を指定
var ndvi_exp = '(b(4) - b(3)) / (b(4) + b(3))';
var ndvi_exp_Img = img.expression(ndvi_exp);
Map.addLayer(ndvi_exp_Img, {min: 0, max: 1, palette: pallete}, 'expression ndvi');
発展
これらの関数を利用することで、インデックス指標の作成が容易になります
また、これらの関数以外にも累乗やSinなどもGEEでは提供されています。
もし、興味がある方はドキュメントで探してみるといいかもしれません
コメント