1. Introducción

Este cuaderno presenta el procedimiento para calcular atributos geomorfométricos del terreno a partir de un Modelo Digital de Elevación (MDE). Estos atributos permiten analizar características del relieve como la pendiente y la orientación del terreno, variables importantes para estudios agrícolas, ambientales y territoriales.

Para el cálculo de estos atributos se utilizará la librería MultiscaleDTM en R, una herramienta que permite obtener información del terreno a partir de datos de elevación.

Durante el desarrollo del cuaderno se explicará el proceso de lectura y procesamiento de los datos, las funciones utilizadas y la interpretación de los resultados obtenidos.

2. Configuración del entorno

Antes de iniciar el procesamiento de los datos, es necesario preparar el entorno de trabajo mediante la instalación y carga de las librerías requeridas. Estas herramientas contienen funciones específicas para la manipulación de información espacial, el procesamiento de modelos digitales de elevación y el cálculo de atributos geomorfométricos del terreno.

2.1 Limpieza del entorno de trabajo

La función rm(list = ls()) permite eliminar todos los objetos almacenados en la memoria temporal de R. Esta práctica permite iniciar el análisis en un entorno limpio, evitando posibles conflictos con objetos generados durante sesiones anteriores.

rm(list=ls())

2.2 Librerías utilizadas

En este cuaderno se emplean diferentes librerías de R para la lectura, procesamiento y visualización de información espacial.

La librería elevatr permite obtener Modelos Digitales de Elevación (MDE) a partir de fuentes de datos disponibles en línea.

La librería sf facilita la lectura, transformación y manipulación de datos espaciales vectoriales, como límites administrativos o capas de polígonos.

La librería terra proporciona herramientas para trabajar con datos ráster, permitiendo realizar operaciones como lectura, transformación, recorte y análisis de Modelos Digitales de Elevación.

La librería leaflet permite generar mapas interactivos para visualizar información espacial y los resultados obtenidos durante el análisis.

La librería MultiscaleDTM contiene las funciones necesarias para calcular atributos geomorfométricos del terreno, como pendiente y orientación, a partir de datos de elevación.

La librería exactextractr permite realizar cálculos estadísticos sobre valores ráster dentro de zonas definidas por capas vectoriales, facilitando el análisis espacial por áreas.

2.3 Instalación y carga de librerías

Si las librerías no están instaladas, se pueden instalar utilizando la función install.packages() desde la consola de R. Este procedimiento solo es necesario realizarlo la primera vez que se utilizan estos paquetes en el equipo.

# install.packages("elevatr")
# install.packages("sf")
# install.packages("leaflet")
# install.packages("terra")
# install.packages("MultiscaleDTM")
# install.packages("exactextractr")

Una vez instaladas las librerías, estas deben ser cargadas al entorno de trabajo mediante la función library(). Esta función permite activar los paquetes y utilizar las funciones que contienen durante el desarrollo del análisis.

library(elevatr)
## elevatr v0.99.0 NOTE: Version 0.99.0 of 'elevatr' uses 'sf' and 'terra'.  Use 
## of the 'sp', 'raster', and underlying 'rgdal' packages by 'elevatr' is being 
## deprecated; however, get_elev_raster continues to return a RasterLayer.  This 
## will be dropped in future versions, so please plan accordingly.
library(sf)
## Linking to GEOS 3.14.1, GDAL 3.12.1, PROJ 9.7.1; sf_use_s2() is TRUE
library(leaflet)
library(terra)
## terra 1.9.34
library(MultiscaleDTM)
library(exactextractr)

3. Introducción a MultiscaleDTM

La librería MultiscaleDTM permite calcular atributos geomorfométricos del terreno a partir de Modelos Digitales de Elevación (MDE). Estos modelos representan la variación espacial de la elevación del terreno mediante una estructura de datos ráster.

Los atributos geomorfométricos permiten describir características del relieve, como la pendiente y la orientación del terreno, a partir del análisis de los valores de elevación. Para su cálculo, la librería utiliza ventanas de análisis definidas por el usuario, permitiendo evaluar las características del terreno a diferentes escalas espaciales.

En este cuaderno se empleará MultiscaleDTM para obtener información del relieve del área de estudio, la cual posteriormente será utilizada para realizar análisis espaciales y representaciones cartográficas.

4. Lectura de datos de entrada

Para iniciar el análisis geomorfométrico, es necesario cargar los datos espaciales que serán utilizados como información base. En este caso, se empleará un Modelo Digital de Elevación (MDE), el cual representa la distribución espacial de la altura del terreno mediante una estructura de datos ráster.

El Modelo Digital de Elevación utilizado en este cuaderno fue obtenido previamente y contiene información de elevación del área de estudio. Además, se utilizará una capa vectorial con los límites administrativos del departamento, la cual permitirá delimitar espacialmente el análisis.

4.1 Lectura del Modelo Digital de Elevación (MDE)

La librería terra permite trabajar con datos ráster en R. La función rast() se utiliza para importar el Modelo Digital de Elevación y convertirlo en un objeto espacial que puede ser procesado dentro del entorno de R.

(dem = terra::rast("D:/Geomatica Basica (Gr 2)/GB2/Proyecto2/datos/choco_elevacion_z10.tif"))
## class       : SpatRaster
## size        : 7159, 3602, 1  (nrow, ncol, nlyr)
## resolution  : 0.0006831505, 0.0006831505  (x, y)
## extent      : -78.39844, -75.93773, 3.86412, 8.754795  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source      : choco_elevacion_z10.tif
## name        : file24f841544e7f
## min value   :            -4485
## max value   :             4730

El resultado muestra las principales características del Modelo Digital de Elevación, incluyendo el número de filas y columnas, la resolución espacial, el sistema de coordenadas, la extensión del área representada y los valores mínimos y máximos de elevación.

4.2 Reducción de resolución del Modelo Digital de Elevación

Los Modelos Digitales de Elevación pueden contener una gran cantidad de información espacial, lo que puede aumentar el consumo de memoria durante los cálculos posteriores. Por esta razón, se realiza una reducción de resolución mediante la función aggregate().

Esta función permite agrupar celdas vecinas del ráster y calcular un nuevo valor representativo. En este caso se utiliza el promedio (mean) de las celdas agrupadas para conservar una representación general del relieve.

dem2 = terra::aggregate(dem, 2, "mean")
## |---------|---------|---------|---------|=========================================                                          

4.3 Lectura de información espacial vectorial

Además del Modelo Digital de Elevación, se requiere la capa de límites administrativos del área de estudio. Para esto se utiliza la librería sf, la cual permite trabajar con datos espaciales vectoriales como puntos, líneas y polígonos.

La función st_read() permite importar archivos espaciales en diferentes formatos, como GeoPackage (.gpkg), que contiene la información de los municipios del departamento.

(munic <- sf::st_read("D:/Geomatica Basica (Gr 2)/GB2/Proyecto2/datos/choco_municipios.gpkg"))
## Reading layer `municipios' from data source 
##   `D:\Geomatica Basica (Gr 2)\GB2\Proyecto2\datos\choco_municipios.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 21 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -78.31375 ymin: 3.992801 xmax: -76.0173 ymax: 8.658194
## Geodetic CRS:  WGS 84

El resultado muestra la estructura de la capa vectorial, incluyendo el número de entidades espaciales, el tipo de geometría, el sistema de referencia de coordenadas y los atributos asociados a cada municipio.

4.4 Recorte del Modelo Digital de Elevación

Como el Modelo Digital de Elevación puede abarcar un área mayor a la zona de estudio, se realiza un recorte utilizando los límites administrativos del departamento.

La función crop() permite delimitar la extensión espacial del ráster, mientras que el argumento mask = TRUE elimina los valores que se encuentran fuera de los polígonos definidos en la capa vectorial.

dem3 = terra::crop(dem2, munic, mask = TRUE)

El resultado corresponde a un Modelo Digital de Elevación ajustado únicamente al área de estudio, el cual será utilizado posteriormente para calcular los atributos geomorfométricos del terreno.

5. Transformación de coordenadas

Para calcular atributos geomorfométricos del terreno, el Modelo Digital de Elevación debe estar expresado en un sistema de coordenadas planas. Esto se debe a que los cálculos relacionados con distancia, pendiente y análisis espacial requieren unidades métricas, como metros, en lugar de coordenadas geográficas expresadas en grados.

En Colombia, el Instituto Geográfico Agustín Codazzi (IGAC) estableció desde 2020 el sistema de coordenadas planas con origen único nacional, identificado mediante el código EPSG:9377 (MAGNA-SIRGAS / Origen-Nacional).

Por esta razón, tanto el Modelo Digital de Elevación como la capa vectorial de municipios serán transformados a este sistema de referencia antes de realizar los cálculos geomorfométricos.

5.1 Transformación del Modelo Digital de Elevación

La función project() de la librería terra permite transformar objetos ráster entre diferentes sistemas de referencia de coordenadas.

En este caso, el Modelo Digital de Elevación recortado (dem3) será transformado al sistema de coordenadas nacional colombiano mediante el código EPSG:9377.

(dem_plane = terra::project(dem3, "EPSG:9377"))
## class       : SpatRaster
## size        : 3428, 1708, 1  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## name        : file24f841544e7f
## min value   :      -557.542725
## max value   :      3357.431641

El resultado corresponde al Modelo Digital de Elevación expresado en coordenadas planas, donde las unidades espaciales están representadas en metros. Este formato permite realizar posteriormente cálculos relacionados con las características del relieve.

5.2 Transformación de la capa vectorial

La capa de municipios también debe transformarse al mismo sistema de coordenadas para mantener la compatibilidad espacial con el Modelo Digital de Elevación.

La función st_transform() de la librería sf permite realizar esta conversión en objetos vectoriales.

(munic_plane = sf::st_transform(munic, "EPSG:9377"))

El resultado corresponde a la capa de municipios del departamento de Chocó transformada al sistema MAGNA-SIRGAS / Origen-Nacional, manteniendo sus atributos originales y modificando únicamente la referencia espacial de sus geometrías.

6. Cálculo de atributos geomorfométricos del terreno

Los atributos geomorfométricos permiten describir las características del relieve a partir de un Modelo Digital de Elevación. En este caso, se calcularán dos variables principales: la pendiente (slope) y la orientación del terreno (aspect).

La pendiente representa el grado de inclinación del terreno y permite identificar zonas con mayor o menor inclinación. Por otro lado, la orientación indica la dirección hacia la cual está inclinada una superficie del terreno, expresada generalmente en grados azimutales.

Para calcular estos atributos se utilizará la función SlpAsp() de la librería MultiscaleDTM. Esta función permite obtener información del relieve mediante ventanas de análisis definidas por el usuario.

Antes de utilizar esta función, se puede consultar su documentación desde la consola de R mediante:

?SlpAsp

Esta consulta permite conocer los argumentos disponibles y la forma correcta de utilizar la función.

6.1 Cálculo de pendiente y orientación del terreno

La función SlpAsp() recibe como entrada el Modelo Digital de Elevación en coordenadas planas y genera un nuevo objeto ráster con los atributos geomorfométricos seleccionados.

El argumento w define el tamaño de la ventana utilizada para el cálculo. En este caso se utiliza una ventana de 3 x 3 celdas, donde cada celda considera la relación con sus vecinos inmediatos.

El argumento method indica la forma en que se consideran las celdas vecinas durante el análisis. El método "queen" incluye las ocho celdas que rodean la celda central, incluyendo vecinos diagonales.

(slp_asp = MultiscaleDTM::SlpAsp(
  dem_plane,
  w = c(3, 3),
  unit = "degrees",
  method = "queen",
  metrics = c("slope", "aspect"),
  na.rm = TRUE,
  include_scale = FALSE,
  mask_aspect = TRUE
))
## class       : SpatRaster
## size        : 3428, 1708, 2  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## names       :     slope,     aspect
## min values  :         0,          0
## max values  : 72.253799, 359.999988

El resultado corresponde a un objeto ráster con dos capas: una correspondiente a la pendiente (slope) y otra a la orientación del terreno (aspect).

6.2 Separación de capas de pendiente y orientación

Debido a que el objeto generado contiene dos variables diferentes, se separan sus capas para analizarlas individualmente.

Capa 1: Pendiente del terreno

La primera capa corresponde a la pendiente expresada en grados.

(slope = subset(slp_asp, 1))
## class       : SpatRaster
## size        : 3428, 1708, 1  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## name        :     slope
## min value   :         0
## max value   : 72.253799

El histograma permite observar la distribución de los valores de pendiente dentro del área de estudio.

terra::hist(
  slope,
  main = "Pendiente del terreno - Chocó",
  xlab = "Pendiente (grados)"
)
## Warning: [hist] a sample of 17% of the cells was used (of which 66% was NA)

Capa 2: Orientación del terreno

La segunda capa corresponde al aspecto o dirección de la pendiente. Sus valores representan ángulos entre 0 y 360 grados.

(aspect = subset(slp_asp, 2))
## class       : SpatRaster
## size        : 3428, 1708, 1  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## name        :     aspect
## min value   :          0
## max value   : 359.999988

La distribución de los valores de orientación se puede observar mediante un histograma.

terra::hist(
  aspect,
  main = "Orientación del terreno - Chocó",
  xlab = "Orientación (grados)"
)
## Warning: [hist] a sample of 17% of the cells was used (of which 66% was NA)

6.3 Conversión de pendiente en grados a porcentaje

En algunos análisis agrícolas, la pendiente suele expresarse como porcentaje debido a su utilidad para clasificar limitaciones del terreno y evaluar condiciones de manejo.

La conversión se realiza mediante la relación trigonométrica entre grados y porcentaje de pendiente:

Pendiente (%) = tan(pendiente en grados) × 100

(slope_perc = tan(slope * (pi / 180)) * 100)
## class       : SpatRaster
## size        : 3428, 1708, 1  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## name        :      slope
## min value   :          0
## max value   : 312.471258

El resultado corresponde a un ráster con los valores de pendiente expresados en porcentaje.

Finalmente, se visualiza la distribución de la pendiente porcentual:

terra::hist(
  slope_perc,
  main = "Pendiente del terreno - Chocó",
  xlab = "Pendiente (%)"
)
## Warning: [hist] a sample of 17% of the cells was used (of which 66% was NA)

7. Cálculo de estadísticas zonales

Las estadísticas zonales permiten calcular valores estadísticos de un ráster dentro de zonas definidas por una capa vectorial. En este caso, se calcularán estadísticas relacionadas con la pendiente del terreno para cada municipio del departamento del Chocó.

Para este análisis se utilizará como ráster de entrada la pendiente expresada en porcentaje (slope_perc) y como unidades espaciales de análisis los límites municipales del departamento (munic_plane).

Este procedimiento permite resumir la información del relieve dentro de diferentes unidades administrativas, facilitando la comparación espacial de las condiciones del terreno.

Antes de calcular las estadísticas zonales, se realizará una reclasificación de la pendiente utilizando rangos definidos para fines de interpretación agrológica. Esta transformación permite convertir valores continuos de pendiente en categorías discretas.

7.1 Reclasificación de la pendiente del terreno

La reclasificación consiste en transformar los valores originales de pendiente en categorías según intervalos establecidos.

Para realizar este procedimiento se utiliza la función classify() del paquete terra, la cual permite asignar nuevos valores a las celdas del ráster mediante una matriz de clasificación.

En este caso, se establecen siete categorías de pendiente:

m <- c(0, 3, 1,
       3, 7, 2,
       7, 12, 3,
       12, 25, 4,
       25, 50, 5,
       50, 75, 6,
       75, 160, 7)

m <- matrix(m, ncol = 3, byrow = TRUE)

rc <- terra::classify(
  slope_perc,
  m,
  right = TRUE
)

rc
## class       : SpatRaster
## size        : 3428, 1708, 1  (nrow, ncol, nlyr)
## resolution  : 151.3892, 151.3892  (x, y)
## extent      : 4409533, 4668105, 1999816, 2518778  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s)   : memory
## name        :      slope
## min value   :          0
## max value   : 312.471258

El resultado corresponde a un ráster reclasificado donde cada píxel contiene un valor entre 1 y 7, representando una categoría de pendiente.

7.2 Cálculo de pendiente promedio por municipio

Para obtener la pendiente promedio dentro de cada municipio se utiliza la función exact_extract() de la librería exactextractr.

Esta función permite extraer los valores de un ráster dentro de zonas definidas por polígonos y calcular estadísticas espaciales. En este caso se utiliza el estadístico mean, que calcula el promedio de los valores de pendiente dentro de cada municipio.

(munic_plane$mean_slope <- exactextractr::exact_extract(
  slope_perc,
  munic_plane,
  "mean"
))
##   |                                                                              |                                                                      |   0%  |                                                                              |===                                                                   |   5%  |                                                                              |=======                                                               |  10%  |                                                                              |==========                                                            |  14%  |                                                                              |=============                                                         |  19%  |                                                                              |=================                                                     |  24%  |                                                                              |====================                                                  |  29%  |                                                                              |=======================                                               |  33%  |                                                                              |===========================                                           |  38%  |                                                                              |==============================                                        |  43%  |                                                                              |=================================                                     |  48%  |                                                                              |=====================================                                 |  52%  |                                                                              |========================================                              |  57%  |                                                                              |===========================================                           |  62%  |                                                                              |===============================================                       |  67%  |                                                                              |==================================================                    |  71%  |                                                                              |=====================================================                 |  76%  |                                                                              |=========================================================             |  81%  |                                                                              |============================================================          |  86%  |                                                                              |===============================================================       |  90%  |                                                                              |===================================================================   |  95%  |                                                                              |======================================================================| 100%
##  [1] 15.981379 11.751951 21.737087 18.404886  8.334066 10.685177 17.875463
##  [8]  4.034113 30.604048  6.475112  3.555907 13.385941 11.799151 17.161459
## [15] 14.845737  9.609946  6.621727 35.351330 20.810368  6.849749 10.345535

El resultado corresponde al valor promedio de pendiente para cada municipio del departamento del Chocó.

La distribución de estos valores puede observarse mediante un histograma:

terra::hist(
  munic_plane$mean_slope,
  main = "Pendiente promedio municipal - Chocó",
  xlab = "Pendiente (%)"
)

El histograma permite identificar la variabilidad de la pendiente promedio entre los municipios analizados.

7.3 Cálculo de la categoría dominante de pendiente

Además de la pendiente promedio, se calcula la categoría de pendiente predominante en cada municipio.

Para esto se utiliza nuevamente exact_extract(), empleando el estadístico mode, el cual identifica la categoría que aparece con mayor frecuencia dentro de cada polígono municipal.

(munic_plane$class <- exactextractr::exact_extract(
  rc,
  munic_plane,
  "mode"
))
##   |                                                                              |                                                                      |   0%  |                                                                              |===                                                                   |   5%  |                                                                              |=======                                                               |  10%  |                                                                              |==========                                                            |  14%  |                                                                              |=============                                                         |  19%  |                                                                              |=================                                                     |  24%  |                                                                              |====================                                                  |  29%  |                                                                              |=======================                                               |  33%  |                                                                              |===========================                                           |  38%  |                                                                              |==============================                                        |  43%  |                                                                              |=================================                                     |  48%  |                                                                              |=====================================                                 |  52%  |                                                                              |========================================                              |  57%  |                                                                              |===========================================                           |  62%  |                                                                              |===============================================                       |  67%  |                                                                              |==================================================                    |  71%  |                                                                              |=====================================================                 |  76%  |                                                                              |=========================================================             |  81%  |                                                                              |============================================================          |  86%  |                                                                              |===============================================================       |  90%  |                                                                              |===================================================================   |  95%  |                                                                              |======================================================================| 100%
##  [1] 4 4 4 4 2 1 4 1 5 1 1 4 2 1 4 1 1 5 5 2 1

El resultado corresponde a la categoría de pendiente dominante para cada municipio.

La distribución de las categorías obtenidas se representa mediante un histograma:

terra::hist(
  munic_plane$class,
  main = "Clasificación de pendiente municipal - Chocó",
  xlab = "Categoría de pendiente"
)

Este gráfico permite identificar cuáles categorías de pendiente tienen mayor presencia dentro del departamento.

7.4 Transformación de resultados a coordenadas geográficas

Los cálculos geomorfométricos se realizaron utilizando el sistema de coordenadas proyectadas MAGNA-SIRGAS / Origen-Nacional (EPSG:9377), debido a que trabaja con unidades métricas adecuadas para análisis espaciales.

Para facilitar la visualización cartográfica, los resultados se transforman nuevamente al sistema de coordenadas geográficas WGS84 (EPSG:4326).

Pendiente reclasificada

(rc.geo <- terra::project(
  rc,
  "EPSG:4326"
))
## class       : SpatRaster
## size        : 3441, 1736, 1  (nrow, ncol, nlyr)
## resolution  : 0.001366274, 0.001366274  (x, y)
## extent      : -78.36174, -75.98989, 3.981535, 8.682884  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s)   : memory
## name        :      slope
## min value   :          0
## max value   : 305.687195

Pendiente porcentual

(slope.geo <- terra::project(
  slope_perc,
  "EPSG:4326"
))
## class       : SpatRaster
## size        : 3441, 1736, 1  (nrow, ncol, nlyr)
## resolution  : 0.001366274, 0.001366274  (x, y)
## extent      : -78.36174, -75.98989, 3.981535, 8.682884  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s)   : memory
## name        :      slope
## min value   :          0
## max value   : 305.687195

Los objetos generados podrán utilizarse posteriormente para la representación cartográfica de la pendiente y sus categorías dentro del departamento del Chocó.

8. Representación cartográfica de la pendiente del terreno

La visualización espacial permite interpretar la distribución de la pendiente dentro del área de estudio. En este caso, se utilizará una representación interactiva mediante la librería leaflet, combinando la información ráster de pendiente con los límites municipales del departamento del Chocó.

Para mejorar la interpretación del mapa, se utilizará una escala de colores donde los valores bajos de pendiente tendrán colores asociados a terrenos más planos y los valores altos representarán zonas con mayor inclinación.

8.1 Creación de la escala de colores para pendiente

La función colorNumeric() permite generar una paleta continua de colores basada en los valores presentes en el ráster de pendiente.

En este caso, la escala se construye utilizando los valores de slope.geo, que corresponde al ráster de pendiente expresado en porcentaje y transformado nuevamente a coordenadas geográficas.

palredgreen <- colorNumeric(
  c("darkseagreen3", "yellow2", "orange", "brown2", "darkred"),
  values(slope.geo),
  na.color = "transparent"
)

La paleta generada será utilizada posteriormente para representar espacialmente la variación de la pendiente dentro del departamento.

8.2 Visualización interactiva de la pendiente del terreno

El siguiente código genera un mapa interactivo utilizando la función leaflet().

El mapa incorpora tres elementos principales:

  • Los límites municipales del Chocó mediante la capa vectorial munic.
  • El ráster de pendiente (slope.geo) como capa continua de información.
  • Una ventana emergente (popup) que permite consultar el nombre del municipio y la clase de pendiente predominante obtenida anteriormente.
leaflet(munic) %>% 
  addTiles() %>% 
  setView(-76.7, 5.5, 7) %>% 
  addPolygons(
    color = "gray",
    weight = 1.0,
    smoothFactor = 0.5,
    opacity = 0.4,
    fillOpacity = 0.10,
    popup = paste(
      "Municipio: ", munic$NAME_2, "<br>",
      "Clase de pendiente: ", munic$class, "<br>"
    )
  ) %>% 
  addRasterImage(
    slope.geo,
    colors = palredgreen,
    opacity = 0.8
  ) %>% 
  addLegend(
    pal = palredgreen,
    values = values(slope.geo),
    title = "Pendiente del terreno (%)"
  )

El resultado corresponde a un mapa interactivo donde es posible explorar la distribución espacial de la pendiente en el departamento del Chocó.

Al seleccionar diferentes municipios, se pueden consultar sus nombres y la categoría de pendiente predominante calculada mediante las estadísticas zonales.

9. Visualización alternativa de la pendiente del terreno

En esta sección se realizará una visualización alternativa de la pendiente del terreno expresada en grados. A diferencia del mapa anterior, donde se representó la pendiente porcentual mediante un ráster clasificado, en este caso se utilizará la pendiente continua en grados y se incorporarán etiquetas con información de cada municipio.

Las etiquetas permitirán identificar el nombre del municipio y su valor promedio de pendiente, facilitando la comparación espacial de las características del relieve dentro del área de estudio.

9.1 Cálculo de pendiente promedio por municipio

Antes de generar la visualización, se calcula nuevamente la pendiente promedio dentro de cada municipio utilizando la función exact_extract() de la librería exactextractr.

El resultado se convierte a valores numéricos para facilitar su representación y posterior uso en etiquetas.

munic$mean_slope <- as.numeric(
  exactextractr::exact_extract(slope, munic, "mean")
)
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG: 9377) .
## To avoid on-the-fly coordinate transformation, ensure that st_crs() returns the
## same result for both raster and polygon inputs.
##   |                                                                              |                                                                      |   0%  |                                                                              |===                                                                   |   5%  |                                                                              |=======                                                               |  10%  |                                                                              |==========                                                            |  14%  |                                                                              |=============                                                         |  19%  |                                                                              |=================                                                     |  24%  |                                                                              |====================                                                  |  29%  |                                                                              |=======================                                               |  33%  |                                                                              |===========================                                           |  38%  |                                                                              |==============================                                        |  43%  |                                                                              |=================================                                     |  48%  |                                                                              |=====================================                                 |  52%  |                                                                              |========================================                              |  57%  |                                                                              |===========================================                           |  62%  |                                                                              |===============================================                       |  67%  |                                                                              |==================================================                    |  71%  |                                                                              |=====================================================                 |  76%  |                                                                              |=========================================================             |  81%  |                                                                              |============================================================          |  86%  |                                                                              |===============================================================       |  90%  |                                                                              |===================================================================   |  95%  |                                                                              |======================================================================| 100%
head(munic$mean_slope)
## [1]  8.924997  6.659601 11.888342 10.255521  4.712492  6.025116

9.2 Creación de etiquetas municipales

Para mostrar la información sobre el mapa, se crean etiquetas que contienen el nombre del municipio y la pendiente promedio calculada.

labels <- paste(
  "Municipio:", munic$NAME_2,
  "<br>",
  "Pendiente media:", round(munic$mean_slope, 2),
  "°"
)

Estas etiquetas serán utilizadas posteriormente para identificar cada municipio dentro de la visualización interactiva.

9.3 Visualización de pendiente en grados

Se genera un mapa interactivo utilizando la pendiente expresada en grados (slope) y la capa de municipios como referencia espacial.

pal_slope_deg <- colorNumeric(
  c("darkseagreen3", "yellow2", "orange", "brown2", "darkred"),
  values(slope),
  na.color = "transparent"
)

leaflet(munic) %>% 
  addTiles() %>% 
  setView(-77.0, 5.5, 7) %>% 
  addPolygons(
    color = "gray",
    weight = 1,
    smoothFactor = 0.5,
    opacity = 0.4,
    fillOpacity = 0.10,
    popup = paste(
      "Municipio: ", munic$NAME_2, "<br>",
      "Slope class: ", munic$class, "<br>",
      "Mean slope: ", round(munic$mean_slope, 2), "°"
    ),
    label = paste(
      munic$NAME_2,
      "<br>",
      "Pendiente media: ",
      round(munic$mean_slope, 2),
      "°"
    )
  ) %>% 
  addRasterImage(
    slope,
    colors = pal_slope_deg,
    opacity = 0.8
  ) %>% 
  addLegend(
    pal = pal_slope_deg,
    values = values(slope),
    title = "Pendiente del terreno (°)"
  )

La visualización obtenida permite observar la variación espacial de la pendiente del terreno en grados. Las etiquetas muestran la pendiente promedio de cada municipio, permitiendo relacionar las características del relieve con la distribución territorial del departamento.

10. Visualización de la orientación del terreno

La orientación del terreno (aspect) representa la dirección hacia la cual está inclinada una superficie del terreno. Esta variable se expresa en grados azimutales, donde los valores indican direcciones entre 0° y 360°.

La representación cartográfica de esta variable permite identificar la distribución espacial de las diferentes orientaciones del relieve dentro del área de estudio. Esta información puede ser útil en análisis agrícolas debido a su relación con factores como la radiación solar recibida, la humedad del suelo y las condiciones microclimáticas del terreno.

Para visualizar la orientación del terreno se utilizará una escala de colores que permita diferenciar las diferentes direcciones del relieve.

10.1 Preparación de la capa de orientación para visualización

Debido al tamaño del ráster generado, se realiza una reducción de resolución únicamente para facilitar su representación mediante mapas interactivos. Este procedimiento no modifica los valores calculados previamente, solamente permite una visualización más eficiente.

# Transformar orientación del terreno a coordenadas geográficas

(aspect.geo = project(aspect, "EPSG:4326"))
## class       : SpatRaster
## size        : 3441, 1736, 1  (nrow, ncol, nlyr)
## resolution  : 0.001366274, 0.001366274  (x, y)
## extent      : -78.36174, -75.98989, 3.981535, 8.682884  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s)   : memory
## name        :     aspect
## min value   :   0.329967
## max value   : 359.724945
# Reducir resolución del ráster para visualización

aspect_view <- terra::aggregate(
  aspect.geo,
  fact = 2,
  fun = "mean"
)
## |---------|---------|---------|---------|=========================================                                          
aspect_view
## class       : SpatRaster
## size        : 1721, 868, 1  (nrow, ncol, nlyr)
## resolution  : 0.002732548, 0.002732548  (x, y)
## extent      : -78.36174, -75.98989, 3.980169, 8.682884  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s)   : memory
## name        :    aspect
## min value   :   3.75221
## max value   : 357.09465

10.2 Creación de la paleta de colores

Se define una escala de colores para representar las diferentes orientaciones del terreno. Debido a que esta variable representa direcciones, la escala permite diferenciar visualmente los cambios entre los valores de orientación.

pal_aspect <- colorNumeric(
  palette = c(
    "blue",
    "cyan",
    "green",
    "yellow",
    "orange",
    "red",
    "purple",
    "blue"
  ),
  values(aspect_view),
  na.color = "transparent"
)

10.3 Visualización interactiva de la orientación del terreno

Finalmente, se genera un mapa interactivo utilizando la capa de orientación obtenida mediante la función SlpAsp(). Se incluyen los límites municipales como referencia espacial y una leyenda que permite interpretar los valores representados.

leaflet(munic) %>% 
  addTiles() %>% 
  setView(-77.0, 5.5, 7) %>% 
  addRasterImage(
    aspect_view,
    colors = pal_aspect,
    opacity = 0.8
  ) %>% 
  addPolygons(
    color = "gray",
    weight = 1,
    fillOpacity = 0,
    popup = paste(
      "Municipio:",
      munic$NAME_2
    )
  ) %>% 
  addLegend(
    pal = pal_aspect,
    values = values(aspect_view),
    title = "Orientación del terreno (°)"
  )

El resultado corresponde a un mapa donde los colores representan las diferentes direcciones de orientación del terreno. Las variaciones espaciales permiten identificar cambios en la exposición de las superficies y complementar la caracterización geomorfométrica del área de estudio.

Bibliografía

Lizarazo, I. (2025). Geomorphometric terrain attributes in R. RPubs.
https://rpubs.com/ials2un/geomorphometric