Errore piastrella in Google Earth Engine?

Sep 06 2020

Il codice seguente ha scritto per la correzione radiometrica ASTER in Google Earth Engine ma nella fase di visualizzazione, restituisce questo errore:

link codice:https://code.earthengine.google.com/3ccaaaa0e9ce68bdf80b8056be5d057d

Map.centerObject(table);
Map.addLayer(table)
 
var ast = ee.ImageCollection("ASTER/AST_L1T_003")
.filterDate('2000-01-01','2020-01-01')
.filterBounds(table)
.filter(ee.Filter.calendarRange(7,9,'month'))
.select('B0[4-9]')
.map(function(img){
  
  var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));
  var gain5 = ee.Image(ee.Number(img.select('B05').get('GAIN_COEFFICIENT_B05')));
  var gain6 = ee.Image(ee.Number(img.select('B06').get('GAIN_COEFFICIENT_B06')));
  var gain7 = ee.Image(ee.Number(img.select('B07').get('GAIN_COEFFICIENT_B07')));
  var gain8 = ee.Image(ee.Number(img.select('B08').get('GAIN_COEFFICIENT_B08')));
  var gain9 = ee.Image(ee.Number(img.select('B08').get('GAIN_COEFFICIENT_B09')));
  
  
  var b4 = img.select('B04').multiply(gain4).clip(table);
  var b5 = img.select('B05').multiply(gain5).clip(table);
  var b6 = img.select('B06').multiply(gain6).clip(table);
  var b7 = img.select('B07').multiply(gain7).clip(table);
  var b8 = img.select('B08').multiply(gain8).clip(table);
  var b9 = img.select('B09').multiply(gain9).clip(table);
  
  
  var stack = ee.Image.cat([b4,b5,b6,b7,b8,b9]);
  return stack
}).median();


print(ast);

Map.addLayer(ast)

Risposte

KevinReid Sep 06 2020 at 22:46

Non tutte le immagini nelle immagini che hai selezionato hanno le proprietà GAIN_COEFFICIENT_B04e così via. Ad esempio, ASTER/AST_L1T_003/20100709070749ha solo

GAIN_COEFFICIENT_B01: 0.676
GAIN_COEFFICIENT_B02: 0.708
GAIN_COEFFICIENT_B10: 0.006822
GAIN_COEFFICIENT_B11: 0.00678
GAIN_COEFFICIENT_B12: 0.00659
GAIN_COEFFICIENT_B13: 0.005693
GAIN_COEFFICIENT_B14: 0.005225
GAIN_COEFFICIENT_B3N: 0.862

Pertanto, .get('GAIN_COEFFICIENT_B04')restituisce null e il calcolo dell'immagine non riesce perché null non è un valore valido per un'immagine costante.

Puoi aggiungere un filtro alla raccolta di immagini per assicurarti che tali proprietà siano presenti:

.filter(ee.Filter.notNull([
  'GAIN_COEFFICIENT_B04',
  'GAIN_COEFFICIENT_B05',
  'GAIN_COEFFICIENT_B06',
  'GAIN_COEFFICIENT_B07',
  'GAIN_COEFFICIENT_B08',
  'GAIN_COEFFICIENT_B09',
]))

Ho notato alcuni altri miglioramenti che potrebbero essere apportati al tuo codice.

  var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));

Qui, .select('B04')non fa nulla (dal momento che stai ottenendo una proprietà e le proprietà sono indipendenti dalle bande). Inoltre, ci sono varianti .get()che eliminano la necessità di scrivere ee.Number:

  var gain4 = ee.Image(img.getNumber('GAIN_COEFFICIENT_B04'));

Ma questo può essere anche più semplice: non è necessario scrivere ee.Image(constant)in molti casi; puoi scrivere un numero e verrà convertito in un'immagine.

  var b4 = img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')).clip(table);

Infine, è inutilmente inefficiente per .clip(table)le singole immagini piuttosto che per il risultato, e quando esegui il clipping su una tabella / raccolta dovresti usare il più efficiente .clipToCollection(table)(anche se questo non importa dato che hai solo una funzione).

.map(function(img){
  ...
}).median().clipToCollection(table);

Mettere tutto insieme:

var ast = ee.ImageCollection("ASTER/AST_L1T_003")
  .filterDate('2000-01-01','2020-01-01')
  .filterBounds(table)
  .filter(ee.Filter.calendarRange(7,9,'month'))
  .select('B0[4-9]')
  .filter(ee.Filter.notNull([
    'GAIN_COEFFICIENT_B04',
    'GAIN_COEFFICIENT_B05',
    'GAIN_COEFFICIENT_B06',
    'GAIN_COEFFICIENT_B07',
    'GAIN_COEFFICIENT_B08',
    'GAIN_COEFFICIENT_B09',
  ]))
  .map(function(img){
    return ee.Image.cat([
      img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')),
      img.select('B05').multiply(img.getNumber('GAIN_COEFFICIENT_B05')),
      img.select('B06').multiply(img.getNumber('GAIN_COEFFICIENT_B06')),
      img.select('B07').multiply(img.getNumber('GAIN_COEFFICIENT_B07')),
      img.select('B08').multiply(img.getNumber('GAIN_COEFFICIENT_B08')),
      img.select('B09').multiply(img.getNumber('GAIN_COEFFICIENT_B09')),
    ]);
  })
  .median()
  .clipToCollection(table);

https://code.earthengine.google.com/3ba97a7c2009def6043c614c5aeae4f7