INTRODUCCIÓN

El acrónimo MODIS significa Moderate Resolution Imaging Spectroradiometer. Es un instrumento a bordo de los satélites Terra y Aqua, que orbitan toda la Tierra cada 1-2 días, adquiriendo datos a diferentes resoluciones espaciales. Como se ha señalado, los productos derivados de MODIS abordan un amplio conjunto de procesos terrerstres, atmosféricos y oceánicos. En el sitio web de MODIS se puede consultar una lista completa de los productos disponibles (https://modis.gsfc.nasa.gov/data/dataprod/).

OBTENCIÓN DE PRODUCTOS DE MODIS

Para el análisis de estos productos con R es necesario descargar primero estos productos, pero hay que tener en cuenta que originalmente están escritos en formato .hdf. Es un formato de archivo estandarizado para el almacenamiento de datos científicos. Desarrollado originalmente por el Centro Nacional de Aplicaciones de Supercomputación (NCSA), este formato de archivo se diseñó para soportar el almacenamiento y la organización de una gran cantidad de datos. Este tipo de formatos incluyen en un único fichero tanto los datos como los metadatos. Actualmente existen dos versiones, HDF4 (extensión .hdf) y el más moderno HDF5 (extensión *.hd5). Las escenas de MODIS están grabadas en el formato más antiguo.

Con el paquete MODIS

Una vez descargadas las imágenes vamos a utilizar los paquetes rgdal (Bivand et al. [2021]) que agrega la capacidad de leer un archivo en formato .hdf, y el paquete MODIS (Mattiuzzi and Detsch [2021]) que nos da acceso a la metadata, maneja los formatos de nombre de imágenes entre otros detalles prácticos. Luego de instalar ambos paquetes desde la consola, debe cargarlo en memoria (no olvidar agregar al inicio de su script):

Construimos un vector con los archivos que cumplan con el formato ‘hdf’ de nuestra carpeta de datos:

Usando la función MODIS::extractDate() se extrae la fecha de captura de los datos a partir del nombre de archivo.

Cada archivo hdf contiene al menos 13 capas de información. La función MODIS::getSds() proporciona una lista con los nombres propios de cada capa y la ruta completa para llegar al archivo *.hdf. Por definición la función procesa un hdf de cada vez, por lo que se utilizará el comando lapply():

Ahora tenemos estructurado por cada archivo las capas que contiene siguiendo el formato:

Los archivos son leídos directamente con la función readGDAL() y convertidos a formato ráster directamente:

Ahora podemos reescribir este comando R para cada imagen por cada cada capa (4×8) veces o escribir una función que facilite la tarea. Detalle de los componentes principales para definir nuestra función:

● leer <-: Es el nombre de la función y nombre que se utiliza para llamarla.

● function(img): Es una función que recibe un identificador de la imagen id de la lista imgs.

● f <- 0.0001: Para convertir los DN a ρ utilizamos el factor de escala presentado en el cuadro 8.1. Así el valor almacenado en cada ráster es la representación fiel de la energía recibida en cada píxel (ver 7.5.2).

● variable <- rast(readGDAL(imgs[[img]]$SDS4gdal[ID], silent = T)): Siguiendo el orden de capas del cuadro 8.1 cargamos en una variable el objeto SpatRaster creado. Se agrega el parámetro silent = T que nos ahorra ver un mensaje en pantalla por cada lectura realizada.

● s <- c(r,g,b,nir,swir1,swir2,swir3,qa): Concatenamos todas las capas en un modelo SpatRaster (que soporta múltiples capas o layers).

● names(s) <- c(‘r’,‘g’,‘b’,‘nir’,‘swir1’,‘swir2’,‘swir3’,‘qa’): Asignamos nombres propios a cada capa para fácil referencia.

● s: Al ser la última línea, es el objeto que regresa la función. Y todo integrado:

Y aplicamos nuestra función para leer los datos:

Hasta ahora hemos trabajado principalmente con objetos SpatRaster de una capa y para generar un mapa usamos el comando plot(), se define la paleta de colores, algunos otros parámetros y se genera la gráfica. Para los objetos SpatRaster multi capa existe la versión especializada plotRGB() que permite realizar un gráfico RGB basado en tres capas. Esas tres capas (que también podemos denominar bandas porque pueden representar diferentes anchos de banda en el espectro electromagnético) se combinan de manera que representan el canal rojo, verde y azul para formar imágenes en color.

● r: Índice o nombre de la capa que se usará para definir el canal rojo de la imagen.

● g: Índice o nombre de la capa que se usará para definir el canal verde de la imagen.

● b: Índice o nombre de la capa que se usará para definir el canal azul de la imagen.

● stretch: Se encarga de realizar ajustes de visualización (no modifica los valores internos del objeto) para aprovechar toda la escala de tonos de color en la imagen. Los valores permitidos son

lin: método lineal, donde el rango de ND (niveles digitales) se ajusta para ocupar todo el rango disponible (Figura 8.15). Por ejemplo, el rango 50 − 240 se extiende al rango 0 − 255 (ejemplo con 8 bit).

El segundo, hist: método histograma, donde los valores además de extenderlos al rango completo de valores (0 − 255 a 8 bit) proporcionalmente a su frecuencia, a mayor cantidad del valor digital, mayor rango de ND asignados (ver figura 8.16).

La sintaxis básica para crear una imagen en color verdadero es asignar por cada canal el color correspondiente:

O usar los nombres de capas para no tener que recordar el valor numérico de índice dentro del objeto Stack, por ejemplo:

La figura 8.17 muestra el resultado de la gráfica en color verdadero, en el canal r la banda 1 o ‘r’, en el canal g la banda 2 o ‘g’ y en el cañon b la banda 3 o ‘b’.

Guardamos en disco las imágenes descargadas y procesadas para el posterior uso en el tema de la combinación de bandas