Inundaciones (1984-2015)

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

En esta sección del instructivo, se hará 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 diseño personalizado para mejorar la visualización
  4. Crea una capa de máscara de agua binaria con un valor de umbral.
  5. Centrar el mapa en partes interesantes del mundo
  6. mostrar cómo refactorizar el script para que sea más legible y fácil de mantener

Cómo crear una visualización básica

Comienza por copiar las siguientes instrucciones 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 instrucción 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 instrucción selecciona una sola capa del conjunto de datos de GSW y la almacena en una variable llamada occurrence. La tercera instrucción agrega la imagen de ocurrencia al mapa interactivo del editor de código.

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

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

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

Cómo inspeccionar valores

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

Pestaña Inspector
Figura 2. Ejemplo de resultado 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 ocurrencia de agua superficial, que se normaliza en función de la variación estacional, como se describe en la Guía del usuario de datos (v2) .

Refactorización para mejorar tu código

Nuestro script solo contiene dos instrucciones, pero ya tenemos la oportunidad de refactorizar el código para que nuestro script final sea más fácil de leer y mantener con el tiempo. Actualmente, la instrucción 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" y abrir el documento de ayuda del método addLayer. (Para ver las combinaciones de teclas, selecciona el menú Help -> Shortcuts).

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 nuestro script 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 nombra la capa, podemos refactorizar el código para usar "argumentos con nombre" (eeObject y name) donde 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.

Cómo agregar 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 nueva instrucción que cree una variable VIS_OCCURRENCE y pásala como un 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 incorporació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.

Ocurrencia 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.

Ahora, las áreas de agua son azules. ¡Excelente!

Cómo crear una capa de umbral

La imagen de ocurrencia 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, a menudo es útil definir una capa de agua binaria (es decir, "agua" frente a "no agua") en función de un cierto 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, puedes usar las siguientes instrucciones, 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 diseño 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 previamente 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 instrucción antes de cualquier otra instrucción 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 río Paraná cerca de Buenos Aires.

Viajar a lugares interesantes del mundo

Es divertido explorar el mundo desplazándose y acercándose, pero el mundo es grande y, a veces, ayuda saltar directamente a una ubicación en particular. A continuación, se incluye una serie de declaraciones que proporcionan una pequeña muestra de ubicaciones interesantes en términos de agua superficial. Solo debes quitar el comentario de una de las instrucciones 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 los tuyos!

Refactorización, otra vez…

Antes de pasar a la siguiente capa del conjunto de datos de GSW, realizaremos 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 refactorizada final:

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 tiempo.