Как отмечено в документе «Проекции» , 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
Колаб (Питон)
# 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. В частности, неявное перепроецирование в проекцию Меркатора карт происходит с использованием метода повторной выборки, указанного во входном изображении.
Рисунок 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_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')
Обратите внимание, что в этом примере выходная проекция явно задается с помощью 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
Колаб (Питон)
# 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