Ресемплинг и уменьшение разрешения

Как отмечалось в документации по проекциям, 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');

Настройка Python

Информацию о Python API и использовании geemap для интерактивной разработки можно найти на странице Среда Python.

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).

ближайший сосед
Рисунок 1а. Снимки Landsat, передискретизированные по методу ближайшего соседа.
бикубическая
Рисунок 1b. Снимки Landsat, обработанные с помощью бикубической интерполяции.

Порядок операций для этого примера кода показан на рисунке 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');

Настройка Python

Информацию о Python API и использовании geemap для интерактивной разработки можно найти на странице Среда Python.

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');

Настройка Python

Информацию о Python API и использовании geemap для интерактивной разработки можно найти на странице Среда Python.

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