NDVI、將函式對應至集合、品質鑲嵌

先前您已瞭解如何取得個別 Landsat 場景,例如: 其中 l8point 是代表 Landsat 8 TOA 集合和感興趣區域幾何的匯入項目: <x0A>

程式碼編輯器 (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 - red) / (NIR + red)。這會產生介於 1 和 -1 之間的數字,其中光合作用活動高的像素具有高 NDVI。以下是在 Earth Engine 中計算 NDVI 的其中一種方式:

程式碼編輯器 (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() 您在前一節遮罩中學到的函式取得近紅外線和紅外線波段,然後使用您也Image數學一節中看過的圖片數學運算子計算 NDVI。最後,使用調色盤顯示圖片。這裡我們在調色盤中使用顏色名稱,而非十六進位字串。(詳情請參閱這份外部參考資料)。

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 頻帶新增至集合中的每張圖片。通常先在單一圖片上測試函式,確認函式是否如預期運作,是很有用的做法。測試個別圖片上的函式,確認函式符合需求後,即可將函式對應至集合:

程式碼編輯器 (JavaScript)

var withNDVI = l8.map(addNDVI);

如要確認這確實是將 NDVI 頻帶放入這個集合中的每張圖片,您可以將 withNDVI 集合新增至地圖,並使用「檢查器」分頁查詢隨機位置。您應該會發現,集合中的每張圖片現在都有一個名為 NDVI 的樂團。

製作最綠的像素合成影像

現在您已建立圖片集合,其中每張圖片都有 NDVI 頻帶,我們可以探索製作合成圖片的新方法:qualityMosaic()。 您可能已注意到,即使是中位數像素合成影像,Landsat 路徑之間仍有不連續性。部分原因可能是相鄰路徑的圖像是在不同時間 (具體來說是間隔 8 天) 收集,導致物候差異。如要盡量減少這類影響,可以嘗試在複合影像中,設定大致處於相同物候階段的像素值,例如植物最綠的時期 (葉子生長且光合作用活躍)。如果我們允許以 NDVI 最大值定義最大綠度,就可以使用 qualityMosaic() 製作複合影像,其中每個像素都包含集合中的 NDVI 最大像素。現在您可以在 withNDVI 集合中使用新增的 NDVI 頻帶:

程式碼編輯器 (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 雲端硬碟資料夾的資料集。