Come indicato nel documento Proiezioni, Earth Engine esegue il ricalcolo del vicino più prossimo per impostazione predefinita durante la riproiezione. Puoi modificare questo comportamento con i metodi resample()
o reduceResolution()
. Nello specifico, quando uno di questi metodi viene applicato a un'immagine di input, l'eventuale riproiezione dell'input necessaria verrà eseguita utilizzando il metodo di aggregazione o ricampionamento indicato.
Ricollocazione
resample()
consente di utilizzare il metodo di ricampionamento indicato ('bilinear'
o
'bicubic'
) alla successiva riproiezione. Poiché gli input vengono richiesti nella proiezione di output, potrebbe verificarsi una riproiezione implicita prima di qualsiasi altra operazione sull'input. Per questo motivo, chiama resample()
direttamente sull'immagine di input. Considera il seguente semplice esempio:
Editor di codice (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')
Tieni presente che il ricalcolo 'bicubic'
fa sì che i pixel di output risultino uniformi rispetto all'immagine originale (Figura 1).


L'ordine delle operazioni per questo esempio di codice è riportato nel diagramma della Figura 2. Nello specifico, la riproiezione implicita alla proiezione mercatore di Maps avviene con il metodo di ricampionamento specificato sull'immagine di input.
Figura 2. Diagramma di flusso delle operazioni quando viene chiamato resample()
sull'immagine di input prima della visualizzazione nell'editor di codice. Le linee curve indicano il flusso di informazioni alla riproiezione: in particolare, la proiezione, la scala e il metodo di ricampionamento da utilizzare in uscita.
Riduci la risoluzione
Supponiamo che, anziché eseguire il campionamento durante la riproiezione, il tuo obiettivo sia aggregare i pixel in pixel più grandi in una proiezione diversa. Questo è utile quando si confrontano set di dati di immagini a scale diverse, ad esempio pixel di 30 metri di un prodotto basato su Landsat con pixel grossolani (scala più alta) di un prodotto basato su MODIS. Puoi controllare questa procedura di aggregazione con il reduceResolution()
metodo. Come per resample()
, chiama reduceResolution()
sull'input per influire sulla successiva riproiezione dell'immagine. L'esempio seguente utilizza
reduceResolution()
per confrontare i dati sulla copertura forestale a una risoluzione di 30 metri con un
indice di vegetazione a una risoluzione di 500 metri:
Editor di codice (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')
In questo esempio, tieni presente che la proiezione dell'output è impostata esplicitamente con
reproject()
. Durante la riproiezione nella proiezione sinusoidale MODIS, anziché eseguire il campionamento, i pixel più piccoli vengono aggregati con il riduttore specificato (ee.Reducer.mean()
nell'esempio). Questa sequenza di operazioni è illustrata nella Figura 3. Sebbene questo esempio utilizzi
reproject()
per aiutare a visualizzare l'effetto di reduceResolution()
, la maggior parte degli script
non ha bisogno di eseguire una nuova proiezione esplicita; consulta l'avviso
qui.
Figura 3. Diagramma di flusso delle operazioni quando reduceResolution()
viene chiamato su un'immagine di input prima di reproject()
. Le linee curve indicano il flusso di informazioni alla riproiezione: in particolare, la proiezione, la scala e il metodo di aggregazione dei pixel di output da utilizzare.
Pesi dei pixel per ReduceResolution
I pesi dei pixel utilizzati durante il processo di aggregazione reduceResolution()
si basano sulla sovrapposizione tra i pixel più piccoli aggregati e i pixel più grandi specificati dalla proiezione di output. Questo processo è illustrato nella Figura 4.
Figura 4. Pixel di input (neri) e pixel di output (blu) per
reduceResolution()
.
Il comportamento predefinito è che i pesi dei pixel di input vengono calcolati come frazione dell'area del pixel di output coperta dal pixel di input. Nel diagramma, il pixel di output ha un'area a
, il peso del pixel di input con area di intersezione b
viene calcolato come b/a
e il peso del pixel di input con area di intersezione c
viene calcolato come c/a
. Questo comportamento può comportare risultati imprevisti quando si utilizza un riduttore diverso da quello della media. Ad esempio, per calcolare l'area coperta da foreste per pixel, utilizza il riduttore della media per calcolare la frazione di un pixel coperto, quindi moltiplica per l'area (anziché calcolare le aree nei pixel più piccoli e poi sommarle con il riduttore della somma):
Editor di codice (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