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.
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 |
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.
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 |
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 |
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:
Se importa GET al comienzo del script:
var GET = require('users/etcsiauma/public:Modules/GreenEye_Tools');
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);
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:
ee.ImageCollection
con una ee.Image
de Sentinel-2 por mes, calculada a partir de la mediana de todas las imágenes del periodo, con un porcentaje de nubes igual o inferior al 20 % y una máscara de nubes basada en la banda QA60. Incluye las siguientes bandas:
ee.Image
en formato YYYY-MM;ee.Image
con la frecuencia de inundación para todo el periodo. El valor del píxel es el valor de porcentaje, con rango de 0-100.ee.ImageCollection
con una ee.Image
por año con el hidroperiodo anual.ee.Image
con el hidroperiodo medio para todo el periodo temporal.ee.ImageCollection
con una ee.Image
por año, que contiene la lámina de agua máxima detectada, esto es, aquella superficie que ha tenido agua durante una observación (un mes) o más. El resultado es una ee.Image
binaria donde 0 = no agua, 1 = agua.ee.Image
con la lámina de agua máxima detectada para todo el periodo a partir del siguiente criterio: si un píxel ha tenido agua más del 5 % de las observaciones (meses), se clasifica como agua (valor 1); en caso contrario se clasifica como no agua (valor 0).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 |
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.
// 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);
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 |
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.
// 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);
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 |
imageCollection
(ee.ImageCollection, requerido)Colección de imágenes que contienen la propiedad 'system:time_start'
.
// 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);
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 |
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.
// 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);
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 |
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.
// 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)
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 |
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.
// 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);
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 |
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.
// 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);