投影

Earth Engine 的設計可讓您在進行運算時,幾乎不必擔心地圖投影方式。與比例相同,計算作業的推測方式也是以「拉取」為依據。具體來說,輸入內容會在輸出投影中要求。輸出內容可以根據函式參數 (例如 crs)、程式碼編輯器和 geemap 地圖物件 (具有 maps mercator (EPSG:3857) 投影),或透過 reproject() 呼叫來判斷。在 Code Editor 或 geemap 中顯示圖片時,系統會在 maps mercator 中要求輸入內容。請考慮對具有正弦投影的 MODIS 圖像執行下列簡單作業:

// 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');

請參閱「 Python 環境」頁面,瞭解 Python API 和如何使用 geemap 進行互動式開發。

import ee
import geemap.core as geemap
# 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 投影方式。這項投影會透過操作序列傳回,以便在地圖 Mercator 中要求輸入內容,並根據地圖的縮放等級決定比例。

投影
圖 1. 在 Code Editor 地圖中顯示 MODIS 圖像的對應作業流程圖。每個作業的預測值 (流程圖左側) 會根據輸出結果決定。曲線代表資訊流向重投影作業,具體來說,就是輸出投影和比例。

在 Earth Engine 中,投影方式會由座標參考系統 (CRS 或許多方法的 crs 參數) 指定。您可以對圖片呼叫 projection(),檢查圖片的投影方式:

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());

請參閱「 Python 環境」頁面,瞭解 Python API 和如何使用 geemap 進行互動式開發。

import ee
import geemap.core as geemap
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 度比例。例如:

var collection = ee.ImageCollection('LANDSAT/LC08/C02/T1_TOA');
var mosaic = collection.filterDate('2018-01-01', '2019-01-01').mosaic();
print(mosaic.projection());

請參閱「 Python 環境」頁面,瞭解 Python API 和如何使用 geemap 進行互動式開發。

import ee
import geemap.core as geemap
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() 呼叫之前的運算會在指定投影中完成。舉例來說,如要強制在特定投影中產生合成影像:

// Some projection that is suitable for your area of interest.
var proj = ee.Projection(...);
var output = collection.reduce(...).reproject(proj);

請參閱「 Python 環境」頁面,瞭解 Python API 和如何使用 geemap 進行互動式開發。

import ee
import geemap.core as geemap
# Some projection that is suitable for your area of interest.
proj = ee.Projection(...)
output = collection.reduce(...).reproject(proj)

以下列舉幾種需要固定投影方式的情況:

  • 計算梯度 (例如 ee.Terrain.gradientee.Terrain.slope)。
  • reduceResolution,如果您想要將較高解析度的像素匯總為較低解析度,(進一步瞭解如何降低解析度)。

除非絕對必要,否則請避免使用 reproject()。舉例來說,假設您重新投影某項內容並將其新增至地圖。如果您在 reproject() 呼叫中指定的比例過小,與地圖的縮放等級相差甚大,Earth Engine 就會以非常小的比例,在非常廣大的空間範圍內要求所有輸入內容。這可能會導致一次要求過多資料,進而導致錯誤。

如果最終輸出內容的經度/緯度投影法與 reproject() 呼叫中指定的不同,系統會再次投影。這也是在程式碼中使用 reproject() 時應謹慎小心的另一個原因。請考慮下列範例,這會強制將 MODIS 圖像先重新投影至 WGS84,然後再重新投影至 maps mercator,以便在程式碼編輯器地圖中顯示:

// 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');

請參閱「 Python 環境」頁面,瞭解 Python API 和如何使用 geemap 進行互動式開發。

import ee
import geemap.core as geemap
# 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 自動執行,以便在地圖上顯示結果。請注意,關於要使用的投影資訊也會從要求傳回至輸入內容。

重新投影
圖 2. 作業流程圖,對應至程式碼編輯器地圖中 MODIS 圖像的重投影作業。曲線表示資訊流向重投影,具體來說,就是輸出投影和比例。