Zrozumienie tileScale w Earth Engine

Sep 05 2020

W wielu funkcjach Earth Engine, takich jak Image.reduceRegionslub Image.sample, istnieje argument o nazwie tileScale. Dokumentacja API ogólnie interpretuje to jako:

Współczynnik skalowania używany do zmniejszania rozmiaru kafelka agregacji; użycie większej wartości tileScale (np. 2 lub 4) może włączyć obliczenia, dla których zabraknie pamięci przy ustawieniu domyślnym.

Chociaż wydaje się to być dobrze udokumentowane, nadal nie rozumiem wpływu tileScale na końcowy wynik obliczeń.

  • Co robi tileScale?
  • Czy tileScaledzieli obraz na kawałki przed wykonaniem obliczeń?
  • Czy ma to wpływ na skalę?

Poniżej znajduje się przykładowy kod do pracy ( link do kodu ).

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

Odpowiedzi

3 KevinReid Sep 05 2020 at 00:13

Co robi TileScale? Czy tileScale dzieli obraz na kawałki przed wykonaniem obliczeń?

Tak.

Za każdym razem, gdy wykonujesz operację, taką jak reduceRegion, gdy obliczasz jedną lub więcej zredukowanych wartości z obrazu, piksele obrazu, które trafiają do reduktora, są obliczane w kafelkach (tak jak kafelki używane do przeglądania na mapie), reduktor jest zastosowane do tych kafelków pikseli w celu uzyskania wyników pośrednich, a następnie te wyniki pośrednie są łączone razem.

Ustawienie wyższego tileScalezmniejsza rozmiar tych płytek. To znaczy że:

  • Każdy kafelek zużywa mniej pamięci (więc w obliczeniach jest mniejsze prawdopodobieństwo, że zabraknie pamięci).
  • Jest więcej kafelków, których konfiguracja zajmuje więcej czasu (więc obliczenia potrwają dłużej).

Czy ma to wpływ na skalę?

Jeśli masz na myśli rozdzielczość / rozmiar w pikselach obrazu: nie. Jeśli obliczenie się powiedzie, wynik powinien być zawsze taki sam niezależnie od tileScale(z wyjątkiem małych różnic wynikających z kolejności operacji zmiennoprzecinkowych).