Présentation de tileScale dans Earth Engine

Sep 05 2020

Dans de nombreuses fonctions Earth Engine telles que Image.reduceRegionsou Image.sample, il existe un argument appelé tileScale. La documentation de l'API l'interprète généralement comme:

Un facteur d'échelle utilisé pour réduire la taille des tuiles d'agrégation; l'utilisation d'un tileScale plus grand (par exemple 2 ou 4) peut permettre des calculs qui manquent de mémoire avec la valeur par défaut.

Bien que cela semble bien documenté, je ne comprends toujours pas l'effet de tileScale sur le résultat final du calcul.

  • Que fait tileScale-on?
  • Est-ce que tileScalel'image fragmente avant d'effectuer le calcul?
  • Cela a-t-il un effet sur l'échelle?

Vous trouverez ci-dessous un exemple de code avec lequel travailler ( lien de code ).

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

Réponses

3 KevinReid Sep 05 2020 at 00:13

Que fait tileScale? Est-ce que tileScale segmente l'image avant d'effectuer le calcul?

Oui.

Chaque fois que vous effectuez une opération comme reduceRegion, où vous calculez une ou plusieurs valeurs réduites à partir d'une image, les pixels de l'image qui entrent dans le réducteur sont calculés en tuiles (tout comme les tuiles utilisées pour la visualisation sur une carte), le réducteur est appliqués à ces carreaux de pixels pour produire des résultats intermédiaires, puis ces résultats intermédiaires sont combinés.

La définition d'une valeur plus élevée tileScaleréduit la taille de ces tuiles. Cela signifie que:

  • Moins de mémoire est utilisée par chaque tuile (le calcul est donc moins susceptible de manquer de mémoire).
  • Il y a plus de tuiles, qui prennent plus de temps à mettre en place (donc le calcul prendra plus de temps).

Cela a-t-il un effet sur l'échelle?

Si vous voulez dire la résolution / taille de pixel de l'image: non. Si le calcul réussit, le résultat doit toujours être le même quel que soit tileScale(à l'exception de petites différences dues à l'ordre des opérations en virgule flottante).