Conforme observado no documento Projeções, o Earth Engine realiza a reamostragem do vizinho mais próximo por padrão durante a reprojeção. É possível mudar esse comportamento
com os métodos resample()
ou reduceResolution()
. Especificamente, quando um desses métodos é aplicado a uma imagem de entrada, qualquer reprojeção necessária da entrada é feita usando o método de agregação ou reamostragem indicado.
Reamostragem
resample()
faz com que o método de reamostragem indicado ('bilinear'
ou
'bicubic'
) seja usado na próxima reprojeção. Como as entradas são solicitadas na
projeção de saída, uma reprojeção implícita pode acontecer antes de qualquer outra
operação na entrada. Por isso, chame resample()
diretamente na imagem
de entrada. Considere este exemplo simples:
Editor de código (JavaScript)
// Load a Landsat image over San Francisco, California, UAS. var landsat = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20160323'); // Set display and visualization parameters. Map.setCenter(-122.37383, 37.6193, 15); var visParams = {bands: ['B4', 'B3', 'B2'], max: 0.3}; // Display the Landsat image using the default nearest neighbor resampling. // when reprojecting to Mercator for the Code Editor map. Map.addLayer(landsat, visParams, 'original image'); // Force the next reprojection on this image to use bicubic resampling. var resampled = landsat.resample('bicubic'); // Display the Landsat image using bicubic resampling. Map.addLayer(resampled, visParams, 'resampled');
import ee import geemap.core as geemap
Colab (Python)
# Load a Landsat image over San Francisco, California, UAS. landsat = ee.Image('LANDSAT/LC08/C02/T1_TOA/LC08_044034_20160323') # Set display and visualization parameters. m = geemap.Map() m.set_center(-122.37383, 37.6193, 15) vis_params = {'bands': ['B4', 'B3', 'B2'], 'max': 0.3} # Display the Landsat image using the default nearest neighbor resampling. # when reprojecting to Mercator for the Code Editor map. m.add_layer(landsat, vis_params, 'original image') # Force the next reprojection on this image to use bicubic resampling. resampled = landsat.resample('bicubic') # Display the Landsat image using bicubic resampling. m.add_layer(resampled, vis_params, 'resampled')
A reamostragem 'bicubic'
resulta em pixels de saída suaves em relação à imagem original (Figura 1).


A ordem das operações para este exemplo de código está mostrada no diagrama da Figura 2. Especificamente, a reprojeção implícita para a projeção maps mercator ocorre com o método de reamostragem especificado na imagem de entrada.
Figura 2. Fluxograma de operações quando resample()
é chamado na imagem de entrada
antes da exibição no editor de código. As linhas curvas indicam o fluxo de
informações para a reprojeção: especificamente, a projeção de saída, a escala e o
método de reamostragem a serem usados.
Reduzir a resolução
Suponha que, em vez de reamosar durante a reprojeção, seu objetivo seja
agregar pixels a pixels maiores em uma projeção diferente. Isso é útil ao comparar conjuntos de dados de imagens em diferentes escalas, por exemplo, pixels de 30 metros de um produto baseado em Landsat com pixels grosseiros (escala maior) de um produto baseado em MODIS. É possível controlar esse processo de agregação com o método
reduceResolution()
. Assim como em resample()
, chame reduceResolution()
na entrada para
afetar a próxima projeção da imagem. O exemplo a seguir usa
reduceResolution()
para comparar dados de cobertura florestal com resolução de 30 metros a um
índice de vegetação com resolução de 500 metros:
Editor de código (JavaScript)
// Load a MODIS EVI image. var modis = ee.Image(ee.ImageCollection('MODIS/061/MOD13A1').first()) .select('EVI'); // Display the EVI image near La Honda, California. Map.setCenter(-122.3616, 37.5331, 12); Map.addLayer(modis, {min: 2000, max: 5000}, 'MODIS EVI'); // Get information about the MODIS projection. var modisProjection = modis.projection(); print('MODIS projection:', modisProjection); // Load and display forest cover data at 30 meters resolution. var forest = ee.Image('UMD/hansen/global_forest_change_2023_v1_11') .select('treecover2000'); Map.addLayer(forest, {max: 80}, 'forest cover 30 m'); // Get the forest cover data at MODIS scale and projection. var forestMean = forest // Force the next reprojection to aggregate instead of resampling. .reduceResolution({ reducer: ee.Reducer.mean(), maxPixels: 1024 }) // Request the data at the scale and projection of the MODIS image. .reproject({ crs: modisProjection }); // Display the aggregated, reprojected forest cover data. Map.addLayer(forestMean, {max: 80}, 'forest cover at MODIS scale');
import ee import geemap.core as geemap
Colab (Python)
# Load a MODIS EVI image. modis = ee.Image(ee.ImageCollection('MODIS/006/MOD13A1').first()).select('EVI') # Display the EVI image near La Honda, California. m.set_center(-122.3616, 37.5331, 12) m.add_layer(modis, {'min': 2000, 'max': 5000}, 'MODIS EVI') # Get information about the MODIS projection. modis_projection = modis.projection() display('MODIS projection:', modis_projection) # Load and display forest cover data at 30 meters resolution. forest = ee.Image('UMD/hansen/global_forest_change_2015').select( 'treecover2000' ) m.add_layer(forest, {'max': 80}, 'forest cover 30 m') # Get the forest cover data at MODIS scale and projection. forest_mean = ( forest # Force the next reprojection to aggregate instead of resampling. .reduceResolution(reducer=ee.Reducer.mean(), maxPixels=1024) # Request the data at the scale and projection of the MODIS image. .reproject(crs=modis_projection) ) # Display the aggregated, reprojected forest cover data. m.add_layer(forest_mean, {'max': 80}, 'forest cover at MODIS scale')
Neste exemplo, a projeção de saída é definida explicitamente com
reproject()
. Durante a reprojeção para a projeção sinusoidal do MODIS, em vez de reamostragem, os pixels menores são agregados com o redutor especificado (ee.Reducer.mean()
no exemplo). Essa sequência
de operações é ilustrada na Figura 3. Embora este exemplo use
reproject()
para ajudar a visualizar o efeito de reduceResolution()
, a maioria dos scripts
não precisa ser reprojetada explicitamente. Confira o aviso
aqui.
Figura 3. Fluxograma das operações quando reduceResolution()
é chamado em uma
imagem de entrada antes de reproject()
. As linhas curvas indicam o fluxo de
informações para a reprojeção: especificamente, a projeção de saída, a escala e o
método de agregação de pixels a serem usados.
Pesos de pixel para ReduceResolution
Os pesos dos pixels usados durante o processo de agregação reduceResolution()
são baseados na sobreposição entre os pixels menores que estão sendo agregados e os
pixels maiores especificados pela projeção de saída. Isso é ilustrado na Figura
4.
Figura 4. Pixels de entrada (preto) e pixel de saída (azul) para
reduceResolution()
.
O comportamento padrão é que os pesos de pixel de entrada são calculados como a fração da
área de pixel de saída coberta pelo pixel de entrada. No diagrama, o pixel de saída
tem a área a
, o peso do pixel de entrada com área de interseção b
é
calculado como b/a
e o peso do pixel de entrada com área de interseção c
é calculado como c/a
. Esse comportamento pode resultar em resultados inesperados ao usar
um redutor diferente do redutor médio. Por exemplo, para calcular a área de floresta por pixel, use o redutor médio para calcular a fração de um pixel coberto e, em seguida, multiplique pela área (em vez de calcular áreas nos pixels menores e depois somá-las com o redutor de soma):
Editor de código (JavaScript)
// Compute forest area per MODIS pixel. var forestArea = forest.gt(0) // Force the next reprojection to aggregate instead of resampling. .reduceResolution({ reducer: ee.Reducer.mean(), maxPixels: 1024 }) // The reduce resolution returns the fraction of the MODIS pixel // that's covered by 30 meter forest pixels. Convert to area // after the reduceResolution() call. .multiply(ee.Image.pixelArea()) // Request the data at the scale and projection of the MODIS image. .reproject({ crs: modisProjection }); Map.addLayer(forestArea, {max: 500 * 500}, 'forested area at MODIS scale');
import ee import geemap.core as geemap
Colab (Python)
# Compute forest area per MODIS pixel. forest_area = ( forest.gt(0) # Force the next reprojection to aggregate instead of resampling. .reduceResolution(reducer=ee.Reducer.mean(), maxPixels=1024) # The reduce resolution returns the fraction of the MODIS pixel # that's covered by 30 meter forest pixels. Convert to area # after the reduceResolution() call. .multiply(ee.Image.pixelArea()) # Request the data at the scale and projection of the MODIS image. .reproject(crs=modis_projection) ) m.add_layer(forest_area, {'max': 500 * 500}, 'forested area at MODIS scale') m