Как отмечалось в документации по проекциям, Earth Engine по умолчанию выполняет передискретизацию по методу ближайшего соседа во время перепроецирования. Это поведение можно изменить с помощью методов resample() или reduceResolution(). В частности, когда один из этих методов применяется к входному изображению, любое необходимое перепроецирование входных данных будет выполнено с использованием указанного метода повторной выборки или агрегирования.
Ресемплинг
resample() – при следующей перепроекции будет использоваться указанный метод передискретизации ('bilinear' или 'bicubic'). Поскольку входные данные запрашиваются в выходной проекции, неявная перепроекция может произойти до любой другой операции с входными данными. Поэтому вызывайте resample() непосредственно для входного изображения. Рассмотрим простой пример.
Редактор кода (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')
Обратите внимание, что при передискретизации 'bicubic' выходные пиксели выглядят сглаженными по сравнению с исходным изображением (рис. 1).
Порядок операций для этого примера кода показан на рисунке 2. В частности, неявное преобразование в проекцию maps mercator выполняется с помощью метода передискретизации, указанного для входного изображения.

Рисунок 2. Блок-схема операций, выполняемых при вызове resample() для входного изображения перед его показом в редакторе кода. Изогнутые линии указывают на поток информации для перепроецирования: в частности, на выходную проекцию, масштаб и метод передискретизации, которые следует использовать.
Уменьшить разрешение
Предположим, что вместо повторной выборки во время перепроецирования ваша цель состоит в том, чтобы агрегировать пиксели в более крупные пиксели в другой проекции. Это полезно при сравнении наборов данных изображений в разных масштабах, например пикселей размером 30 метров из продукта на основе Landsat с грубыми пикселями (более крупный масштаб) из продукта на основе MODIS. Вы можете управлять этим процессом с помощью метода reduceResolution(). Как и в случае с resample(), вызовите reduceResolution() для входных данных, чтобы повлиять на следующую репроекцию изображения. В следующем примере используется reduceResolution() для сравнения данных о лесном покрове с разрешением 30 метров с индексом растительности с разрешением 500 метров:
Редактор кода (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_2025_v1_13') .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/061/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_2025_v1_13').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')
Обратите внимание, что в этом примере проекция выходных данных явно задана с помощью reproject(). При перепроецировании в синусоидальную проекцию MODIS вместо повторной выборки меньшие пиксели агрегируются с помощью указанного редуктора (ee.Reducer.mean() в примере). Эта последовательность операций показана на рисунке 3. Хотя в этом примере используется reproject(), чтобы помочь визуализировать эффект reduceResolution(), в большинстве скриптов не нужно явно перепроецировать. См. предупреждение здесь.

Рисунок 3. Блок-схема операций, выполняемых при вызове reduceResolution() для входного изображения перед reproject(). Изогнутые линии указывают на поток информации для перепроецирования, а именно на выходную проекцию, масштаб и метод агрегирования пикселей.
Толщина пикселей для ReduceResolution
Вес пикселей, используемых в процессе агрегирования reduceResolution(), зависит от перекрытия между агрегируемыми пикселями меньшего размера и пикселями большего размера, заданными выходной проекцией. Это показано на рисунке 4.

Рисунок 4. Входные пиксели (черные) и выходной пиксель (синий) для reduceResolution().
Режим работы по умолчанию заключается в том, что веса входных пикселей вычисляются как доля площади выходного пикселя, покрытая входным пикселем. На диаграмме выходной пиксель имеет площадь a, вес входного пикселя с площадью пересечения b рассчитывается как b/a, а вес входного пикселя с площадью пересечения c рассчитывается как c/a. Это может привести к неожиданным результатам при использовании редуктора, отличного от среднего. Например, чтобы вычислить площадь лесного массива на пиксель, используйте редуктор среднего значения, чтобы вычислить долю покрытого пикселя, а затем умножьте на площадь (вместо того, чтобы вычислять площади в меньших пикселях, а затем складывать их с помощью редуктора суммы):
Редактор кода (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