投影

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

Python 設定

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

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 投影方式。這項投影會透過一連串的作業傳播回來,以便在以地圖縮放等級決定的比例下,以墨卡托投影要求輸入內容。

投影
圖 1:流程圖:在程式碼編輯器地圖中顯示 MODIS 影像時,對應的作業。每個作業的預測 (流程圖左側) 都是根據輸出內容決定。曲線表示資訊流向重新投影:具體來說,就是輸出投影和比例。

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

Python 設定

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

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

Python 設定

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

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

Python 設定

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

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.gradientee.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');

Python 設定

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

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 自動執行,以便在地圖上顯示結果。另請注意,要使用的投影資訊會從要求傳播回輸入內容。

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