Google Earth Engine'de Döşeme Hatası mı?
Aşağıdaki kod Google Earth Engine'de ASTER radyometrik düzeltme için yazılmıştır, ancak görselleştirme adımında bu hatayı döndürür:
kod bağlantısı: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)
Yanıtlar
Seçtiğiniz görüntülerdeki her görüntünün özellikleri GAIN_COEFFICIENT_B04vb. Bulunmaz. Örneğin ASTER/AST_L1T_003/20100709070749, yalnızca
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
Böylece, .get('GAIN_COEFFICIENT_B04')null döndürür ve null sabit bir görüntü için geçerli bir değer olmadığından görüntü hesaplamanız başarısız olur.
Bu özelliklerin mevcut olduğundan emin olmak için görüntü koleksiyonuna bir filtre ekleyebilirsiniz:
.filter(ee.Filter.notNull([
'GAIN_COEFFICIENT_B04',
'GAIN_COEFFICIENT_B05',
'GAIN_COEFFICIENT_B06',
'GAIN_COEFFICIENT_B07',
'GAIN_COEFFICIENT_B08',
'GAIN_COEFFICIENT_B09',
]))
Kodunuzda yapılabilecek başka iyileştirmeler de fark ettim.
var gain4 = ee.Image(ee.Number(img.select('B04').get('GAIN_COEFFICIENT_B04')));
Burada .select('B04')hiçbir şey yapmaz (bir mülk aldığınız için ve mülkler bantlardan bağımsızdır). Ayrıca .get()yazma ihtiyacını ortadan kaldıran varyantlar da vardır ee.Number:
var gain4 = ee.Image(img.getNumber('GAIN_COEFFICIENT_B04'));
Ancak bu daha da basit olabilir: ee.Image(constant)çoğu durumda yazmak gerekli değildir ; bir sayı yazabilirsiniz ve bir resme dönüştürülecektir.
var b4 = img.select('B04').multiply(img.getNumber('GAIN_COEFFICIENT_B04')).clip(table);
Son olarak, .clip(table)sonuçtan ziyade tek tek görüntüler için gereksiz yere verimsizdir ve bir tabloya / koleksiyona kırptığınızda daha verimli .clipToCollection(table)olanı kullanmalısınız (tek bir özelliğe sahip olduğunuz için bu önemli değildir).
.map(function(img){
...
}).median().clipToCollection(table);
Hepsini bir araya koy:
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