使用圖像進行運算

現在您已瞭解如何載入及顯示圖片,接下來要對圖片套用運算。 舉例來說,您可以將 SRTM 高程圖片傳遞至 ee.Terrain 套件的 slope 方法,計算地形的坡度

程式碼編輯器 (JavaScript)

// Load the SRTM image.
var srtm = ee.Image('CGIAR/SRTM90_V4');

// Apply an algorithm to an image.
var slope = ee.Terrain.slope(srtm);

// Display the result.
Map.setCenter(-112.8598, 36.2841, 9); // Center on the Grand Canyon.
Map.addLayer(slope, {min: 0, max :60}, 'slope');

請注意,在程式碼 ee.Terrain.slope(srtm) 中,srtm 圖片會做為斜率演算法的引數提供。結果應如圖 3 所示。

Tutorial_api_03_slope.png
圖 3. 斜坡圖片。

Image math

ee.Image 類別中也有方法可透過圖片物件叫用。舉例來說,假設您想使用影像波段進行一些數學運算 (有時稱為「波段數學」或「地圖代數」)。舉例來說,您可能對影像的三角運算有興趣。如要達成這個目標,請先將縱橫比圖片轉換為弧度,然後對其呼叫 sin()。重複使用我們的 srtm 圖片,

程式碼編輯器 (JavaScript)

// Get the aspect (in degrees).
var aspect = ee.Terrain.aspect(srtm);

// Convert to radians, compute the sin of the aspect.
var sinImage = aspect.divide(180).multiply(Math.PI).sin();

// Display the result.
Map.addLayer(sinImage, {min: -1, max: 1}, 'sin');

結果應如圖 4 所示。建議您仔細查看 aspect.divide(180).multiply(Math.PI).sin() 程式碼。像這樣串連多個方法,程式碼會表示「將角度除以 180,然後將結果乘以 π,最後取正弦值」。您可以透過這種方式合併方法,對圖片執行複雜的數學運算。如需完整的數學運算清單 (包括 add()subtract()multiply() 等),請參閱Image文件

Tutorial_api_04_sin.png
圖 4:地形面向的正弦值。

圖片統計資料

另一類實用的圖片作業涉及計算圖片區域或光柵向量疊加層中的像素統計資料。如要在 Earth Engine 中計算統計資料,請使用縮減器,如 ee.Reducer 套件中的類別所示。舉例來說,假設您想知道某個地區的平均海拔高度,您可以使用幾何圖形繪製工具繪製多邊形,定義區域。如要以互動方式繪製區域,請取得多邊形繪圖工具 (),然後在感興趣的區域上數位化多邊形,完成後按一下「Exit」。請注意,產生的 ee.Geometry 物件會自動命名為 geometry,並在指令碼頂端新增為匯入項目。按一下匯入項目中的變數名稱,然後輸入新名稱,將該變數重新命名為「polygon」。

接著,使用下列程式碼取得多邊形中的平均像素值:

程式碼編輯器 (JavaScript)

// Compute the mean elevation in the polygon.
var meanDict = srtm.reduceRegion({
  reducer: ee.Reducer.mean(),
  geometry: polygon,
  scale: 90
});

// Get the mean from the dictionary and print it.
var mean = meanDict.get('elevation');
print('Mean elevation', mean);

請注意以下幾點:首先,請注意 reduceRegion()Image 物件可用的方法 (請參閱這篇文章,進一步瞭解如何縮減區域)。其次,方法引數會以 JavaScript 物件的形式提供,並做為單一引數傳遞。(具體來說,物件的鍵是方法參數的名稱。這些值是方法的引數。第三,reducer 參數會指定要計算的統計資料類型,而 geometry 參數則會指定要計算統計資料的區域。scale 參數是要使用的像素大小 (以公尺為單位)。為避免模稜兩可,縮減時應一律指定比例,因為 Earth Engine 可能無法從輸入內容自動判斷適當的比例。(進一步瞭解 Earth Engine 中的比例)。

最後,reduceRegion() 的傳回值是字典,其中鍵為波段名稱,值為波段的像素統計資料。字典的 get() 方法會傳回與做為引數提供的鍵對應的值。在這個範例中,srtm 圖片有一個波段「elevation」,因此範例程式碼會從字典取得該統計資料並列印出來。

執行這段程式碼時,如果收到類似下列的錯誤訊息:

別擔心!你可以採取下列幾種做法來解決錯誤。這個 reduceRegion() 方法會進行檢查,確保您考慮是否真的要在計算中納入這麼多像素。這是為了避免您不小心做出愚蠢的行為,例如嘗試計算全球每公尺像素的平均值 (請勿這麼做)。如要解決這項錯誤,請將 bestEffort 參數設為 true (在參數字典中加入 bestEffort: true),或將 maxPixels 參數設為高於預設值 (1 千萬像素) 的值,或同時進行上述兩項操作。如果 bestEffort 為 true,Earth Engine 會自動重新計算比例,確保不會超過 maxPixels

離題:Earth Engine 中的比例

在上述範例中,scale 大約設為 SRTM 圖片的原生解析度。你可以透過下列方式找出圖片的原生解析度:

程式碼編輯器 (JavaScript)

var scale = srtm.projection().nominalScale();
print('SRTM scale in meters', scale);

如果您指定的比例小於原生解析度,Earth Engine 會使用最鄰近插值法重新取樣輸入圖片,然後將所有較小的像素納入計算。如果將比例調大,Earth Engine 會使用輸入內容的匯總版本中的輸入像素 (也就是從影像金字塔的較高層級取得像素)。如要進一步瞭解 Earth Engine 如何處理規模,請參閱這份文件

到目前為止,您處理的都是單一波段的單一圖片。在下一頁中,您將瞭解多波段影像和影像集合。