GEEで四則演算を使う方法

GEE

今回は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つの関数があります。

  1. 足し算(add)
  2. 引き算(subtract)
  3. 割り算(divide)
  4. 掛け算(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では提供されています。

もし、興味がある方はドキュメントで探してみるといいかもしれません

使用データ

Landsat-7 image courtesy of the U.S. Geological Survey

コメント

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