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:
- agregar una capa de mapa para visualizar la presencia de agua superficial,
- mostrar cómo consultar los valores de la capa del mapa,
- agregar un estilo personalizado para mejorar la visualización
- crear una capa de máscara de agua binaria con un valor de umbral,
- centrar el mapa en partes interesantes del mundo y
- 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.
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.
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).
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.
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' });
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.