Kachelfehler in Google Earth Engine?

Sep 06 2020

Der folgende Code wurde für die radiometrische ASTER-Korrektur in Google Earth Engine geschrieben, gibt jedoch im Visualisierungsschritt diesen Fehler zurück:

Code-Link: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)

Antworten

KevinReid Sep 06 2020 at 22:46

Nicht jedes Bild in den von Ihnen ausgewählten Bildern verfügt über die Eigenschaften GAIN_COEFFICIENT_B04usw. Zum Beispiel ASTER/AST_L1T_003/20100709070749hat nur

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

Daher wird .get('GAIN_COEFFICIENT_B04')null zurückgegeben, und Ihre Bildberechnung schlägt fehl, da null kein gültiger Wert für ein konstantes Bild ist.

Sie können der Bildersammlung einen Filter hinzufügen, um sicherzustellen, dass diese Eigenschaften vorhanden sind:

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

Ich habe einige andere Verbesserungen festgestellt, die an Ihrem Code vorgenommen werden könnten.

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

Hier .select('B04')macht das nichts (da Sie eine Eigenschaft erhalten und Eigenschaften unabhängig von Bands sind). Es gibt auch Varianten .get(), die das Schreiben überflüssig machen ee.Number:

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

Dies kann jedoch noch einfacher sein: ee.Image(constant)In vielen Fällen ist das Schreiben nicht erforderlich . Sie können eine Zahl schreiben, die in ein Bild umgewandelt wird.

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

Schließlich ist es für .clip(table)die einzelnen Bilder unnötig ineffizient und nicht für das Ergebnis. Wenn Sie zu einer Tabelle / Sammlung schneiden, sollten Sie die effizientere verwenden .clipToCollection(table)(obwohl dies keine Rolle spielt, da Sie nur eine Funktion haben).

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

Alles zusammen:

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