Comprensione tileScale in Earth Engine

Sep 05 2020

In molte funzioni di Earth Engine come Image.reduceRegionso Image.sample, c'è un argomento chiamato tileScale. La documentazione API generalmente lo interpreta come:

Un fattore di scala utilizzato per ridurre le dimensioni delle tessere di aggregazione; l'utilizzo di un tileScale più grande (ad esempio 2 o 4) può consentire calcoli che esauriscono la memoria con l'impostazione predefinita.

Anche se questo sembra essere ben documentato, ancora non capisco l'effetto di tileScale sul risultato finale del calcolo.

  • Cosa fa tileScale?
  • L' tileScaleimmagine in pezzi prima di eseguire il calcolo?
  • Ha un effetto sulla scala?

Di seguito è riportato un esempio di codice con cui lavorare ( collegamento al codice ).

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

Risposte

3 KevinReid Sep 05 2020 at 00:13

Cosa fa tileScale? TileScale divide in pezzi l'immagine prima di eseguire il calcolo?

Sì.

Ogni volta che si esegue un'operazione come reduceRegion, in cui si calcola uno o più valori ridotti da un'immagine, i pixel dell'immagine che entrano nel riduttore vengono calcolati in tessere (proprio come le tessere utilizzate per la visualizzazione su una mappa), il riduttore è applicato a quelle tessere di pixel per produrre risultati intermedi, quindi quei risultati intermedi vengono combinati insieme.

L'impostazione di un valore più alto tileScaleriduce le dimensioni di quelle tessere. Ciò significa che:

  • Meno memoria viene utilizzata da ogni tessera (quindi è meno probabile che il calcolo esaurisca la memoria).
  • Ci sono più tessere, che richiedono più tempo per essere impostate (quindi il calcolo richiederà più tempo).

Ha un effetto sulla scala?

Se intendi la risoluzione / dimensione in pixel dell'immagine: no. Se il calcolo ha esito positivo, il risultato dovrebbe essere sempre lo stesso indipendentemente da tileScale(eccetto per piccole differenze dovute all'ordine delle operazioni in virgola mobile).