關鍵字: #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 批次計算,我們通常需要以下幾個步驟:
- 選擇合適的影像集:
GEE提供了多種衛星影像集合,例如Landsat、Sentinel、MODIS等,我們可以根據自己的需求和目標區域選擇合適的影像集合。例如,如果我們想要分析近幾年研究區域的植被變化,我們可以選擇Sentinel-2影像集合,它具有高分辨率(10米)和高頻率(約5天一次)的優勢。- 過濾和裁剪影像集合:
由於影像集合中可能包含了不需要的影像,例如雲層覆蓋的影像或者超出目標區域的影像,我們需要對影像集合進行過濾和裁剪,以提高計算效率和精度。我們可以使用GEE提供的過濾器,例如日期範圍、雲量百分比、空間範圍等,來篩選出我們需要的影像。我們也可以使用GEE提供的幾何工具,例如點、線、面等,來定義我們感興趣的區域,並將影像集合裁剪到該區域。- 定義NDVI函數:
在GEE中,我們可以使用 normalizedDifference() 函數來快速計算NDVI,它接受兩個參數,分別是近紅外波段和紅光波段的名稱。由於不同的影像集合可能有不同的波段名稱,我們需要根據自己選擇的影像集合來指定這兩個參數。例如,對於Sentinel-2影像集合,近紅外波段是’B8’,紅光波段是’B4’。然後,我們可以使用map()函數來將NDVI函數映射到每一張影像上,得到一個新的含有NDVI波段的影像集合。- 輸出和展示結果:
最後,我們可以使用GEE提供的輸出和展示工具來查看和分析我們計算得到的NDVI結果。例如,我們可以使用addLayer()函數來將NDVI影像添加到地圖上,並指定顏色調色板和值範圍來增強視覺效果。我們也可以使用Chart.image.seriesByRegion()函數來繪製NDVI隨時間變化的折線圖,並指定減少器、比例尺和系列屬性來控制圖表的細節。
範例練習:利用Sentinel-2計算台北市2020的每月NDVI影像
1.開啟GEE-Code Editor
首先我們先到Google Earth Engine的官方網站,點進主頁後根據下圖,依序點選Platform->Code Editor,進入腳本編輯頁面
接著會進入Code Editor頁面,主要可以分成下列的功能區塊,左側區塊顯示預設以及自己編寫的腳本、上傳圖資等;
中間區塊則是進行腳本編寫;右側區塊顯示程式執行的成果,最下方的地圖則是能進行交互協作,主要可以顯示計算圖資成果以及繪製ROI區域。
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 });
3.結語
今天的分享就到這裡了,GEE是一個非常強大的雲端處理平台,除了幫我們省下大量的影像下載、處理時間外,還提供了完整的內建模組可供使用,喜歡我的分享的話可以訂閱我的YT頻道以及FB專頁會分享更多有趣的應用