Problema com imagens do Sentinel 1 no Google Earth Engine
Estou tentando aplicar o algoritmo Otsu às imagens S1 desde o seu lançamento até a data em minha área de estudo para mapeamento de corpos d'água. Eu executo o otsu sem aplicar nenhum filtro de data para passagem de satélite para que eu possa obter mais imagens. Mas eu recebo o erro
ImageCollection (Erro) Erro no mapa (ID = S1A_IW_GRDH_1SSV_20160525T235440_20160525T235507_011422_011607_60C4): Dictionary.get: O dicionário não contém a chave: bucketMeans.
Então tentei omitir o erro acima, aplicando
.filter(ee.Filter.neq('system:id', 'COPERNICUS/S1_GRD/S1A_IW_GRDH_1SSV_20160525T235440_20160525T235507_011422_011607_60C4'))
e novamente recebo erro
ImageCollection (Error) Erro no mapa (ID = S1A_IW_GRDH_1SSV_20160805T235445_20160805T235511_012472_0137E8_08F2): Dictionary.get: O dicionário não contém a chave: bucketMeans.
e eu aplico outro filtro
.filter(ee.Filter.neq('system:id','COPERNICUS/S1_GRD/S1A_IW_GRDH_1SSV_20160805T235445_20160805T235511_012472_0137E8_08F2'))
Mas nada funciona, simplesmente continua. Percebi que o problema ocorre apenas em passes descendentes Então quando coloco um filtro para obter a passagem Ascendente a saída progride sem erros, mas não aplicará o mesmo na passagem descendente.
Aqui está meu código ..
Respostas
O problema é que algumas das imagens S1 em sua coleção são completamente mascaradas após o recorte na geometria de sua área de estudo. Para corrigir, filtre essas imagens depois de criar sua coleção de imagens original ( adaptado deste post ):
var s1Collection = s1Collection.map(function(img){
// unmask each image in the collection
var unmasked = img.unmask(-99).eq(-99);
// reduce histogram on each image and set the keys as properties (key '1' will be masked pixels)
var rR = unmasked.reduceRegion({reducer: ee.Reducer.frequencyHistogram(),
geometry: img.geometry(),
scale: 100,
bestEffort: true});
var newProperties = ee.Dictionary(rR.get('VV'));
return img.set(newProperties)
})
var s1Collection = ee.ImageCollection(s1Collection).filter(ee.Filter.notNull(['0']))
print(s1Collection, 'Clean S1 Collection');
Explicação mais longa
Examinando a imagem adquirida em 25/05/2016 (de seu exemplo), a pegada da imagem se sobrepõe ligeiramente à sua área de estudo e, portanto, não é excluída quando você o faz .filterBounds(Jinjiram). Mas, como você pode ver abaixo, não há dados na Jinjiramárea, portanto, após o recorte, a imagem inteira é mascarada:
Por isso, o dicionário de histograma possui valores nulos, pois não há dados para resumir. Veja a diferença abaixo: