Guía de uso de GreenEye Tools

1. Qué es GreenEye Tools (GET)

GreenEye Tools (GET) es un módulo para Google Earth Engine que permite acceder a las herramientas de obtención, preprocesamiento y procesamiento de imágenes de Sentinel-2 y de cálculo de índices espectrales, dinámicas de aguas superficiales y usos y coberturas del suelo desde el Code Editor de Google Earth Engine.

En esta guía de uso se asume que dispone de una cuenta de Google Earth Engine y se tiene, al menos, nociones básicas sobre cómo acceder y utilizar el editor de código de Google Earth Engine y/o la API de JavaScript de Google Earth Engine.

2. Resumen de las herramientas incluidas

Herramienta Descripción
wetlandEvaluation Procesa una serie de imágenes de Sentinel-2 y genera datos mensuales, anuales y para todo el periodo de tiempo analizado con composites mensuales, índices espectrales de agua y vegetación y dinámicas de agua superficial. Esta función ejecuta secuencialmente todas las funciones de GET
prepareImageCollection Filtra una colección de imágenes de Sentinel-2 por ubicación, rango de fechas y porcentaje máximo de nubes
monthlyReducer Reduce una colección de imágenes a una composición mensual utilizando la mediana de los píxeles
computeIndices Calcula un índice espectral de agua y otro de vegetación para cada imagen de satélite
waterArea Calcula la superficie de la lámina de agua de cada imagen con una banda con el índice espectral de agua
surfaceWaterDynamics Calcula las dinámicas de agua superficial de una colección de imágenes
dynamicWorld Genera cartografía de usos y coberturas del suelo a partir de datos de Google Dynamic World

3. Requisitos

Las herramientas de GET se apoyan en un diccionario de parámetros desde el que se puede ajustar su funcionamiento. Todas ellas cuentan con un valor por defecto, excepto la región de estudio (roi), que debe ser proporcionada o generada previamente.

3.1 Diccionario de parámetros

Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Región de estudio / Delimitación hidroecológica del entorno del humedal/sistema de humedales
wetland Geometry (polígono) Delimitación del humedal o humedales
S2collection ee.ImageCollection Copernicus Sentinel-2 SR Colección de Sentinel-2
startDate String 2017-03-28 Fecha inicial del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’. No puede ser anterior al 28 de marzo de 2017
endDate String Fecha actual Fecha final del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’
waterIndex String NDWI Nombre del índice de agua que se va a utilizar. Será también el nombre de la banda
waterIndexThreshold Number 0.05 Umbral que separa los valores de agua y no agua en el índice de agua
vegetationIndex String NDVI Nombre del índice de vegetación que se va a utilizar. Será también el nombre de la banda
outputBands List B1 a B12 Lista de bandas de Sentinel-2 que se conservarán en los datos mensuales

3.2 Geometrías de entrada

Dato Tipo Requisito Descripción
roi Geometry (polígono) Requerido Delimitación del área de afectación hidroecológica. Puede usarse una geometría de tipo puntual si la delimitación no se conoce o necesita
wetland Geometry (polígono o punto) Opcional Delimitación del humedal

4. Uso de GET

Las herramientas de GET se han desarrollado como un script que puede ser importado, copiado o adaptado desde el repositorio público del ETC-UMA en Google Earth Engine. Para acceder a ellas desde un script, primero se debe acceder al siguiente enlace, que añadirá el repositorio users/etcsiauma/public a su cuenta de Google Earth Engine:

Añadir repositorio users/etcsiauma/public

Se importa GET al comienzo del script:

var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

4.1 Ejemplo de uso

Vamos a poner un ejemplo para extraer la evolución mensual de la superficie de agua en la laguna de Fuente de Piedra (provincia de Málaga, Andalucía, España) entre los años 2018 y 2020. La vamos a representar usando una gráfica y vamos a añadir al mapa una representación cartográfica de la presencia máxima de agua para ese periodo.

Importamos GET:

// Importamos el módulo GreenEye Tools 
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

Definimos como región de estudio (parámetro ROI) un polígono sobre la laguna:

// Definimos una region de estudio
var fuentePiedra = ee.Geometry.Polygon(
  [[[-4.797890034320275, 37.13509177475219],
    [-4.797890034320275, 37.08389222590178],
    [-4.7391818434023065, 37.08389222590178],
    [-4.7391818434023065, 37.13509177475219]]]
);

Creamos un diccionario de parámetros. Vamos a utilizar todos los parámetros por defecto excepto las fechas de inicio y fin:

// Definimos parámetros
var params = {
  roi: fuentePiedra,
  startDate: '2018-01-01',
  endDate: '2020-01-01'
};

Para este ejemplo no necesitamos modificar ninguno de los pasos de este proceso, así que utilizamos la función wetlandEvaluation() con los parámetros que acabamos de definir y el resto de parámetros por defecto:

// Aplicamos la función wetlandEvaluation
var datos = GET.wetlandEvaluation(params);

Exploramos el contenido del objeto datos que acabamos de crear:

// Imprimimos en la consola la variable “datos” para explorar su contenido
print(datos);

La presencia máxima de agua se encuentra en la ee.Image MaxWaterExtent_total, y los datos mensuales de la lámina de agua están en la ee.ImageCollection MonthlyData, en la banda waterArea. Creamos una variable con el contenido de ambos datos:

// De “datos” extraemos “MonthlyData” y “MaxWaterExtent_total” como nuevas variables
var laminaAguaMensual = datos.MonthlyData.select('waterArea');
var presenciaMaximaAgua = datos.MaxWaterExtent_total;

Definimos una gráfica para visualizar los datos mensuales de la lámina de agua y añadimos la presencia máxima de agua al mapa:

// Creamos y configuramos la gráfica
var graficaAguaMensual = ui.Chart
  .image.seriesByRegion({
    imageCollection: laminaAguaMensual, 
    regions: fuentePiedra,
    reducer: ee.Reducer.sum(), 
    scale: 10,
    seriesProperty: 'label',
    xProperty: 'system:time_end'
  })
  .setChartType('SteppedAreaChart')
  .setOptions({
    title: 'Evolución de la lámina de agua en la laguna de Fuente de Piedra',
    hAxis: {title: 'Fecha'},
    vAxis: {title: 'Superficie (ha)'}
  });
// y la visualizamos
print(graficaAguaMensual);

// Añadimos la presencia máxima de agua al mapa
Map.addLayer(presenciaMaximaAgua, {palette:['blue']}, 'Presencia máxima de agua');

// Centramos el mapa sobre nuestra región de interés
Map.centerObject(fuentePiedra);

5. Funciones

5.1 wetlandEvaluation

Ejecuta todas las funciones y pasos necesarios para procesar una ee.ImageCollection de Sentinel-2 y devuelve un Object con las imágenes procesadas y agregadas mensualmente, índices espectrales de agua, vegetación y las dinámicas de agua superficial:

Opcionalmente puede añadir al mapa un selector de fechas que carga, con la simbología adecuada, todas las capas incluidas en el Object.

Uso Devuelve
wetlandEvaluation(params, addToMap, showDefaults) Object

Argumentos

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
wetland Geometry (polígono) Opcional Delimitación del humedal o humedales
s2collection ee.ImageCollection Copernicus Sentinel-2 SR Colección de Sentinel-2
startDate String 2017-03-28 Fecha inicial del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’. No puede ser anterior al 28 de marzo de 2017
endDate String Fecha actual Fecha final del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’
maxClouds Number 20 Porcentaje de nubes detectado en la escena completa de Sentinel-2
waterIndex String NDWI Nombre del índice de agua que se va a utilizar. Será también el nombre de la banda
waterIndexThreshold Number 0.05 Umbral que separa los valores de agua y no agua en el índice de agua
vegetationIndex String NDVI Nombre del índice de vegetación que se va a utilizar. Será también el nombre de la banda
outputBands List B1 a B12 Lista de bandas de Sentinel-2 que se conservarán en los datos mensuales
addToMap (boolean, opcional, por defecto: false)

Añade al mapa un selector de fechas para filtrar los datosa y las capas generadas.

showDefaults (boolean, opcional, por defecto: false)

Muestra en la consola los valores por defecto de los parámetros globales que no el usuario no ha modificado.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos nuestra region de interés
var regionInteres = ee.Geometry.Point([-3.704292329924972,39.14270061277994]);

// Creamos el diccionario de parámetros
var params = {
  roi: regionInteres,
};

// Ejecutamos la función wetlandEvaluation
GET.wetlandEvaluation(params, true, true);

// Centramos el mapa sobre nuestra región de interés
Map.centerObject(regionInteres);

5.2 prepareImageCollection

Filtra una ee.ImageCollection de Sentinel-2 con los parámetros proporcionados. Devuelve una ee.ImageCollection filtrada por ubicación, rango de fechas y porcentaje de nubes máximo.

Uso Devuelve
prepareImageCollection(params, showDefaults) ee.ImageCollection

Argumentos

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
s2collection ee.ImageCollection Copernicus Sentinel-2 SR Colección de Sentinel-2
startDate String 2017-03-28 Fecha inicial del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’. No puede ser anterior al 28 de marzo de 2017
endDate String Fecha actual Fecha final del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’
maxClouds Number 20 Porcentaje de nubes detectado en la escena completa de Sentinel-2
outputBands List B1 a B12 Lista de bandas de Sentinel-2 que se conservarán en los datos mensuales
showDefaults (boolean, opcional, por defecto: false)

Muestra en consola los valores por defecto de los parámetros globales que no ha modificado el usuario.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos una región de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  startDate: '2021-01-01',
  endDate: '2022-12-31',
};

// Aplicamos la función prepareImageCollection
var datos = GET.prepareImageCollection(params);

// Exploramos el resultado
print(datos);

5.3 monthlyReducer

Reduce una ee.ImageCollection a una composición mensual usando la mediana. Devuelve una ee.ImageCollection con una ee.Image por mes para cada mes entre las fechas de la imagen más antigua y la más reciente de la ee.ImageCollection de entrada.

Uso Devuelve
monthlyReducer(imageCollection) ee.ImageCollection

Argumentos

imageCollection (ee.ImageCollection, requerido)

Colección de imágenes que contienen la propiedad 'system:time_start'.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos una region de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  startDate: '2021-01-01',
  endDate: '2022-12-31',
};

// Preprocesamos la colección
var datos = GET.prepareImageCollection(params);

// Reducimos la colección a un dato mensual
datos = GET.monthlyReducer(datos);

print(datos);

5.4 computeIndices

Añade a cada ee.Image de la ee.ImageCollection de entrada una banda con el índice de vegetación y el índice de agua.

Uso Devuelve
computeIndices(imageCollection, params, showDefaults) ee.ImageCollection

Argumentos

imageCollection (ee.ImageCollection, requerido)

Colección de entrada de imágenes de Sentinel-2.

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
waterIndex String NDWI Nombre del índice de agua que se va a utilizar. Será también el nombre de la banda
vegetationIndex String NDVI Nombre del índice de vegetación que se va a utilizar. Será también el nombre de la banda
showDefaults (boolean, opcional, por defecto: false)

Muestra en consola los valores por defecto de los parámetros globales que no ha modificado el usuario.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos una region de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  waterIndex: 'MNDWI',
  vegetationIndex: 'EVI2'
};

// Preprocesamos la colección
var datos = GET.prepareImageCollection(params);

// Reducimos la colección a un dato mensual
datos = GET.monthlyReducer(datos);

// Calculamos los índices de agua y vegetación
datos = GET.computeIndices(datos, params);

print(resultados);

5.5 waterArea

Calcula la lámina de agua de cada ee.Image en una ee.ImageCollection que contiene un índice de agua. Devuelve la ee.ImageCollection de entrada con una nueva banda “waterArea” con la lámina de agua y donde el valor de píxel es la superficie en hectáreas que ocupa dicho píxel.

Uso Devuelve
waterArea(imageCollection, params, showDefaults) ee.ImageCollection

Argumentos

imageCollection (ee.ImageCollection, requerido)

Colección de entrada de imágenes de Sentinel-2 con una banda con un índice de agua.

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
waterIndex String NDWI Nombre del índice de agua que se va a utilizar. Será también el nombre de la banda
waterIndexThreshold Number 0.05 Umbral que separa los valores de agua y no agua en el índice de agua
showDefaults (boolean, opcional, por defecto: false)

Muestra en consola los valores por defecto de los parámetros globales que no ha modificado el usuario.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos una region de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  waterIndex: 'MNDWI',
  waterIndexThreshold: 0.125
};

// Preprocesamos la colección
var datos = GET.prepareImageCollection(params);

// Reducimos la colección a un dato mensual
datos = GET.monthlyReducer(datos);

// Calculamos los índices de agua y vegetación
datos = GET.computeIndices(datos, params);

// Calculamos la lámina de agua
datos = GET.waterArea(datos, params);

print(datos)

5.6 surfaceWaterDynamics

Calcula las dinámicas de agua superficial a partir de una ee.ImageCollection que contiene un dato mensual con el índice de agua. Devuelve un Object que contiene el hidroperiodo anual y medio, la presencia máxima de agua anual y total y la frecuencia de inundación.

Uso Devuelve
surfaceWaterDynamics(imageCollection, params, showDefaults) Object

Argumentos

imageCollection (ee.ImageCollection, requerido)

Colección con un índice de agua como banda para cada imagen.

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
waterIndex String NDWI Nombre del índice de agua que se va a utilizar. Será también el nombre de la banda
waterIndexThreshold Number 0.05 Umbral que separa los valores de agua y no agua en el índice de agua
showDefaults (boolean, opcional, por defecto: false)

Muestra en consola los valores por defecto de los parámetros globales que no ha modificado el usuario.

Ejemplo

// Cargamos el módulo GreenEye_Tools
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');

// Definimos una region de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  startDate: '2019-01-01',
  endDate: '2019-12-31',
};

// Preprocesamos la colección
var datos = GET.prepareImageCollection(params);

// Reducimos la colección a un dato mensual
datos = GET.monthlyReducer(datos);

// Calculamos los índices de agua y vegetación
datos = GET.computeIndices(datos, params);

// Calculamos la lámina de agua
datos = GET.waterArea(datos, params);

// Calculamos las dinámicas de agua superficial
var swd = GET.surfaceWaterDynamics(datos, params);
print(swd);

// Añadimos al mapa la frecuencia de inundación, el hidroperiodo anual y la superficie máxima inundada anual
Map.addLayer(swd.floodFrequency, {min:0, max: 100, palette:['white', 'blue']}, 'Frecuencia de inundación (2021)');
Map.addLayer(swd.hydroperiod_annual, {min: 1, max: 4, palette: ['acebd9', '56C3D8', '009bd6', '000060']}, 'Hidroperiodo (2021)');
Map.addLayer(swd.maxWaterExtent_annual, {palette:['E50083']}, 'Superficie máxima inundada (2021)');

// Centramos el mapa sobre nuestra área de interés
Map.centerObject(regionInteres);

5.7 dynamicWorld

Accede a la colección de Google Dynamic World y genera una ee.ImageCollection con una ee.Image con la clase más probable por píxel para cada año y una banda por clase donde el valor de píxel es la superficie que ocupa el mismo.

Uso Devuelve
dynamicWorld(params, showDefaults) ee.ImageCollection

Argumentos

params (dictionary, requerido)
Parámetro Tipo Por defecto Definición
roi Geometry (polígono o punto) Requerido Delimitación hidroecológica del entorno del humedal/sistema de humedales
startDate String 2017-03-28 Fecha inicial del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’. No puede ser anterior al 28 de marzo de 2017
endDate String Fecha actual Fecha final del análisis, en formato ‘AAAA-MM-DD’ o ‘AAAA-MM’
showDefaults (boolean, opcional, por defecto: false)

Muestra en consola los valores por defecto de los parámetros globales que no ha modificado el usuario.

Ejemplo

// Cargamos el módulo GreenEye_Tools y los parámetros de visualización
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');
var VISPARAMS = require('users/etcsiauma/public:Modules/Visualization_parameters');

// Definimos una region de interés
var regionInteres = ee.Geometry.Polygon([
  [-4.797890034320275, 37.13509177475219],
  [-4.797890034320275, 37.08389222590178],
  [-4.7391818434023065, 37.08389222590178],
  [-4.7391818434023065, 37.13509177475219]
]);

// Definimos el diccionario de parámetros
var params = {
  roi: regionInteres,
  startDate: '2018-01-01',
  endDate: '2022-12-31',
};

// Generamos los datos de Dynamic World
var dynamicWorld = GET.dynamicWorld(params, true);

print(dynamicWorld);

// Creamos una capa para 2018 y otra para 2023
var dw2018 = dynamicWorld.filter(ee.Filter.eq('year', '2018'));
var dw2022 = dynamicWorld.filter(ee.Filter.eq('year', '2022'));

// Las añadimos al mapa
Map.addLayer(dw2018.select('label'), VISPARAMS.dynamicWorld, 'Usos y coberturas, 2018');
Map.addLayer(dw2022.select('label'), VISPARAMS.dynamicWorld, 'Usos y coberturas, 2022');

// Centramos el mapa sobre nuestra área de interés
Map.centerObject(regionInteres);