Noções básicas sobre tileScale no Earth Engine

Sep 05 2020

Em muitas funções do Earth Engine, como Image.reduceRegionsou Image.sample, há um argumento chamado tileScale. A documentação da API geralmente a interpreta como:

Um fator de escala usado para reduzir o tamanho do bloco de agregação; usar um tileScale maior (por exemplo, 2 ou 4) pode permitir cálculos que ficam sem memória com o padrão.

Embora isso pareça estar bem documentado, ainda não entendo o efeito de tileScale no resultado final do cálculo.

  • O que tileScalefazer?
  • Será que tileScalesegmenta a imagem antes de realizar o cálculo?
  • Isso tem efeito na escala?

Abaixo está um exemplo de código para trabalhar ( link do código ).

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

Respostas

3 KevinReid Sep 05 2020 at 00:13

O que o tileScale faz? O tileScale fragmenta a imagem antes de realizar o cálculo?

Sim.

Sempre que você realiza uma operação como reduceRegion, onde você está computando um ou mais valores reduzidos de uma imagem, os pixels da imagem que vão para o redutor são calculados em blocos (assim como os blocos usados ​​para visualização em um mapa), o redutor é aplicado a esses blocos de pixels para produzir resultados intermediários e, em seguida, esses resultados intermediários são combinados.

Definir um valor mais alto tileScalereduz o tamanho dessas peças. Isso significa que:

  • Cada bloco usa menos memória (portanto, é menos provável que o cálculo fique sem memória).
  • Há mais blocos, que levam mais tempo para serem configurados (portanto, o cálculo será mais demorado).

Isso tem efeito na escala?

Se você quer dizer a resolução / tamanho do pixel da imagem: não. Se o cálculo for bem-sucedido, o resultado deve ser sempre o mesmo, independentemente de tileScale(exceto para pequenas diferenças devido à ordem das operações de ponto flutuante).