Como se indica en el documento Projections, Earth Engine realiza el remuestreo del vecino más cercano de forma predeterminada durante la reproyección. Puedes cambiar este comportamiento con los métodos resample()
o reduceResolution()
. Específicamente, cuando se aplica uno de estos métodos a una imagen de entrada, cualquier reubicación requerida de la entrada se realizará con el método de reagrupación o remuestreo indicado.
Reproducción de muestras
resample()
hace que se use el método de remuestreo indicado ('bilinear'
o 'bicubic'
) en la próxima reubicación. Dado que las entradas se solicitan en la proyección de salida, es posible que se produzca una reubicación implícita antes de cualquier otra operación en la entrada. Por este motivo, llama a resample()
directamente en la imagen de entrada. Considera el siguiente ejemplo simple:
// 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
# 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')
Ten en cuenta que el remuestreo de 'bicubic'
hace que los píxeles de salida se vean suaves en relación con la imagen original (Figura 1).


El orden de las operaciones de esta muestra de código se diagrama en la Figura 2. Específicamente, la reproyección implícita a la proyección Mercator de mapas se realiza con el método de remuestreo especificado en la imagen de entrada.
Figura 2: Diagrama de flujo de operaciones cuando se llama a resample()
en la imagen de entrada antes de mostrarse en el editor de código. Las líneas curvas indican el flujo de información a la reproyección: específicamente, la proyección de salida, la escala y el método de remuestreo que se usará.
Cómo reducir la resolución
Supongamos que, en lugar de volver a muestrear durante la reproyección, tu objetivo es agregar píxeles a píxeles más grandes en una proyección diferente. Esto es útil cuando se comparan conjuntos de datos de imágenes a diferentes escalas, por ejemplo, píxeles de 30 metros de un producto basado en Landsat a píxeles gruesos (escala más alta) de un producto basado en MODIS. Puedes controlar este proceso de agregación con el método reduceResolution()
. Al igual que con resample()
, llama a reduceResolution()
en la entrada para afectar la próxima reproyección de la imagen. En el siguiente ejemplo, se usa reduceResolution()
para comparar los datos de cobertura forestal con una resolución de 30 metros con un índice de vegetación con una resolución de 500 metros:
// 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
# 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')
En este ejemplo, ten en cuenta que la proyección de salida se establece de forma explícita con reproject()
. Durante la reproyección a la proyección sinusoidal de MODIS, en lugar de volver a muestrear, los píxeles más pequeños se agregan con el reductor especificado (ee.Reducer.mean()
en el ejemplo). Esta secuencia de operaciones se ilustra en la Figura 3. Aunque en este ejemplo se usa reproject()
para ayudar a visualizar el efecto de reduceResolution()
, la mayoría de las secuencias de comandos no necesitan volver a proyectarse de forma explícita. Consulta la advertencia aquí.
Figura 3: Diagrama de flujo de operaciones cuando se llama a reduceResolution()
en una imagen de entrada antes de reproject()
. Las líneas curvas indican el flujo de información a la reproyección: específicamente, la proyección de salida, la escala y el método de agregación de píxeles que se usará.
Grosores de píxeles para ReduceResolution
Los pesos de los píxeles que se usan durante el proceso de agregación de reduceResolution()
se basan en la superposición entre los píxeles más pequeños que se agregan y los píxeles más grandes que especifica la proyección de salida. Esto se ilustra en la Figura 4.
Figura 4: Píxeles de entrada (negros) y píxeles de salida (azules) para reduceResolution()
.
El comportamiento predeterminado es que las ponderaciones de píxeles de entrada se calculan como la fracción del área de píxeles de salida que cubre el píxel de entrada. En el diagrama, el píxel de salida tiene el área a
, el peso del píxel de entrada con el área de intersección b
se calcula como b/a
y el peso del píxel de entrada con el área de intersección c
se calcula como c/a
. Este comportamiento puede generar resultados inesperados cuando se usa un reducer que no sea el reducer medio. Por ejemplo, para calcular el área de bosque por píxel, usa el reductor medio para calcular la fracción de un píxel cubierto y, luego, multiplícala por el área (en lugar de calcular las áreas en los píxeles más pequeños y, luego, sumarlas con el reductor de suma):
// 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
# 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