Memahami tileScale di Earth Engine

Sep 05 2020

Di banyak fungsi Earth Engine seperti Image.reduceRegionsatau Image.sample, ada argumen yang disebut tileScale. Dokumentasi API umumnya menafsirkannya sebagai:

Faktor skala yang digunakan untuk mengurangi ukuran ubin agregasi; menggunakan tileScale yang lebih besar (misalnya 2 atau 4) dapat mengaktifkan komputasi yang kehabisan memori dengan default.

Meskipun hal ini tampaknya terdokumentasi dengan baik, saya masih belum memahami efek tileScale pada hasil akhir penghitungan.

  • Apa yang tileScaledilakukannya?
  • Apakah tileScalememotong gambar sebelum melakukan komputasi?
  • Apakah itu berpengaruh pada skala?

Di bawah ini adalah contoh kode untuk dikerjakan ( tautan kode ).

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

Jawaban

3 KevinReid Sep 05 2020 at 00:13

Apa yang dilakukan tileScale? Apakah tileScale memotong gambar sebelum melakukan komputasi?

Iya.

Setiap kali Anda melakukan operasi seperti reduceRegion, saat Anda menghitung satu atau beberapa nilai yang dikurangi dari suatu gambar, piksel gambar yang masuk ke peredam dihitung dalam petak (seperti petak yang digunakan untuk melihat di peta), peredamnya diterapkan ke petak piksel tersebut untuk menghasilkan hasil antara, dan kemudian hasil antara tersebut digabungkan bersama.

Menetapkan yang lebih tinggi tileScalemengurangi ukuran ubin tersebut. Artinya:

  • Lebih sedikit memori yang digunakan oleh setiap ubin (sehingga penghitungan cenderung tidak kehabisan memori).
  • Ada lebih banyak ubin, yang membutuhkan lebih banyak waktu untuk disiapkan (sehingga penghitungan akan memakan waktu lebih lama).

Apakah itu berpengaruh pada skala?

Jika yang Anda maksud adalah resolusi / ukuran piksel gambar: tidak. Jika komputasi berhasil, hasilnya harus selalu sama terlepas dari tileScale(kecuali untuk perbedaan kecil karena urutan operasi floating-point).