1 votos

¿Buscando una función para calcular el red-edgeNDVI en Google Earth Engine?

Estoy tratando de calcular el Red-edge NDVI ((NIR - borde rojo)/(NIR + borde rojo)) de una Image.Collection en Google Earth Engine. Hay una función incorporada para NDVI pero no para Red-edge NDVI. El código que tengo está abajo pero recibo el mensaje de error "image.NIR no está definido". Estoy seguro de que se trata de un simple problema de sintaxis relacionado con la función pero he intentado todo lo que se me ocurre y simplemente no logro que funcione.

¿Puedes decirme qué estoy olvidando?

/**
 * Función para enmascarar nubes usando la banda QA de Sentinel-2
 * @param {ee.Image} image Imagen de Sentinel-2
 * @return {ee.Image} Imagen de Sentinel-2 con máscara de nubes
 */
function maskS2clouds(image) {
  var qa = image.select('QA60');

  // Los bits 10 y 11 son nubes y cirros, respectivamente.
  var cloudBitMask = 1 << 10;
  var cirrusBitMask = 1 << 11;

  // Ambas banderas deben estar en cero, indicando condiciones claras.
  var mask = qa.bitwiseAnd(cloudBitMask).eq(0)
      .and(qa.bitwiseAnd(cirrusBitMask).eq(0));

  return image.updateMask(mask)
  .divide(10000);
}

  // Cargar datos de reflectancia TOA de Sentinel-2.
  var S2 = ee.ImageCollection('COPERNICUS/S2')
                  .filterDate('2017-06-01', '2017-09-30')
                  // Pre-filtrar para obtener granulos menos nublados.
                  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                  //Seleccionar solo bandas requeridas
                  .select('B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'QA60')
                  //Aplicar máscara de nubes
                  .map(maskS2clouds);

//Crear variables de bandas
var redEdge = S2.select('B5');
var NIR = S2.select('B8');

//Función para calcular redEdgeNDVI
var add_reNDVI = function(image){
  var redEdgeNDVI = image.NIR.subtract(redEdge).divide(NIR.add(redEdge)).rename('reNDVI');
    return image.addBands(reNDVI);
};

5voto

hibbelig Puntos 176

En tu código, S2 es una ImageCollection, por lo que cuando "creas variables de banda" simplemente estás obteniendo ImageCollections en las cuales cada imagen solo tiene la banda seleccionada, lo cual es útil. Como comentaste bien, add_reNDVI es una función que tomará cada imagen en la colección y calculará reNDVI. Así que debes mapear esa función sobre la colección para obtener lo que deseas.

// Load Sentinel-2 TOA reflectance data.
var S2 = ee.ImageCollection('COPERNICUS/S2')
                .filterDate('2017-06-01', '2017-09-30')
                // Pre-filter to get less cloudy granules.
                .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 20))
                // Seleccionar solo las bandas requeridas
                .select('B2', 'B3', 'B4', 'B5', 'B6', 'B7', 'B8', 'B8A', 'QA60')
                // Aplicar máscara de nubes
                .map(maskS2clouds);

//Función para calcular redEdgeNDVI
var add_reNDVI = function(image){
  //Crear variables de banda
  var redEdge = image.select('B5');
  var NIR = image.select('B8');
  var redEdgeNDVI = NIR.subtract(redEdge).divide(NIR.add(redEdge)).rename('reNDVI');
    return image.addBands(redEdgeNDVI);
};
var s2_reNDVI = S2.map(add_reNDVI)
Map.centerObject(s2_reNDVI.first())
Map.addLayer(s2_reNDVI.first())

Supongo que en algún momento necesitarás filtrar por límites, es por eso que simplemente saqué la primera imagen de la colección para verificar si funciona

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