¿Error de mosaico en Google Earth Engine?
El siguiente código se ha escrito para la corrección radiométrica ASTER en Google Earth Engine, pero en el paso de visualización, devuelve este error:
enlace de código: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)
Respuestas
No todas las imágenes de las imágenes que ha seleccionado tienen las propiedades, GAIN_COEFFICIENT_B04etc. Por ejemplo, ASTER/AST_L1T_003/20100709070749solo tiene
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
Por lo tanto, .get('GAIN_COEFFICIENT_B04')devuelve nulo y el cálculo de la imagen falla porque nulo no es un valor válido para una imagen constante.
Puede agregar un filtro en la colección de imágenes para asegurarse de que esas propiedades estén presentes:
.filter(ee.Filter.notNull([
'GAIN_COEFFICIENT_B04',
'GAIN_COEFFICIENT_B05',
'GAIN_COEFFICIENT_B06',
'GAIN_COEFFICIENT_B07',
'GAIN_COEFFICIENT_B08',
'GAIN_COEFFICIENT_B09',
]))
Noté algunas otras mejoras que podrían realizarse en su código.
var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));
Aquí, .select('B04')no hace nada (ya que obtiene una propiedad y las propiedades son independientes de las bandas). Además, existen variantes .get()que eliminan la necesidad de escribir ee.Number:
var gain4 = ee.Image(img.getNumber('GAIN_COEFFICIENT_B04'));
Pero esto puede ser aún más simple: ee.Image(constant)en muchos casos no es necesario escribir ; puede escribir un número y se convertirá en una imagen.
var b4 = img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')).clip(table);
Finalmente, es innecesariamente ineficiente para .clip(table)las imágenes individuales en lugar del resultado, y cuando está recortando a una tabla / colección debe usar la más eficiente .clipToCollection(table)(aunque esto no importa ya que solo tiene una característica).
.map(function(img){
...
}).median().clipToCollection(table);
Poniendolo todo junto:
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