Inundaciones (1984-2015)

El conjunto de datos de GSW contiene muchas capas de datos que presentan los datos de agua superficial de diferentes maneras. Comenzaremos visualizando la capa de presencia de agua, que proporciona un resumen de dónde y con qué frecuencia se produjo agua superficial durante todo el período entre marzo de 1984 y octubre de 2015.

En esta sección del instructivo, harás lo siguiente:

  1. agregar una capa de mapa para visualizar la presencia de agua superficial,
  2. mostrar cómo consultar los valores de la capa del mapa,
  3. agregar un estilo personalizado para mejorar la visualización
  4. crear una capa de máscara de agua binaria con un valor de umbral,
  5. centrar el mapa en partes interesantes del mundo y
  6. Mostrar cómo refactorizar la secuencia de comandos para que sea más legible y fácil de mantener

Crea una visualización básica

Para comenzar, copia las siguientes declaraciones en el editor de código:

Editor de código (JavaScript)

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');
Map.addLayer(occurrence);

La primera sentencia hace referencia al objeto Image de Earth Engine para el conjunto de datos de GSW y lo almacena en una variable llamada gsw. La segunda sentencia selecciona una sola capa del conjunto de datos de GSW y la almacena en una variable llamada occurrence. La tercera sentencia agrega la imagen de ocurrencia al mapa interactivo del editor de código.

Haz clic en el botón "Run" del editor de código y, después de unos segundos, deberías ver un mapa con color gris a lo largo de las costas, similar a la figura 1.

visualización predeterminada
Figura 1. Visualización predeterminada de la capa de datos de presencia de agua superficial global.

En la mayoría de las áreas, el conjunto de datos de GSW aparece transparente, ya que las ubicaciones en las que no se recopilaron imágenes de Landsat (es decir, áreas oceánicas) o en las que no se detectó agua en ninguna observación durante los 32 años están enmascaradas.

Inspecciona valores

Para explorar los valores de la capa de presencia de agua, usaremos la pestaña Inspector del editor de código. Primero, haz clic en la pestaña Inspector y, luego, en el mapa para seleccionar una ubicación. En la pestaña Inspector, se mostrará información sobre cada una de las capas que están presentes en el lugar donde hiciste clic.

pestaña Inspector
Figura 2. Resultado de ejemplo de la pestaña Inspector.

En el ejemplo anterior, el valor de la capa llamada value es 98. Las unidades son puntos porcentuales, por lo que, aproximadamente el 98% del tiempo, la ubicación se clasificó como cubierta de agua. El valor es el promedio de cada uno de los valores mensuales de presencia de agua superficial, que se normaliza en función de la variación estacional, como se describe en la Guía para usuarios de datos (v2) .

Refactoriza para mejorar tu código

Nuestra secuencia de comandos solo contiene dos instrucciones, pero ya tenemos la oportunidad de refactorizar el código para que nuestra secuencia de comandos final sea más fácil de leer y mantener con el tiempo. Actualmente, la sentencia Map.addLayer() pasa un solo argumento occurrence, que es el objeto de imagen de Earth Engine que queremos mostrar en el mapa. Sin embargo, el método Map.addLayer() también permite que se le pasen argumentos adicionales. Para ver rápidamente qué argumentos están disponibles, coloca el cursor después del paréntesis de apertura y presiona la combinación de teclas para "Mostrar sugerencias de código" para que aparezca el documento de ayuda del método addLayer. (Para ver las combinaciones de teclas, selecciona el menú Ayuda > Combinaciones de teclas).

Argumentos de Map.addLayer
Figura 3. Captura de pantalla que muestra los argumentos del método addLayer.

Las combinaciones de teclas muestran que hay cinco argumentos que se pueden pasar a Map.addLayer: eeObject, visParams, name, shown y opacity. En nuestra secuencia de comandos actual, pasamos una sola variable occurrence que se interpreta como el primer argumento, eeObject. Para pasar el objeto de variable y un argumento adicional que asigne un nombre a la capa, podemos refactorizar el código para usar "argumentos con nombre" (eeObject y name) que se pasan al método desde una estructura de datos JSON , como se muestra a continuación:

Editor de código (JavaScript)

Map.addLayer({eeObject: occurrence, name: 'Water Occurrence (1984-2015)'});

Vuelve a ejecutar el código para asegurarte de que siga funcionando después de los cambios de refactorización. El mapa resultante no debería cambiar.

Agrega parámetros de visualización

A continuación, trabajaremos para mejorar los parámetros de visualización predeterminados, que hacen que el agua se vea gris. Agrega una sentencia nueva que cree una variable VIS_OCCURRENCE y pásala como argumento adicional al método addLayer.

Editor de código (JavaScript)

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};

Editor de código (JavaScript)

Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

Los parámetros de visualización almacenados en la estructura JSON VIS_OCCURRENCE indican que se debe usar el color rojo para un valor mínimo del 0% y el azul para un valor máximo del 100%. La adición de .updateMask(occurrence.divide(100)) hace que la opacidad o transparencia de los píxeles se establezca en función del valor de ocurrencia.

Vuelve a ejecutar la secuencia de comandos y observa los resultados revisados de nuestros cambios de diseño.

Presencia de agua superficial
Figura 4. Captura de pantalla de la presencia de agua en el delta del Paraná, cerca de Buenos Aires, con un color rojo transparente para el extremo del valor mínimo del 0% y un color azul sólido para el extremo del valor máximo.

Las áreas de agua ahora son azules. ¡Excelente!

Crea una capa de umbral

La imagen de presencia de agua contiene información sobre la frecuencia con la que se espera que haya agua, con un rango de valores del 0% al 100%. Sin embargo, suele ser útil definir una capa de agua binaria (es decir, "agua" frente a "no agua") según un determinado porcentaje de ocurrencia (es decir, un valor de umbral). Usaremos esta capa binaria simple como una capa de fondo limpia sobre la que se pueden colocar otras capas de GSW. Para crear esta capa de umbral, se pueden usar las siguientes declaraciones, que utilizan un valor de umbral del 90% para separar el agua de lo que no es agua.

Primero, definimos una nueva variable de visualización VIS_WATER_MASK para contener la información de estilo de la máscara de agua:

Editor de código (JavaScript)

var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

Luego, calculamos una capa de máscara de agua con el operador de comparación mayor que .gt(90) y, luego, establecemos las áreas enmascaradas anteriormente en cero con el método .unmask():

Editor de código (JavaScript)

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

Por último, agrega la capa al mapa. Para que esta capa se renderice debajo de todas las demás, coloca la siguiente sentencia antes de cualquier otra sentencia Map.addLayer.

Editor de código (JavaScript)

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask'
});
Máscara de agua del 90%
Figura 5. Captura de pantalla de una máscara de agua del 90% para el delta del Paraná, cerca de Buenos Aires.

Ir a partes interesantes del mundo

Es divertido explorar el mundo desplazándose y haciendo zoom, pero el mundo es grande y, a veces, es útil saltar directamente a una ubicación en particular. Aquí hay una serie de declaraciones que proporcionan una pequeña muestra de ubicaciones interesantes en términos de agua superficial. Solo quita el comentario de una de las declaraciones a la vez, y tu secuencia de comandos irá a esa ubicación cuando se ejecute.

Editor de código (JavaScript)

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

Esta es solo una pequeña muestra de ubicaciones interesantes. No dudes en agregar las tuyas.

Refactorización, otra vez…

Antes de pasar a la siguiente capa del conjunto de datos de GSW, haremos un poco más de refactorización de código. Específicamente, agruparemos nuestras declaraciones similares y agregaremos algunos comentarios que dividirán nuestro código en secciones para recursos, constantes, cálculos, centrado del mapa y adición de capas del mapa.

Esta es la secuencia de comandos final refactorizada:

Editor de código (JavaScript)

//////////////////////////////////////////////////////////////
// Asset List
//////////////////////////////////////////////////////////////

var gsw = ee.Image('JRC/GSW1_0/GlobalSurfaceWater');
var occurrence = gsw.select('occurrence');

//////////////////////////////////////////////////////////////
// Constants
//////////////////////////////////////////////////////////////

var VIS_OCCURRENCE = {
  min: 0,
  max: 100,
  palette: ['red', 'blue']
};
var VIS_WATER_MASK = {
  palette: ['white', 'black']
};

//////////////////////////////////////////////////////////////
// Calculations
//////////////////////////////////////////////////////////////

// Create a water mask layer, and set the image mask so that non-water areas
// are opaque.
var water_mask = occurrence.gt(90).unmask(0);

//////////////////////////////////////////////////////////////
// Initialize Map Location
//////////////////////////////////////////////////////////////

// Uncomment one of the following statements to center the map.
// Map.setCenter(-90.162, 29.8597, 10);   // New Orleans, USA
// Map.setCenter(-114.9774, 31.9254, 10); // Mouth of the Colorado River, Mexico
// Map.setCenter(-111.1871, 37.0963, 11); // Lake Powell, USA
// Map.setCenter(149.412, -35.0789, 11);  // Lake George, Australia
// Map.setCenter(105.26, 11.2134, 9);     // Mekong River Basin, SouthEast Asia
// Map.setCenter(90.6743, 22.7382, 10);   // Meghna River, Bangladesh
// Map.setCenter(81.2714, 16.5079, 11);   // Godavari River Basin Irrigation Project, India
// Map.setCenter(14.7035, 52.0985, 12);   // River Oder, Germany & Poland
// Map.setCenter(-59.1696, -33.8111, 9);  // Buenos Aires, Argentina
Map.setCenter(-74.4557, -8.4289, 11);  // Ucayali River, Peru

//////////////////////////////////////////////////////////////
// Map Layers
//////////////////////////////////////////////////////////////

Map.addLayer({
  eeObject: water_mask,
  visParams: VIS_WATER_MASK,
  name: '90% occurrence water mask',
  shown: false
});
Map.addLayer({
  eeObject: occurrence.updateMask(occurrence.divide(100)),
  name: 'Water Occurrence (1984-2015)',
  visParams: VIS_OCCURRENCE
});

En la siguiente sección, explorarás cómo cambió la presencia de agua con el paso del tiempo.