Cómo unir varios rasters en RStudio para ver paisajes extensos

Cien kilómetros por cien kilómetros: ese es el tamaño exacto de cada imagen que entrega el satélite Sentinel-2, un cuadrado casi perfecto calcado sobre el mapa. Con esa cantidad de terreno debería sobrar para cualquier paisaje que uno quiera mirar completo, pero el Jardín Botánico de la Universidad Austral de Chile, que es apenas una esquina verde dentro de Valdivia, me quedó dividido justo por la mitad entre dos archivos que en RStudio se negaban a hablarse. Ahí empezó mi problema con eso de unir rasters, y ahí también se me empezó a caer una idea que traía instalada sin darme cuenta: que ver un paisaje extenso en R es cosa de juntar fotos, como pegar dos postales una al lado de la otra.

Esa idea es el error de fondo que casi todos los que recién empiezan cargamos sin saberlo. Un raster no es una fotografía como cualquier otra: qué es exactamente y cómo se lee lo dejé explicado con calma en otro texto, porque acá el tema es distinto y viene después, cuando ya tienes dos (o diez) archivos y necesitas verlos como un solo paisaje sin que nada se corte a la mitad.

Por qué dos imágenes que se ven pegadas no se juntan solas en R

Antes de llegar al Jardín Botánico tuve un fracaso bastante tonto con esto. Descargué unas imágenes Landsat como archivos TIFF pensando que se iban a abrir con cualquier programa del computador, como una foto cualquiera, y terminé con una carpeta llena de archivos que ni el visor de imágenes reconocía. Tuve que aprender, a la mala, que ese tipo de datos necesita software especializado solo para poder mirarlos, mucho antes de siquiera pensar en unir nada. Como conté en aquel texto sobre por qué elegí RStudio para estudiar el bosque nativo chileno, no soy programadora, así que cada paso lo doy con el mismo cuidado con que uno camina por un humedal, tanteando dónde pisa.

Dos imágenes satelitales de Sentinel-2 sin unir mostradas por separado en RStudio antes del mosaico

Superado ese primer tropiezo, vino el segundo, y ese sí me costó entender: aunque dos imágenes de satélite se vean perfectamente alineadas a simple vista, R no las va a juntar solas si no comparten el mismo Sistema de Referencia de Coordenadas, el acuerdo que define cómo se traduce cada punto del terreno a números. Cómo arreglar una proyección torcida es tema para otro texto que ya escribí aparte. Lo que sí toca acá es lo que viene después: una vez que ambas imágenes por fin hablan el mismo idioma, hay que decidir con qué función pegarlas, y ninguno de los tutoriales que revisé al principio explicaba bien esa parte.

El mito del archivo gigante: mosaicos virtuales y el paquete terra

Otra idea instalada que me costó sacarme de la cabeza es que, para ver un paisaje grande, hay que fusionar todo en un único archivo .tif pesado y guardarlo así en el disco duro. Varios tutoriales básicos lo dicen tal cual: junta tus rasters y guarda el resultado completo. Lo probé una tarde y mi computador, que ya tiene sus años, se puso a hacer un ruido de ventilador que no le había escuchado nunca, procesando un mosaico de varios gigabytes que se demoraba una eternidad cada vez que quería hacer zoom.

Lo que de verdad funciona para una máquina modesta es armar un mosaico virtual, un VRT: un archivo liviano que le dice a R "estos archivos son en realidad uno solo, pero no los pegues todavía, solo muéstramelos juntos". El archivo pesado nunca se llega a crear en el disco duro, R procesa los datos bajo demanda cada vez que los necesita, y la memoria RAM deja de sufrir. Para este procesamiento uso el paquete terra, que reemplazó al antiguo paquete raster porque es más rápido y más liviano con la memoria; hay una lista más completa de paquetes de R para imágenes satelitales que dejé en otro texto, por si quieres comparar opciones.

merge() versus mosaic(): la diferencia que nadie te explica

El error que de verdad me hizo cerrar la laptop un fin de semana fue distinto a los anteriores. Con las dos imágenes ya en el mismo sistema de coordenadas, escribí el comando para unirlas, le di Enter y me fui a hacer otra cosa. Volví diez minutos después y me encontré con un texto rojo en la consola: "extents do not overlap". Casi me dio rabia: si yo las veía perfectamente una al lado de la otra en el explorador de archivos, ¿cómo que no se solapaban?

Mensaje de error extents do not overlap en la consola de RStudio al intentar unir dos rasters

Resultó que estaba usando merge(), una función más estricta que se enoja apenas hay unos metros de diferencia en los bordes. mosaic() es la alternativa más amable: permite decidir qué hacer justo en las zonas donde dos imágenes se solapan, por ejemplo promediar los valores de los píxeles para que la costura casi no se note. merge(), en cambio, pone una imagen literalmente encima de la otra, y a veces deja un salto de color bastante feo justo en la línea de unión. Si quieres partir con el pie derecho y evitarte este dolor de cabeza desde la descarga misma, dejé escrito cómo lo hago yo en cómo descargar imágenes Sentinel para procesar en RStudio fácilmente, porque ahí explico cómo elegir bien el área antes de que te pase esto.

Una amiga que rema kayak en el río Cruces los fines de semana me preguntó, cuando le mostré el mapa terminado, para qué servía tanto esfuerzo si al final se veía todo junto igual. Le expliqué que, con esos números ya unidos en un solo paisaje, uno puede después recortar solo el área exacta que le interesa usando un shapefile, algo que también dejé explicado en otro texto, o calcular índices como el NDVI (que sale de combinar distintas bandas espectrales, otro tema que dejo aparte) sin que el resultado se corte justo a la mitad del mapa. Meses después, cuando por fin calculé ese índice sobre el paisaje ya unido, me quedó grabada una imagen: un parche rojo apareció justo donde el sendero se abre en pleno verano, y ahí entendí que esos números correspondían a algo que yo ya había visto caminando, no solo a manchas de color en una pantalla.

Gente que hace modelado de distribución de especies necesita justo este tipo de paisaje sin costuras, porque sus modelos quedan mal si el mapa se corta a la mitad; ese tema lo dejo pendiente para otro momento. Todo este camino hacia la teledetección lo fui armando sola, sin programadora de por medio, a punta de ensayo y error los fines de semana, y esa parte más larga la cuento con calma en otro texto aparte.

Revisa esto antes de unir cualquier raster

Si te vas a meter en esto, ahórrate los tropiezos que yo tuve. Confirma primero que tus archivos abran con un programa pensado para datos satelitales, no con cualquier visor de fotos del computador. Revisa después que ambas imágenes compartan el mismo sistema de referencia de coordenadas antes de escribir una sola línea de código para unirlas. Y cuando llegue el momento de pegarlas, usa mosaic() en vez de merge() si quieres que la costura casi no se note, y arma un mosaico virtual en vez de guardar un archivo gigante si tu computador no es precisamente nuevo.

Ese fin de semana, cuando por fin vi el Jardín Botánico completo en la pantalla, sin la raya que me lo partía al medio, me acordé del clic seco del trackpad al guardar mi primer mapa, uno bastante más simple, verde sobre un fondo negro que por primera vez tenía sentido. La lluvia seguía cayendo afuera, como casi siempre en esta parte del año, pero esta vez el paisaje en la pantalla por fin quedó completo, sin costuras.

Artículos relacionados