Earth Engine 的設計宗旨是讓您在進行運算時,幾乎不必擔心地圖投影。與縮放比例相同,計算作業的投影是根據「提取」方式決定。具體來說,系統會在輸出投影中要求輸入內容。輸出內容可由函式參數 (例如 crs)、程式碼編輯器和 geemap 地圖物件 (具有 maps mercator (EPSG:3857) 投影) 決定,或透過 reproject() 呼叫決定。在程式碼編輯器或 geemap 中顯示圖片時,系統會以地圖墨卡托投影要求輸入內容。請參考對正弦投影 MODIS 影像執行的下列作業:
程式碼編輯器 (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Normalize the image and add it to the map. var rescaled = image.unitScale(-2000, 10000); var visParams = {min: 0.15, max: 0.7}; Map.addLayer(rescaled, visParams, 'Rescaled');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Normalize the image and add it to the map. rescaled = image.unitScale(-2000, 10000) vis_params = {'min': 0.15, 'max': 0.7} m = geemap.Map() m.add_layer(rescaled, vis_params, 'Rescaled') m
圖 1 顯示這個程式碼範例的作業順序。請注意,輸入內容的投影方式取決於輸出內容,具體來說,就是程式碼編輯器中地圖顯示的 maps mercator 投影方式。這項投影會透過一連串的作業傳播回來,以便在以地圖縮放等級決定的比例下,以墨卡托投影要求輸入內容。
在 Earth Engine 中,投影方式是由座標參考系統 (CRS 或許多方法的 crs 參數) 指定。您可以對圖片呼叫 projection(),檢查圖片的投影:
程式碼編輯器 (JavaScript)
var image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0); print('Projection, crs, and crs_transform:', image.projection()); print('Scale in meters:', image.projection().nominalScale());
import ee import geemap.core as geemap
Colab (Python)
image = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20140318').select(0) display('Projection, crs, and crs_transform:', image.projection()) display('Scale in meters:', image.projection().nominalScale())
請注意,對 projection() 傳回的 ee.Projection 呼叫 nominalScale(),即可判斷圖片的原生解析度。原生解析度是圖像金字塔最低層級的公尺單位名義像素比例。由於圖片的每個波段可能具有不同的比例和/或投影,如果您對至少有一個波段的圖片呼叫 projection(),且該波段的投影與其他波段不同,您可能會看到類似下列的錯誤:
預設投影
除非您需要運算在特定投影中進行,否則一般不需要指定投影。只有在輸出內容不明確時,Earth Engine 才會要求您指定投影和/或比例。如果減少包含不同投影方式的圖片 (即建立複合圖片),可能會導致模糊不清。ImageCollection如果圖片是由不同投影方式的輸入圖片組合或拼接而成,則會採用預設投影方式,也就是 WGS84,比例為 1 度。例如:
程式碼編輯器 (JavaScript)
var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA'); var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic(); print(mosaic.projection());
import ee import geemap.core as geemap
Colab (Python)
collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA') mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic() display(mosaic.projection())
如果您嘗試在運算中使用這類圖片,可能會看到類似以下的錯誤訊息:
一般來說,我們不希望或打算以 1 度的比例進行匯總,因此 Earth Engine 會提供這項友善提醒,請您完整指定輸出內容。
使用者通常會對這種行為感到困惑,並擔心「遺失」投影資訊,但系統實際上會在需要時才計算像素 (瞭解詳情),而且在這種情況下,一律會有輸出投影伴隨要求,指定如何計算合成內容。
在絕大多數的用途中,沒有投影並非問題,實際上還能帶來寶貴的最佳化效果,因為這樣一來,您就能在任何縮放層級預覽結果,不必等待完整解析度的計算完成。但這表示輸出內容在不同縮放等級下可能會有所不同。
如果最佳化顯示圖片仍不夠精確,可以按照下一節所述,重新投影輸出內容,強制在特定投影中進行計算。
重新投影
您可以使用 reproject() 方法,強制在特定投影中執行作業。使用 reproject() 會導致系統在 reproject() 呼叫中指定的投影中要求輸入內容。程式碼中在 reproject() 呼叫「之前」的計算作業,將在指定的投影中完成。舉例來說,如要強制在特定投影中產生複合項:
程式碼編輯器 (JavaScript)
// Some projection that is suitable for your area of interest. var proj = ee.Projection(...); var output = collection.reduce(...).reproject(proj);
import ee import geemap.core as geemap
Colab (Python)
# Some projection that is suitable for your area of interest. proj = ee.Projection(...) output = collection.reduce(...).reproject(proj)
以下列舉幾個需要固定投影的案例:
- 計算梯度 (例如
ee.Terrain.gradient或ee.Terrain.slope)。 reduceResolution,適合將高解析度像素匯總為低解析度像素。(進一步瞭解如何降低解析度)。
除非絕對必要,否則請避免使用 reproject(),原因如下:舉例來說,假設您重新投影某個項目並將其新增至地圖。如果您在 reproject() 呼叫中指定的比例尺遠小於地圖的縮放等級,Earth Engine 會以非常小的比例尺,要求非常廣泛的空間範圍內的所有輸入內容。這可能會導致一次要求過多資料,進而發生錯誤。
如果最終輸出內容的投影與 reproject() 呼叫中指定的投影不同,就會導致另一次重新投影。因此,請務必謹慎使用程式碼中的 reproject()。請參考下列範例,這個範例會強制將 MODIS 影像先重新投影至 WGS84,然後重新投影至 maps mercator,以便在程式碼編輯器地圖中顯示:
程式碼編輯器 (JavaScript)
// The input image has a SR-ORG:6974 (sinusoidal) projection. var image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0); // Operations *before* the reproject call will be done in the projection // specified by reproject(). The output results in another reprojection. var reprojected = image .unitScale(-2000, 10000) .reproject('EPSG:4326', null, 500); Map.addLayer(reprojected, {min: 0.15, max: 0.7}, 'Reprojected');
import ee import geemap.core as geemap
Colab (Python)
# The input image has a SR-ORG:6974 (sinusoidal) projection. image = ee.Image('MODIS/061/MOD13A1/2014_05_09').select(0) # Operations *before* the reproject call will be done in the projection # specified by reproject(). The output results in another reprojection. reprojected = image.unitScale(-2000, 10000).reproject('EPSG:4326', None, 500) m = geemap.Map() m.add_layer(reprojected, {'min': 0.15, 'max': 0.7}, 'Reprojected') m
圖 2 繪製了與這個簡單的重新投影範例對應的作業流程。請注意,第一個重新投影是明確的,如 reproject() 呼叫中所指定。第二次重投影是隱含的,由 Earth Engine 自動執行,以便在地圖上顯示結果。另請注意,要使用的投影資訊會從要求傳播回輸入內容。