Noções básicas sobre tileScale no Earth Engine
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
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).