NDVI、コレクションに対する関数のマッピング、品質モザイク処理

以前は、次のような方法で個々の Landsat シーンを取得する方法を学びました。ここで、l8point は、Landsat 8 TOA コレクションと対象地域のジオメトリを表すインポートです。

コードエディタ(JavaScript)

// Define a point of interest. Use the UI Drawing Tools to import a point
// geometry and name it "point" or set the point coordinates with the
// ee.Geometry.Point() function as demonstrated here.
var point = ee.Geometry.Point([-122.292, 37.9018]);

// Import the Landsat 8 TOA image collection.
var l8 = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');

// Get the least cloudy image in 2015.
var image = ee.Image(
  l8.filterBounds(point)
    .filterDate('2015-01-01', '2015-12-31')
    .sort('CLOUD_COVER')
    .first()
);

次に、Landsat 画像から正規化植生指標(NDVI)画像を計算するとします。植生は電磁波スペクトルの近赤外線(NIR)領域の光を反射し、赤色領域の光を吸収します(植生からの NIR 反射率の詳細を参照)。NDVI はこれを使用して、ピクセルで発生している光合成活動を大まかに反映する単一の値を作成します。計算式は(NIR - 赤)/(NIR + 赤)です。これにより、1 ~-1 の値が得られます。光合成活性の高いピクセルは NDVI が高くなります。Earth Engine で NDVI を計算する方法の 1 つは次のとおりです。

コードエディタ(JavaScript)

// Compute the Normalized Difference Vegetation Index (NDVI).
var nir = image.select('B5');
var red = image.select('B4');
var ndvi = nir.subtract(red).divide(nir.add(red)).rename('NDVI');

// Display the result.
Map.centerObject(image, 9);
var ndviParams = {min: -1, max: 1, palette: ['blue', 'white', 'green']};
Map.addLayer(ndvi, ndviParams, 'NDVI image');

結果は図 8 のようになります。マスキングに関する前のセクションで学習した select() 関数を使用して NIR バンドと赤色バンドを取得し、Image 数学に関するセクションで以前に見た画像数学演算子を使用して NDVI を計算します。最後に、パレットを使用して画像を表示します。ここでは、パレットで 16 進文字列ではなく色名を使用しました。(詳しくは、CSS の色に関する外部リファレンスをご覧ください)。

Tutorial_api_08_ndvi.png
図 8. 単一の Landsat シーンの NDVI。青は NDVI が低く、緑は NDVI が高いことを示します。

正規化差分演算はリモート センシングで非常に一般的であるため、ee.Image には、前の例のコードを簡素化するのに役立つショートカット関数があります。

コードエディタ(JavaScript)

var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');

コレクションに対する関数のマッピング

ここで、画像コレクション内のすべての画像に NDVI を追加するとします。Earth Engine でこれを行うには、コレクションに対して関数を map() します。map()Map オブジェクトを混同しないでください。前者はコレクションのメソッドであり、コレクション内のすべての要素に関数を適用するという並列コンピューティングの意味map を使用します。この関数は、コレクション内のすべての要素に適用されるオペレーションを定義します。JavaScript チュートリアルで簡単な関数について説明しましたが、ここでは Earth Engine の機能を含む関数を作成します。たとえば、前の NDVI コードを、NDVI バンドを含む入力画像を返す関数にコピーします。

コードエディタ(JavaScript)

var addNDVI = function(image) {
  var ndvi = image.normalizedDifference(['B5', 'B4']).rename('NDVI');
  return image.addBands(ndvi);
};

// Test the addNDVI function on a single image.
var ndvi = addNDVI(image).select('NDVI');

このコードは、単一の画像の NDVI を計算する場合には効率的ではない可能性がありますが、この関数を map() の引数として使用して、コレクション内のすべての画像に NDVI バンドを追加できます。多くの場合、関数が想定どおりに動作することを確認するために、まず 1 つの画像で関数をテストすると便利です。個々の画像で関数をテストし、目的の処理が行われることを確認したら、コレクションにマッピングできます。

コードエディタ(JavaScript)

var withNDVI = l8.map(addNDVI);

このコレクションのすべての画像に NDVI バンドが実際に追加されていることを確認するには、withNDVI コレクションを地図に追加し、[Inspector] タブでランダムな位置をクエリします。コレクション内の各画像に NDVI というバンドが追加されていることがわかります。

最も緑色のピクセルを合成する

各画像に NDVI バンドが含まれる画像コレクションを作成したので、qualityMosaic() という新しい合成方法を試してみましょう。Landsat パス間には、中央値ピクセル合成でも不連続性が見られることがあります。その理由の一部は、隣接するパスの画像が異なるタイミング(具体的には 8 日間隔)で収集された結果として、フェノロジーに違いが生じたことにある可能性があります。この影響を最小限に抑える方法の 1 つは、合成のピクセル値をほぼ同じフェノロジー段階(植物の緑が最も濃い時期など、葉が茂り光合成が活発な時期)に設定することです。最大 NDVI で最大緑度を定義すると、qualityMosaic() を使用して、各ピクセルにコレクションの最大 NDVI ピクセルを含むコンポジットを作成できます。これで、追加した NDVI バンドを withNDVI コレクションで使用できるようになりました。

コードエディタ(JavaScript)

// Make a "greenest" pixel composite.
var greenest = withNDVI.qualityMosaic('NDVI');

// Display the result.
var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3};
Map.addLayer(greenest, visParams, 'Greenest pixel composite');

このコードの結果は、図 9 のようになります。図 9 と図 6 に示す複合の中央値を比較すると、最も緑色の強いピクセル複合は実際にはかなり緑色であることがわかります。ただし、水域を詳しく調べると、別の問題が明らかになります。具体的には、水域が曇って表示されるようになります。これは、qualityMosaic() メソッドの動作方法によるものです。各位置で、時系列全体が調べられ、NDVI バンドの最大値を持つピクセルが合成値として設定されます。NDVI は雲のほうが水よりも高いため、水域は曇ったピクセルになり、植生域はすべて緑色で表示されます。これは、ピクセルの植生が光合成を活発に行っているときに NDVI が最も高くなるためです。

Tutorial_api_09_greenest.png
図 9. Landsat 8 の最も緑の多いピクセルの合成。

これで、Earth Engine で画像を合成してモザイク処理する方法をいくつか確認しました。時間と場所でフィルタされた画像、またはコレクション内のすべての画像から、最新の値、中央値、最も緑色のピクセルを含む合成画像を作成できます。画像で計算を行い、情報を抽出する方法を学習しました。次のページでは、Earth Engine から情報を取得する方法について説明します。たとえば、グラフや Google ドライブ フォルダにエクスポートされたデータセットなどです。