Понимание tileScale в Earth Engine

Sep 05 2020

Во многих функциях Earth Engine, таких как Image.reduceRegionsили Image.sample, есть аргумент, называемый tileScale. Документация API обычно интерпретирует это как:

Коэффициент масштабирования, используемый для уменьшения размера плитки агрегирования; использование большего размера tileScale (например, 2 или 4) может позволить вычислениям, в которых не хватает памяти по умолчанию.

Хотя это, кажется, хорошо задокументировано, я все еще не понимаю, как tileScale влияет на окончательный результат вычислений.

  • Что tileScaleделать?
  • tileScaleРазделяет ли изображение фрагменты перед вычислением?
  • Это влияет на масштаб?

Ниже приведен пример кода для работы ( ссылка на код ).

// Getting the image of the region of interest
var roi = ee.Geometry.Point([1.864578244475683, 14.492292970253338]);
var image = ee.ImageCollection('LANDSAT/LC08/C01/T1_TOA')
                .filterDate('2019-01-01', '2019-01-31')
                .filterBounds(roi)
                .select(['B5', 'B4', 'B3'])
                .toBands()
                .rename(['B5', 'B4', 'B3']);
                
// Checking it out
print(image);

// Define the visualization parameters.
var vizParams = {
  bands: ['B5', 'B4', 'B3'],
  min: 0,
  max: 0.5,
  gamma: [0.95, 1.1, 1]
};

// Center the map and display the image.
Map.centerObject(image, 9);
Map.addLayer(image, vizParams, 'false color composite');

// Computing the band means at 30 meters and tileScale of 1: (Computation succeeded)
var control = image.reduceRegion({
  reducer:ee.Reducer.mean(),
  scale    :  30,
  tileScale:   1, 
  maxPixels:1e13
});

print(control, 'first scenario');

// Computing the band means at 5 meters and tileScale of 1: (Computation succeeded)
var scenario2 = image.reduceRegion({
  reducer:ee.Reducer.mean(),
  scale:        5,
  tileScale:    1, 
  maxPixels: 1e13
});

print(scenario2, 'second scenario');

// Computing the band means at 5 meters and tileScale of 16: (Computation Error: Computation timed out.)
var scenario3 = image.reduceRegion({
  reducer:ee.Reducer.mean(),
  scale:        5,
  tileScale:   16, 
  maxPixels: 1e13
});

print(scenario3, 'third scenario');

Ответы

3 KevinReid Sep 05 2020 at 00:13

Что делает tileScale? Разделяет ли tileScale изображение перед вычислением?

Да.

Всякий раз, когда вы выполняете такую ​​операцию, как reduceRegionвычисление одного или нескольких уменьшенных значений из изображения, пиксели изображения, которые поступают в редуктор, вычисляются в плитках (точно так же, как плитки, используемые для просмотра на карте), редуктор применяется к этим плиткам пикселей для получения промежуточных результатов, а затем эти промежуточные результаты объединяются вместе.

Установка более высокого значения tileScaleуменьшает размер этих плиток. Это значит, что:

  • Каждая плитка использует меньше памяти (поэтому меньше вероятность того, что вычислениям не хватит памяти).
  • Есть больше плиток, для установки которых требуется больше времени (поэтому вычисления займут больше времени).

Это влияет на масштаб?

Если вы имеете в виду разрешение / размер изображения в пикселях: нет. Если вычисление завершается успешно, результат всегда должен быть одинаковым независимо от tileScale(за исключением небольших различий из-за порядка операций с плавающей запятой).