1 votos

¿Cómo se puede filtrar la baja cobertura de nubes en una región con Sentinel-2 L2A en GEE?

Estoy intentando filtrar nubes en Sentinel-2 a través de GEE en un ROI pero obtengo el mismo número de imágenes recortando o no la geometría.

¿Cómo puedo calcular la cobertura de nubes en un ROI y filtrar una ImageCollection en función de la cobertura de nubes?

Este es el código en el que estaba trabajando:

var s2Sr = ee.ImageCollection('COPERNICUS/S2_SR');
var s2Clouds = ee.ImageCollection('COPERNICUS/S2_CLOUD_PROBABILITY');

var START_DATE = ee.Date('2018-03-30');
var END_DATE = ee.Date('2018-06-10');
var MAX_CLOUD_PROBABILITY = 20;
var region = AOI
Map.centerObject(region, 12);

function maskClouds(img) {
  var clouds = ee.Image(img.get('cloud_mask')).select('probability');
  var isNotCloud = clouds.lt(MAX_CLOUD_PROBABILITY);
  return img.updateMask(isNotCloud);
}

// The masks for the 10m bands sometimes do not exclude bad data at
// scene edges, so we apply masks from the 20m and 60m bands as well.
// Example asset that needs this operation:
// COPERNICUS/S2_CLOUD_PROBABILITY/20190301T000239_20190301T000238_T55GDP
function maskEdges(s2_img) {
  return s2_img.updateMask(
      s2_img.select('B8A').mask().updateMask(s2_img.select('B9').mask()));
}

// Filter input collections by desired data range and region.
var criteria = ee.Filter.and(
    ee.Filter.bounds(region), ee.Filter.date(START_DATE, END_DATE));
s2Sr = s2Sr.filter(criteria).map(maskEdges);
s2Clouds = s2Clouds.filter(criteria);

// Join S2 SR with cloud probability dataset to add cloud mask.
var s2SrWithCloudMask = ee.Join.saveFirst('cloud_mask').apply({
  primary: s2Sr,
  secondary: s2Clouds,
  condition:
      ee.Filter.equals({leftField: 'system:index', rightField: 'system:index'})
});

var s2CloudMasked = ee.ImageCollection(
  s2SrWithCloudMask).map(maskClouds).median();
var rgbVis = {min: 0, max: 3000, bands: ['B4', 'B3', 'B2']};

Map.addLayer(s2CloudMasked,
  rgbVis,
  'S2 SR masked at ' + MAX_CLOUD_PROBABILITY + '%', true);

print(s2SrWithCloudMask);

0voto

smoe Puntos 76

Yo también he estado luchando con esto. Lo que me funcionó fue hacer el filtrado en el s2SrWithCloudMask antes de convertirlo en un imageCollection . También hice una función de filtro para asignar a la colección, por lo que puede filtrar por eso. El código es el siguiente. Mantenga todo lo que tiene, sólo añadir estos bits en.

Esto fue convertido de Python a JavaScript, puede haber errores de sintaxis.

function filterClouds(img) {
    var clouds = ee.Image(img.get('cloud_mask')).select('probability');

    var cloudiness = clouds.reduceRegion({
        reducer: 'mean',
        geometry: AOI,
        scale: 10,
    }).get('probability'); //get keeps the property server-sided, instead of doing getInfo() like you would in other cases.

    return img.set({'CLOUD_COVERAGE_AOI': cloudiness});
}

// Join S2 SR with cloud probability dataset to add cloud mask.
var s2SrWithCloudMask = ee.Join.saveFirst('cloud_mask').apply({
    primary: s2Sr,
    secondary: s2Clouds,
    condition:
        ee.Filter.equals({leftField: 'system:index', rightField: 'system:index'})
});

s2SrWithCloudMask = s2SrWithCloudMask.map(filterClouds);
s2SrWithCloudMask = s2SrWithCloudMask.filterMetadata('CLOUD_COVERAGE_AOI', 'less_than', MAX_CLOUD_PROBABILITY)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X