Mapas de relieve en R

Mapas de relieve en R

Cartografía Avanzada en R: Creando un Mapa de Relieve del Medio Oriente

La visualización de datos espaciales ha evolucionado más allá de simples polígonos planos. Hoy en día, integrar modelos de elevación digital (DEM) permite transformar un mapa estadístico en una pieza de narrativa geográfica. En este artículo, desglosaremos paso a paso cómo crear un mapa profesional del Golfo Pérsico utilizando R.

1. El Arsenal de Librerías

Para este proyecto, necesitamos una combinación de herramientas para datos vectoriales sf, datos ráster terra, descarga de elevación elevatr y refinamiento estético ggrepel.

library(tidyverse)
library(sf)
library(elevatr)
library(terra)
library(tidyterra)
library(rnaturalearth)
library(ggrepel)

2. Preparación de la Geometría y la sección del mapa a visualizar (bounding box).

El primer desafío es definir nuestra área de interés. No basta con seleccionar los países; para que el mapa se sienta “limpio”, debemos recortar los datos globales (como el océano) a un marco específico o Bounding Box.

# Definir países
paises_nombres <- c("Iran", "Qatar", "Saudi Arabia", "Yemen", "Israel", "Iraq", "Syria", "Turkey", "Oman", "Kuwait", "United Arab Emirates", "Jordan", "Lebanon", "Bahrain", "Palestine")

# Obtener geometrías y aplicar correcciones de nombres
world <- ne_countries(scale = "medium", returnclass = "sf")
paises_sf <- world %>% 
filter(name %in% paises_nombres) %>% 
mutate(name = ifelse(name=="United Arab Emirates", "U.A.E.", name))

# Crear límites de corte (Bounding Box)
bbox_paises <- st_bbox(paises_sf)

# Descargar y recortar el océano para evitar procesar datos mundiales innecesarios
ocean_sf <- ne_download(scale = "medium", type = "ocean", category = "physical", returnclass = "sf") %>%
st_crop(bbox_paises)

3. Extrayendo el Relieve (Ráster).

Usamos la función get_elev_raster. El parámetro z = 5 es el Zoom: un equilibrio perfecto para ver cadenas montañosas (como los Montes Zagros en Irán) sin que el archivo sea demasiado pesado. Luego, convertimos el resultado a formato terra para una compatibilidad total con ggplot2.

elev_data <- get_elev_raster(paises_sf, z = 5, clip = "locations")
elev_rast <- rast(elev_data)

4. Capas de Análisis: Fronteras e Interés.

Para un acabado profesional, calculamos los centroides de los países para ubicar las etiquetas y definimos puntos de interés específicos, como el Estrecho de Ormuz, utilizando coordenadas exactas.

# Ubicación de nombres de países
centroides <- paises_sf %>%
st_centroid() %>%
st_coordinates() %>%
as.data.frame() %>%
bind_cols(nombre = paises_sf$name)

# Punto de interés estratégico
puntos_interes <- data.frame(lon = 56.2, lat = 26.6, nombre = "Estrecho de\nOrmuz")

5. Construcción del Mapa con ggplot2.

La clave aquí es la superposición de capas. El orden es de la forma

  • Océano de fondo.
  • Ráster de elevación con una paleta hipsométrica (dem_print).
  • Líneas de países para dar estructura.
  • Etiquetas repelidas para evitar que los nombres se toquen entre sí.
plt <- ggplot() +
geom_sf(data = ocean_sf, fill = "#e0f3f8", color = NA) + #Layout 1: Ocean
geom_spatraster(data = elev_rast) + #Layout 2: Elevation
scale_fill_hypso_c(palette = "dem_print", name = "Elevación (m)",
    na.value = "transparent") + #Colors palette
geom_sf(data = paises_sf, fill = NA, color = "gray20", linewidth = 0.4) + #countries border
# Destacar el Estrecho de Ormuz
geom_point(data = puntos_interes, aes(x = lon, y = lat), fill = alpha("white", 0.1), color = "red", shape = 21, size = 5, stroke = 1.5) +
# Nombres de países con ggrepel
geom_text_repel(data = centroides, aes(x = X, y = Y, label = nombre),
                size = 3, fontface = "bold", color = "grey20", 
                box.padding = unit(0.2, "lines"),
                point.padding = unit(0.12, "lines"),
                force = 3) +
# Nombre estrecho Ormuz
geom_label(data = puntos_interes, aes(x = lon+3.8, y = lat+0.25, label = nombre), size = 2.2, fontface = "bold", color = "red", fill = alpha("white", 0.5), label.size = 0.2) +
# Configuración Mapa 
theme_minimal() +
labs(
    title = "Mapa Físico y Relieve: Golfo Pérsico",
    subtitle = "Señalización Estratégica del Estrecho de Ormuz",
    caption = "Datos: Natural Earth & SRTM vía elevatr") +
theme(panel.background = element_rect(fill = "#d0eef5", color = NA),
        plot.title = element_text(face = "bold", size = 14),
        axis.title = element_blank(),
        panel.grid = element_blank())

Resultados y Conclusión

El gráfico resultante es el siguiente

GCC_countries

Crear mapas en R permite un control total sobre la estética y la precisión de los datos. Al combinar capas vectoriales y ráster, logramos comunicar no solo dónde están las fronteras, sino cómo es la realidad física del territorio.

Tip Pro: Si quieres más detalle en las montañas, intenta subir el valor de z en get_elev_raster, ¡pero prepárate para un mayor tiempo de procesamiento!

Rubén Miranda Rubén Miranda Data curious!