Comme indiqué dans le document Projections, Earth Engine effectue un reéchantillonnage par voisin le plus proche par défaut lors de la reprojection. Vous pouvez modifier ce comportement avec les méthodes resample()
ou reduceResolution()
. Plus précisément, lorsqu'une de ces méthodes est appliquée à une image d'entrée, toute reprojection requise de l'entrée sera effectuée à l'aide de la méthode de rééchantillonnage ou d'agrégation indiquée.
Rééchantillonnage
resample()
entraîne l'utilisation de la méthode de reéchantillonnage indiquée ('bilinear'
ou 'bicubic'
) lors de la prochaine reprojection. Étant donné que les entrées sont demandées dans la projection de sortie, une reprojection implicite peut se produire avant toute autre opération sur l'entrée. Pour cette raison, appelez resample()
directement sur l'image d'entrée. Prenons l'exemple simple suivant:
Éditeur de code (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')
Notez que le reéchantillonnage 'bicubic'
entraîne l'affichage des pixels de sortie de manière fluide par rapport à l'image d'origine (figure 1).
L'ordre des opérations de cet exemple de code est illustré dans la figure 2. Plus précisément, la reprojection implicite vers la projection Mercator de Maps a lieu avec la méthode de reéchantillonnage spécifiée sur l'image d'entrée.
Figure 2. Organigramme des opérations lorsque resample()
est appelé sur l'image d'entrée avant l'affichage dans l'éditeur de code. Les lignes courbes indiquent le flux d'informations vers la reprojection, en particulier la projection de sortie, l'échelle et la méthode de reéchantillonnage à utiliser.
Réduire la résolution
Supposons qu'au lieu de reéchantillonner lors de la reprojection, votre objectif soit d'agréger des pixels à des pixels plus grands dans une projection différente. Cela est utile lorsque vous comparez des ensembles de données d'images à différentes échelles, par exemple des pixels de 30 mètres d'un produit basé sur Landsat à des pixels grossiers (échelle plus élevée) d'un produit basé sur MODIS. Vous pouvez contrôler ce processus d'agrégation à l'aide de la méthode reduceResolution()
. Comme pour resample()
, appelez reduceResolution()
sur l'entrée afin d'affecter la prochaine reprojection de l'image. L'exemple suivant utilise reduceResolution()
pour comparer les données de couverture forestière à une résolution de 30 mètres à un indice de végétation à une résolution de 500 mètres:
Éditeur de code (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')
Dans cet exemple, notez que la projection de sortie est définie explicitement avec reproject()
. Lors de la reprojection vers la projection sinusoïdale MODIS, au lieu de reéchantillonner, les pixels plus petits sont agrégés avec le réducteur spécifié (ee.Reducer.mean()
dans l'exemple). Cette séquence d'opérations est illustrée à la figure 3. Bien que cet exemple utilise reproject()
pour aider à visualiser l'effet de reduceResolution()
, la plupart des scripts n'ont pas besoin d'être reprojetés explicitement. Consultez l'avertissement ici.
Figure 3. Organigramme des opérations lorsque reduceResolution()
est appelé sur une image d'entrée avant reproject()
. Les lignes courbes indiquent le flux d'informations vers la reprojection, en particulier la projection de sortie, l'échelle et la méthode d'agrégation des pixels à utiliser.
Poids des pixels pour ReduceResolution
Les pondérations des pixels utilisées lors du processus d'agrégation reduceResolution()
sont basées sur le chevauchement entre les pixels plus petits qui sont agrégés et les pixels plus grands spécifiés par la projection de sortie. C'est ce que décrit la figure 4.
Figure 4. Pixels d'entrée (noir) et pixel de sortie (bleu) pour reduceResolution()
.
Par défaut, les pondérations des pixels d'entrée sont calculées en tant que fraction de la surface des pixels de sortie couverte par le pixel d'entrée. Dans le diagramme, le pixel de sortie a une zone a
, la pondération du pixel d'entrée avec la zone d'intersection b
est calculée comme b/a
et la pondération du pixel d'entrée avec la zone d'intersection c
est calculée comme c/a
. Ce comportement peut entraîner des résultats inattendus lorsque vous utilisez un réducteur autre que le réducteur de la moyenne. Par exemple, pour calculer la superficie forestière par pixel, utilisez le réducteur de moyenne pour calculer la fraction d'un pixel couvert, puis multipliez-la par la superficie (au lieu de calculer les surfaces dans les pixels plus petits, puis de les additionner avec le réducteur de somme):
Éditeur de code (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