Projeções

O Earth Engine foi projetado para que você raramente precise se preocupar com projeções de mapa ao fazer cálculos. Assim como a escala, a projeção em que os cálculos ocorrem é determinada com base em "extração". Especificamente, as entradas são solicitadas na projeção de saída projeção. A saída pode ser determinada por um parâmetro de função (por exemplo, crs), objetos de mapa do Editor de código e do geemap (que têm uma projeção mercator (EPSG:3857)), ou com uma chamada reproject(). Ao exibir imagens no Editor de código ou no geemap, as entradas são solicitadas no mercator de mapas. Considere a seguinte operação em uma imagem MODIS, que tem uma projeção sinusoidal:

Editor de código (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');

Configuração do Python

Consulte a página Ambiente Python (em inglês) para informações sobre a API Python e como usar geemap para desenvolvimento interativo.

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

A ordem das operações para este exemplo de código está diagramada na Figura 1. Observe que a projeção da entrada é determinada pela saída, especificamente a projeção de mercator de mapas da exibição do mapa no Editor de código. Essa projeção é propagada de volta pela sequência de operações para que as entradas sejam solicitadas no mercator de mapas, em uma escala determinada pelo nível de zoom do mapa.

projeção
Figura 1. Fluxograma de operações correspondentes à exibição de uma imagem MODIS no mapa do Editor de código. As projeções (lado esquerdo do fluxograma) de cada operação são determinadas pela saída. As linhas curvas indicam o fluxo de informações para a reprojeção: especificamente, a projeção e a escala de saída.

No Earth Engine, as projeções são especificadas por um Sistema de Referência de Coordenadas (CRS ou o crs parâmetro de muitos métodos). Para verificar a projeção de uma imagem, chame projection() nela:

Editor de código (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());

Configuração do Python

Consulte a página Ambiente Python (em inglês) para informações sobre a API Python e como usar geemap para desenvolvimento interativo.

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

Observe que, ao chamar nominalScale() no ee.Projection retornado por projection(), é possível determinar a resolução nativa da imagem. A resolução nativa é a escala nominal de pixels em metros do nível mais baixo da pirâmide de imagens. Como cada banda de uma imagem pode ter uma escala e/ou projeção diferente, se você chamar projection() em uma imagem com pelo menos uma banda que não tenha a mesma projeção que as outras, poderá aparecer um erro como:

A projeção padrão

A menos que você precise que o cálculo ocorra em uma projeção específica, geralmente não é necessário especificar uma. Somente para saídas ambíguas, o Earth Engine exige que você especifique uma projeção e/ou escala. A ambiguidade pode resultar de reduzir um ImageCollection que contém imagens com projeções diferentes (ou seja, criar um composto). Uma imagem que é um composto ou mosaico de imagens de entrada com projeções diferentes terá a projeção padrão, que é WGS84 com escala de 1 grau. Se essa projeção padrão não for adequada para sua análise (por exemplo, se for muito grosseira ou se você precisar evitar artefatos de nova amostragem em cálculos downstream como análise de terreno), defina um padrão diferente usando image.setDefaultProjection(crs). Isso garante que, se o Earth Engine precisar escolher uma projeção para um cálculo que envolva a imagem, ele usará a especificada, em vez de WGS84 na escala de 1 grau. Exemplo:

Editor de código (JavaScript)

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

Configuração do Python

Consulte a página Ambiente Python (em inglês) para informações sobre a API Python e como usar geemap para desenvolvimento interativo.

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

Se você tentar usar uma imagem como essa em um cálculo, poderá aparecer um erro como:

Geralmente, uma agregação na escala de 1 grau não é desejada ou pretendida. Por isso, o Earth Engine mostra esse lembrete amigável para fornecer uma especificação completa da saída.

Os usuários geralmente acham esse comportamento confuso e se preocupam com as informações de projeção "perdidas" , mas os pixels não são calculados até que sejam necessários (saiba mais). Nesse momento, sempre há uma projeção de saída que acompanha a solicitação que especificou como calcular o composto.

Na grande maioria dos casos de uso, não ter projeção não é um problema e, na verdade, é uma otimização valiosa, já que permite visualizar os resultados em qualquer nível de zoom sem precisar esperar a conclusão do cálculo de resolução total. No entanto, isso significa que a saída pode parecer diferente em níveis de zoom diferentes.

Se a imagem de exibição otimizada não for suficiente, o cálculo em uma projeção específica poderá ser forçado pela reprojeção da saída, conforme descrito na seção a seguir.

Reprojeção

É possível forçar a execução de operações em uma projeção específica com o reproject() método. O uso de reproject() resulta nas entradas solicitadas na projeção especificada na chamada reproject(). Os cálculos no código antes da chamada reproject() serão feitos na projeção especificada. Por exemplo, para forçar a produção de um composto em uma projeção específica:

Editor de código (JavaScript)

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

Configuração do Python

Consulte a página Ambiente Python (em inglês) para informações sobre a API Python e como usar geemap para desenvolvimento interativo.

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)

Alguns casos que exigem uma projeção fixa incluem:

  • Cálculo de gradientes (por exemplo, ee.Terrain.gradient ou ee.Terrain.slope).
  • reduceResolution, para quando você quiser agregar pixels de resolução mais alta em resolução mais baixa. (Saiba mais sobre como reduzir a resolução).

As funções no pacote ee.Terrain (por exemplo, slope, aspect, hillshade) calculam valores com base em pixels vizinhos e são sensíveis a artefatos de nova amostragem introduzidos durante a reprojeção. Quando a projeção do cálculo difere da projeção nativa do DEM a nova amostragem de vizinho mais próximo padrão pode criar padrões artificiais na saída. Para melhores resultados, faça a análise de terreno na projeção nativa do DEM. Se você estiver trabalhando com um ImageCollection de blocos DEM, crie um mosaico e use setDefaultProjection() com a projeção nativa da coleção para garantir que a análise seja executada na grade correta, conforme descrito em A projeção padrão seção.

Há vários motivos para evitar o uso de reproject(), a menos que você precise absolutamente. Suponha, por exemplo, que você reprojete algo e adicione ao mapa. Se a escala especificada na chamada reproject() for muito menor que o nível de zoom do mapa, o Earth Engine vai solicitar todas as entradas em uma escala muito pequena em uma extensão espacial muito ampla. Isso pode resultar em muitos dados sendo solicitados de uma só vez e levar a um erro.

Se a saída final estiver em uma projeção diferente da especificada na reproject() chamada, isso resultará em outra reprojeção. Esse é outro motivo para ter cuidado ao usar reproject() no código. Considere o exemplo a seguir, que força a imagem MODIS a ser reprojetada primeiro para WGS84 e depois para mercator de mapas para exibição no mapa do Editor de código:

Editor de código (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');

Configuração do Python

Consulte a página Ambiente Python (em inglês) para informações sobre a API Python e como usar geemap para desenvolvimento interativo.

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

A Figura 2 mostra o fluxo de operações correspondente a este exemplo simples de reprojeção exemplo. A primeira reprojeção é explícita, conforme especificado na reproject() chamada. A segunda reprojeção é implícita, realizada pelo Earth Engine automaticamente para mostrar o resultado no mapa. Observe também que as informações sobre qual projeção usar são propagadas de volta da solicitação para a entrada.

reprojeção
Figura 2. Fluxograma de operações correspondentes à reprojeção de uma imagem MODIS no mapa do Editor de código. As linhas curvas indicam o fluxo de informações para as reprojeções: especificamente, a projeção e a escala de saída.