[遙測教學系列]如何使用Google Earth Engine (GEE)進行區域NDVI自動化計算

關鍵字: #GIS #QGIS #RS #NDVI #GEE #Google Earth Engine #Batch processing

Google Earth Engine (GEE)進行區域NDVI自動化計算

今天我要介紹如何使用Google Earth Engine(GEE)進行NDVI植被指標的雲端運算。

Google Earth Engine(GEE)是一個基於Google雲服務基礎設施的遙感大數據分析平台。它利用Google的強大雲計算能力,結合NASA、ESA、NOAA等機構提供的衛星影像和地理空間數據,實現了全球尺度的地球表面變化監測、趨勢繪製和差異量化。GEE為科學家、研究人員和開發者提供了一個方便、高效、免費的服務平台,幫助他們解決森林退化、糧食安全、災害預警、水資源管理、氣候監測和環境保護等重要的社會問題。

NDVI則是一種常用的植被指數,可以反映地表植被的生長狀況和活力。NDVI的計算公式是(近紅外波段-紅光波段)/(近紅外波段+紅光波段),其值範圍在-1到1之間,其中高值表示植被茂盛,低值表示植被稀疏或缺乏,相關內容可以參考先前介紹使用QGIS進行NDVI計算的教學。

————————————————————————————

要使用GEE進行NDVI 批次計算,我們通常需要以下幾個步驟:

  1. 選擇合適的影像集:
    GEE提供了多種衛星影像集合,例如Landsat、Sentinel、MODIS等,我們可以根據自己的需求和目標區域選擇合適的影像集合。例如,如果我們想要分析近幾年研究區域的植被變化,我們可以選擇Sentinel-2影像集合,它具有高分辨率(10米)和高頻率(約5天一次)的優勢。
  2. 過濾和裁剪影像集合:
    由於影像集合中可能包含了不需要的影像,例如雲層覆蓋的影像或者超出目標區域的影像,我們需要對影像集合進行過濾和裁剪,以提高計算效率和精度。我們可以使用GEE提供的過濾器,例如日期範圍、雲量百分比、空間範圍等,來篩選出我們需要的影像。我們也可以使用GEE提供的幾何工具,例如點、線、面等,來定義我們感興趣的區域,並將影像集合裁剪到該區域。
  3. 定義NDVI函數:
    在GEE中,我們可以使用 normalizedDifference() 函數來快速計算NDVI,它接受兩個參數,分別是近紅外波段和紅光波段的名稱。由於不同的影像集合可能有不同的波段名稱,我們需要根據自己選擇的影像集合來指定這兩個參數。例如,對於Sentinel-2影像集合,近紅外波段是’B8’,紅光波段是’B4’。然後,我們可以使用map()函數來將NDVI函數映射到每一張影像上,得到一個新的含有NDVI波段的影像集合。
  4. 輸出和展示結果:
    最後,我們可以使用GEE提供的輸出和展示工具來查看和分析我們計算得到的NDVI結果。例如,我們可以使用addLayer()函數來將NDVI影像添加到地圖上,並指定顏色調色板和值範圍來增強視覺效果。我們也可以使用Chart.image.seriesByRegion()函數來繪製NDVI隨時間變化的折線圖,並指定減少器、比例尺和系列屬性來控制圖表的細節。

範例練習:利用Sentinel-2計算台北市2020的每月NDVI影像

1.開啟GEE-Code Editor

首先我們先到Google Earth Engine的官方網站,點進主頁後根據下圖,依序點選Platform->Code Editor,進入腳本編輯頁面

GEE

接著會進入Code Editor頁面,主要可以分成下列的功能區塊,左側區塊顯示預設以及自己編寫的腳本、上傳圖資等;

中間區塊則是進行腳本編寫;右側區塊顯示程式執行的成果,最下方的地圖則是能進行交互協作,主要可以顯示計算圖資成果以及繪製ROI區域。

GEE

2.編寫批次計算NDVI腳本-以台北市為例:

-劃設ROI區域以及載入影像

首先我們先將下方地圖移動到台北市,並且利用矩形形狀工具繪製大概的台北範圍,繪製完畢後會自動新增一個Polygon物件:{var geometry},我們可以透過這個多邊形物件去針對影像進行裁切,接下來在上方搜尋列輸入[Sentinel-2]載入Sentinel-2的影像集。

這時候一樣會自動升成一個影像集物件變數,我們將範圍改名[Taipei]、影像集改名為[Sentinel2]

-利用JS編寫計算NDVI的程式

以下附上參考程式碼以及註解。
這段程式碼的功能是從 Sentinel-2 影像集中選取特定時間範圍、空間範圍和雲覆蓋百分比的影像,然後計算每個月的平均 NDVI 值,並將結果顯示在地圖上和下載到Google Drive中。程式碼中的註解提供了對每個步驟的詳細解釋。

//利用各filter,針對時間、空間、雲覆蓋等進行影像集過濾
var S2_image = ee.ImageCollection(Sentinel2)
  .filterDate('2020-01-01', '2020-12-30')  // 選擇時間範圍
  .filterBounds(Taipei)  // 選擇空間範圍
  .filter(ee.Filter.lte('CLOUDY_PIXEL_PERCENTAGE', 50));  // 選擇雲覆蓋百分比小於等於50%

//導入GEE批次處理需要用的變數
var batch = require('users/fitoprincipe/geetools:batch');

//編寫計算NDVI的function
var addNDVI = function(image) {
  var ndvi = image.expression("(Nir-Red)/(Nir+Red)", {
    Nir: image.select("B8"),
    Red: image.select("B4")
  }).rename('NDVI');
  return image.addBands(ndvi);  // 新增計算後的NDVI波段到影像中
};

//每個月進行中位數NDVI的計算
var monthlyNDVI = ee.ImageCollection.fromImages(
  ee.List.sequence(1, 12).map(function(month) {
    var start = ee.Date.fromYMD(2020, month, 1);  // 設定起始日期
    var end = start.advance(1, 'month');  // 設定結束日期
    var monthlyImages = S2_image.filterDate(start, end);  // 從影像集中選擇該月份的影像

    var meanNDVI = monthlyImages.map(addNDVI).select('NDVI').mean().clip(Taipei);  // 計算該月份的平均NDVI並裁剪到Taipei範圍內
    return meanNDVI.set('month', month);  // 設定月份屬性
  })
);

print(monthlyNDVI);  // 在控制台中印出月平均NDVI影像集

var month = 1;  // 要顯示的月份
var ndviImage = monthlyNDVI.filterMetadata('month', 'equals', month)
  .first()
  .select('NDVI');

// 在地圖上加入NDVI影像圖層,設定最小值、最大值和調色板
Map.addLayer(ndviImage, {min: -1, max: 1, palette: ['red', 'white', 'green']}, 'Monthly NDVI');

// 下載月平均NDVI影像集到Google Drive中
batch.Download.ImageCollection.toDrive(monthlyNDVI, 'monthlyNDVI', {
  scale: 30,
  region: Taipei
});
NDVI成果如下,右邊的Task頁面可以保存影像到Google Drive中
NDVI成果如下,右邊的Task頁面可以保存影像到Google Drive中

3.結語

今天的分享就到這裡了,GEE是一個非常強大的雲端處理平台,除了幫我們省下大量的影像下載、處理時間外,還提供了完整的內建模組可供使用,喜歡我的分享的話可以訂閱我的YT頻道以及FB專頁會分享更多有趣的應用

分享

2 則留言

    • 這段程式碼是在Google Earth Engine(GEE)中引入一個名為「geetools:batch」的外部程式庫,他可以直接當作外部模組引入,不用自己下載匯入到你的專案中。

發表迴響

%d