En esta ocasión vamos a comentar cómo llevar a cabo una conversión masiva de imágenes Sentinel 2A a format tif en entorno R.
¿Dónde puedo encontrar imágenes Sentinel para su descarga?
Hace un tiempo os contamos cómo obtener imágenes digitales de satélite a través de varios geoportales y servicios web que los distintos proveedores (USGS, ESA, NOAA…) ponen a nuestra disposición.

A casi nadie en el ámbito de la geoinformación se le escapa el elevado potencial que este tipo de productos tiene. En este sentido la misión Landsat lleva ya varias décadas observando el planeta mediante las sucesivas misiones que han ido poniendo en órbita. Hace relativamente poco tiempo que la Agencia Espacial Europea se ha subido a este carro mediante la misión Sentinel y las sucesivas plataformas y sensores que componen dicha misión (Sentinel-1 y Sentinel-2A/B) cuyos datos se encuentran disponibles de manera través de la plataforma “Sentinels Scientific Data Hub”. Los Sentinel-2 fueron diseñados para liderar la demanda de imágenes terrestres a nivel mundial, mejorando la resolución espacial (hasta 10 metros) y el periodo de revisita (5 días combinando sentinel 2A y B).
El problema de las imágenes Sentinel
Hasta aquí todo estupendo, pero un vistazo rápido a los datos descargados nos revela una pequeña sorpresa, el formato de los datos. Las imágenes Sentinel se distribuyen en ficheros jp2, que no son compatibles con cualquier aplicación, siendo R y su librería “raster” que forma parte de casi cualquier script de procesado de imagen un caso en el que esto da problemas.
La solución habitual para poder trabajar con las imágenes Sentinel descargadas, pasa por convertir estos pj2 a Sentinel usando generalmente la Geospatial Data Abstraction Library (GDAL para los amigos) para hacer la conversión. Esta es precisamente la solución a nuestro problema dentro de R, llamar a paquete homólogo (rgdal) y convertir masivamente las imágenes. El objetivo es el de poder crear imágenes multibanda dentro de R (RasterStack) y poder trabajar esa información, hacer muestreos o extracciones masivas de información sirviéndonos de las herramientas habituales.

Aquí os dejo un script de ejemplo en el que veréis que me sirvo de herramientas para listar ficheros y de la función readGDAL(), función que, para entendernos, es el equivalente a readOGR() que quizás conozcáis o hayáis usado para leer capas vectoriales.
library(rgdal)
library(raster)
library(tools)
setwd('rutaDirectorioRaiz')
#Nombre de la carpeta de destino de los ficheros tif
carpetaTif <- 'nombreCarpeta/'
#Lista con los ficheros originales en formato jp2
lista.jp2 <- list.files('carpetajp2',pattern='.jp2',full.names=TRUE)
#Bucle para recorrer la lista de ficheros jp2 que queremos convertir
for(jp2 in lista.jp2){
#Leemos el fichero jp2. Esta función es bastante potente https://www.rdocumentation.org/packages/rgdal/versions/1.2-18/topics/readGDAL
r <- raster(readGDAL(i))
outRaster <- file_path_sans_ext(basename(i))
#Exportamos el fichero jp2 a tif
#En este punto se podria incluir cualquier funcion de reproyectado, recorte, remuestreo...
writeRaster(paste(carpetaTif,outRaster,'.tif',sep=''),r,overwrite = TRUE)
}
Si quieres aprender más sobre programación aplicada en entorno de R, pégale un vistazo a mi Curso de Análisis Espacial con R donde verás ejemplos de este tipo y mucho más para lograr potenciar tus habilidades geomáticas al máximo.
Autor : Marcos Rodrigues
En el bucle hay un error, debería ser for ( i in lista.jp2)
ERROR:
> for(jp2 in lista.jp2){
+ r <- raster(readGDAL(i))
+ outRaster
Hola Sergio Morell
Junto con saludar y esperando que todo este bien en tiempos tan complejos, queria consultar si pudiste encontrar el error en el codigo? No me resulta el proceso. No me queda muy claro la parte final, cuando ejecutan un bucle.
Si pudieras ayudarme, estaría muy agradecido
Saludos
Hola, puede que exista un error en el código de este ejemplo, o puede que sea error mio. Estoy tratando de replicar este código con mis propios datos y recibo el siguiente error:
library(rgdal)
library(raster)
library(tools)
# Directorio que contiene mis archivos .jp2
setwd(«D:/list_test»)
path <- "D:/list_test"
#Nombre de la carpeta de destino de los ficheros tif
carpetaTif <- "D:/list_test"
#Lista con los ficheros originales en formato jp2
lista.jp2 <- list.files(path = path, pattern='.jp2', full.names=TRUE)
#Bucle para recorrer la lista de ficheros jp2 que queremos convertir
for(jp2 in lista.jp2){
r <- raster(readGDAL(i))
outRaster for(jp2 in lista.jp2){
+ r <- raster(readGDAL(i))
+ outRaster
Gracias,
Sergio.
Hola, puede que exista un error en el código de este ejemplo, o puede que sea error mio. Estoy tratando de replicar este código con mis propios datos y recibo el siguiente error:
library(rgdal)
library(raster)
library(tools)
# Directorio que contiene mis archivos .jp2
setwd(«D:/list_test»)
path <- "D:/list_test"
#Nombre de la carpeta de destino de los ficheros tif
carpetaTif <- "D:/list_test"
#Lista con los ficheros originales en formato jp2
lista.jp2 <- list.files(path = path, pattern='.jp2', full.names=TRUE)
#Bucle para recorrer la lista de ficheros jp2 que queremos convertir
for(jp2 in lista.jp2){
r <- raster(readGDAL(i))
outRaster for(jp2 in lista.jp2){
+ r <- raster(readGDAL(i))
+ outRaster
Gracias,
Sergio.
Hola Sergio,
Revisamos el código y te decimos algo, gracias por avisar!!
Un saludo.
Hola
Junto con saludar y agradeciendo por el excelente material que uds desarrollan.
Quisiera consultar, si hay algún error en el codigo, da error en la ultima parte del bucle(Error in basename(i) : object ‘i’ not found), no lo entiendo muy bien.
Si pudieran ayudarme estaría muy agradecido
Saludos