1) Introducción 🌍

En este cuaderno se sigue el procedimiento para calcular datos geomorfometricos a partir de un modelo raster. Se va a utilizar la libreria de R “MultiscaleDTM”.

Se va a medir la pendiente y la Orientación del departamento del Magdalena con ayuda de esta libreria, esta información es necesaria en la agricultura para establecer la inclinación necesaria para que fluya el agua de manera adecuada y se eviten problemas de encharcamiento del terreno, la orientación de un terreno tambien es fundamental en el mundo agricola, se usa para planificar actividades de campo, ubicacion dentro del terreno, medir áreas y obtener informacion sobre elevaciones y distancias.

2) configuración 🛠️

Antes de iniciar debemos descargar las siguientes librerias para facilitar el manejo de los datos.

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.13.0, GDAL 3.10.1, PROJ 9.5.1; sf_use_s2() is TRUE
library(leaflet)
library(terra)
## terra 1.8.54
library(MultiscaleDTM)
library(exactextractr)

La libreria “elevatr” prporciona acceso a las redes de elevación de datos y transforma datos de elevación como un objeto de entidades simples “sf” desde servicios de elevación de puntos o como un objeto raster.

la libreria “leaflet” es una herramienta usada para crear mapas interactivos. Utiliza una interfaz para la biblioteca de javascrpit que permite consttruir visualizaciones espaciales dinamicas, suele usarse para mapas geograficos interactivos gracias a su adaptabilidad.

la libreria “terra” es una herramienta de datos espaciles, que maneja tanto dats vectoriales como raster. Proporciona metodos para operaciones como intersecciones, buffers y tareas de raster especificas como operaciones locales, globales, focales y zonales.

la libreria “exactextractr” es una herramienta diseñada para resumir de manera eficiente los valores de ráster sobre areas poligonales, este proceso se llama “estadisticas zonales”. Maneja casos en los que las celdas de la cuadricula están solo parcialmente cubiertas por poligonos, garantizando resultados precisos.

3) introducción a la libreria multiscaleDTM 🧩

La librería MultiscaleDTM es un paquete de R diseñado para el análisis avanzado de modelos digitales del terreno (DTM/DEM) mediante el cálculo de métricas topográficas a diferentes escalas espaciales. Su principal fortaleza radica en permitir la extracción de atributos geomorfológicos del terreno como pendiente, curvatura, rugosidad, orientación, índice de posición topográfica (TPI), entre otros en ventanas móviles de distintos tamaños, lo cual resulta clave para caracterizar la variabilidad espacial del relieve. Esta capacidad multiescalar es particularmente útil en disciplinas como la geomorfología, hidrología, ecología del paisaje y agricultura de precisión, donde el relieve del terreno influye en procesos como la acumulación de agua, la erosión del suelo, el drenaje y el rendimiento de cultivos. MultiscaleDTM opera sobre objetos SpatRaster del paquete terra, permitiendo integrar fácilmente estos análisis con otros flujos de trabajo geoespaciales en R.

Funciones principales

  • SlpAsp: Es usada para calcular la orientación y pendiente considerando un subconjunto de celdas dentrp de la ventana focal, específicamente las cuatro celdas en el borde de la ventana focal directamente arriba, abajo, izquierda y derecha de la ventana focal para el metodo de “torre”, cuatro celdas de esquina adicionales para el metodo de “reina” o todas las celdas de borde para el metodo de “limite”.

  • DirSlp: calcula la pendiente multiescala en una dirección especificada.

  • Qfit: Calcula la pendiente, orientación, curvaturay las caracteristicas morfométricas ajustando una superficie cuadratica a la ventana focal utilizando minimos cuadrados ordinarios utilizando la ecuación Z=unX^2 +bY^2 + cXY + dX + eY + f, donde a-f son los parámetros de regresión, Z es la elevación/profundidad, X son las coordenadas este/oeste en la ventana focal en relación con la celda focal e Y son las coordenadas norte/sur en la ventana focal en relación con la celda focal.

  • Pfit: Calcula la pendiente multiescala y el aspecto de la orientación ajustando una superficie plana a la ventana focal utilizando mínimos cuadrados ordinarios. Proporciona resultados equivalentes al uso de un ajuste cuadratico, solo que exigiendo menos al computador.

¿Que es la posición relativa?

La posición relativa representa si un área es un alto o un mínimo local en relación con una altura de referencia. Se calcula como el valor de la celda focal menos el valor de una elevación de referencia, que a menudo es la media de los valores incluidos en la ventana focal, pero también podrían ser otras funciones, como la mediana, el mínimo o el máximo de los valores incluidos. Los valores positivos indican máximos topográficos locales y los valores negativos indican mínimos. La posición relativa se puede expresar en unidades del ráster DTM de entrada o se puede estandarizar en relación con la topografía local dividiendo por la desviación estándar o el rango de los valores de elevación incluidos en la ventana focal.

¿Como se puede usar para la elaboracion de mapas agricolas?

Esta libreria permite calcular atributos geomorfologicos del terreno a multiples escalas de modelos digitales de elevación DEM. Atributos como pendiente, curvatura, amplitud y entropia, resultan fundamentales para analizar condiciones del suelo como el drenaje, riesgo de erosion y variabilidad espacial, permitiendo de esta manera zonificar areas agricolas, optimizar practicas de riego y fertilización y la toma de decisiones importantes en la agricultura de presición. Se pueden generar mapas raster que describan microformas del terreno y caracteristicas topograficas que influyen directamente en la productividad del cultivo; además, estos pueden integrarse con capas vectoriales (como parcelas) usando herramientas como exactextractr para realizar análisis espaciales más detallados y específicos.

4) leyendo datos de entrada 🧠

Para empezar lo primero que debemos hacer es cargar al directorio la capa raster del magdalena, que fue previamente descargada.

# Cargamos el archivo .tif del DEM del departamento del Magdalena usando la función rast() de la libreria terra.
# El DEM es la base que se va a utilizar para calcular la pendiente y la orientación.
(dem = terra::rast("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P6\\MAGDALENA\\elv_magda_z10.tif"))
## class       : SpatRaster 
## size        : 4078, 2589, 1  (nrow, ncol, nlyr)
## resolution  : 0.0006789017, 0.0006789017  (x, y)
## extent      : -75.23438, -73.4767, 8.754526, 11.52309  (xmin, xmax, ymin, ymax)
## coord. ref. : +proj=longlat +ellps=GRS80 +no_defs 
## source      : elv_magda_z10.tif 
## name        : elv_magda_z10 
## min value   :         -2439 
## max value   :          5676

Ahora se procede a reducir la resolución del DEM para usar menos memoria y acelerar el procesamiento, especialmente si el DEM es muy detalladado como en este caso.

#Reducimos la resolucion del raster original agregando los valores de las celdas en bloques de 2x2 y calculando su promedio.
dem2 = terra::aggregate(dem,2, "mean")
## |---------|---------|---------|---------|=========================================                                          

Una vez que reducimos su tamaño, podemos leer el geopackage de el departamento con sus municipios para mas adelante recortar el DEM y limitar el analisis a una región especifica.

# usamos la libreria sf para leer la información del geopackage del dpto. del Magdalena.
(munic <-  sf::st_read("C:\\Users\\brand\\OneDrive\\Escritorio\\GB2\\P6\\MAGDALENA\\magdalena.gpkg"))
## Reading layer `magdalena' from data source 
##   `C:\Users\brand\OneDrive\Escritorio\GB2\P6\MAGDALENA\magdalena.gpkg' 
##   using driver `GPKG'
## Simple feature collection with 30 features and 11 fields
## Geometry type: POLYGON
## Dimension:     XY
## Bounding box:  xmin: -74.9466 ymin: 8.936489 xmax: -73.54184 ymax: 11.34891
## Geodetic CRS:  MAGNA-SIRGAS

Recortamos el DEM para quedarnos solo con el area del departamento, eliminando el resto del raster.

#Recortamos el raster dem2 usando el vector munic, y con mask = TRUE convierte en NA las areas fuera de los limites municipales.

dem3 = terra::crop(dem2,munic, mask=TRUE)
## Warning: [crop] CRS do not match

5) transformar coordenadas (10%) 🔧

Ahora pasamos el DEM a coordenadas planas con el sistema de coordenadas nacional, que es el EPSG:9377, corrspondiente a la proyección transversal MAGNA-SIRGAS/Origen nacional, el cual fue adoptado por el IGAC desde 2020.

Ahora transformamos los datos de entrada al sistema de coordenadas nacional.

#Con la función project() cambiamos el sistema de coordenadas al sistema MAGNA-SIRGAS.
#Con este sistema calcular la pendiente y la orientación es mas facil.
(dem_plane = project(dem3, "EPSG:9377"))
## class       : SpatRaster 
## size        : 1785, 1034, 1  (nrow, ncol, nlyr)
## resolution  : 149.7512, 149.7512  (x, y)
## extent      : 4786059, 4940902, 2545552, 2812858  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        : elv_magda_z10 
## min value   :     -158.9653 
## max value   :     5653.6406

Ahora transformamos el archivo con los poligonons de los municipios al sistema MAGNA-SIRGAS . Es muy importante que el raster y el vector estén en el mismo sistema de referencia espacial para que puedan interactuar correctamente por ejemplo, si queremos recortar el raster con el shapefile, o extraer valores por zona.

#Con la función st_transform() transformamos el sistema de coordenadas al nacional y pasamos las coordenadas a coordenadas planas en metros.
(munic_plane = sf::st_transform(munic, "EPSG:9377"))

6) Cálculo de atributos del terreno (20%) 🌱

Calculamos la pendiente y el aspecto multiescalar mediante la función SlpAsp, que calcula estas variables por medio de formulaciones clásicas de las pendiente restringidas a una ventana de 3x3 a multiples escalas utilizando solo las celdas en los bordes de la ventana focal.

#por medio de la funcion SlpAsp calculamos los atributos geomorfologicos pendiente y orientación (slope, aspect) a partir del DEM.
#La pendiente se calcula en grados
#La orientación se calcula en grados azimutales, es decir que el norte esta los 0° y el este a los 90°, y asi sucesivamente.
(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        : 1785, 1034, 2  (nrow, ncol, nlyr)
## resolution  : 149.7512, 149.7512  (x, y)
## extent      : 4786059, 4940902, 2545552, 2812858  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## names       :    slope,   aspect 
## min values  :  0.00000,   0.0000 
## max values  : 61.32469, 359.9998

ahora dividimos el objeto slp_asp en dos partes, la pendiente y la orientación.

# extraemos la primera capa del objeto Slp_asp, que corresponde a la pendiente en grados
(slope = subset(slp_asp, 1))
## class       : SpatRaster 
## size        : 1785, 1034, 1  (nrow, ncol, nlyr)
## resolution  : 149.7512, 149.7512  (x, y)
## extent      : 4786059, 4940902, 2545552, 2812858  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :    slope 
## min value   :  0.00000 
## max value   : 61.32469

Podemos observar que la pendiente del departamento varia desde los 0 hasta los 62° aproximadamente, lo cual se puede explicar debido a las grandes llanuras que presenta el departamento en la cuenca del rio Magdalena y la gran pendiente por la sierra nevada de santa marta.

#Este codigo genera un historigrama que muestra la distribucion de la pendiente del raster utilizando la funcion hist() de la libreria "terra".
terra::hist(slope, 
     main = "pendiente del Magdalena", 
     xlab = "Pendiente (en grados)")
## Warning: [hist] a sample of 54% of the cells was used (of which 44% was NA)

Con esta grafica podemos evidenciar que los valores de la pendiente se concentran entre los 0° y 5° con una frecuencia superior a 300000 celdas, indicando que gran parte del departamento del Magdalena es plano con zonas ligeramente inclinados, probablemente en zonas costeras, la cuenca del rio magdalena y las zonas agricolas del bajo Magdalena.

Tambien podemos evidenciar que hay un menor numero de celdas entre los 100° y 30°, y aún menos hacia los 40° a 60°, por lo que estas zonas corresponden a zonas de relieve montañoso o escarpado, como la sierra nevada de santa marta o las zonas altas del sur.

#Extraemos la segunda capa del objeto slp_asp, que corresponde a la orientación de las pendientes.
(aspect =subset(slp_asp, 2))
## class       : SpatRaster 
## size        : 1785, 1034, 1  (nrow, ncol, nlyr)
## resolution  : 149.7512, 149.7512  (x, y)
## extent      : 4786059, 4940902, 2545552, 2812858  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :   aspect 
## min value   :   0.0000 
## max value   : 359.9998

A partir de esta información podemos tomar decisiones importantes respecto a la exposición solar que puede recibir un cultivo y ubicar las laderas con menor insolacion, pero para poder analizar esto, es necesario realizar un diagrama de barras que permita observar el comportamiento de los datos.

#Con este codigo se genera un historigrama que indica la orientación de las pendientes en el departamento del Magdalena.
terra::hist(aspect, 
     main = "Orientacion del magdalena", 
     xlab = "Orientacion (en grados)")
## Warning: [hist] a sample of 54% of the cells was used (of which 45% was NA)

Mediante este grafico se puede analizar la orientación de las pendientes, donde cada grado significa lo siguiente:

0° = Norte

90° = Este

180° = Sur

270° = Oeste

360° ≈ Norte otra vez

Por lo que se puede obervar como hay mas celdas orientadas entre los 270° y 330°, es decir hacia el oeste y noroeste, por lo que estas laderas pueden recibir más radiación solar en la tarde. siendo util para cultivos que toleran mas calor. Por otro lado tambien se puede observar que hay menor frecuencia de celdas entre los 60° y los 120°, es decir menos laderas orientadas al este, por lo que son zonas conmenor insolacion, siendo utiles para cultivos que requieran más humedad.

Ahora convertiremos la pendiente en grados a pendiente en porcentaje.

#Con esta función podemos convertir los grados a porcentaje para la pendiente.
(slope_perc = tan(slope*(pi/180))*100)
## class       : SpatRaster 
## size        : 1785, 1034, 1  (nrow, ncol, nlyr)
## resolution  : 149.7512, 149.7512  (x, y)
## extent      : 4786059, 4940902, 2545552, 2812858  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :    slope 
## min value   :   0.0000 
## max value   : 182.8408

La pendiente minima es del 0% por lo que hay zonas completamente planas, ttipico en muchas partes del magdalena, mientras que la pendiente maxima es del 182.84% lo que indica terrenos muy inclinados que probablemente esten inclinados en la sierra nevada de santa marta. Esta información es util en la agricultura para el ordenamiento del territorio, infraestructura agraria y ordenamiento territorial.

Pero para poder analizar mejor la información es neceario un grafico que permita visualizar los datos de manera mas precisa.

terra::hist(slope_perc, 
     main = "Pendiente en el Magdalena", 
     xlab = "pendiente (en porcentaje)")
## Warning: [hist] a sample of 54% of the cells was used (of which 44% was NA)

La mayoria de los datos de pendiente se encuentran concentrados entre el 0% y el 10%, indicando que el departamento del magdalena es mayormente plano o con leves inclinaciones. A medida que la pendiente aumenta, la frecuencia disminuye drasticamente.

Una pequeña fracción del departamento refleja pendientes superioes al 50% que corresponden a la sierra nevada o regiones montañosas aisladas.

Con esta información se puede concluir que el departamento del Magdalena presenta una alta aptitud agricola gracias a la alta frecuencia de pendientes bajsa reflejando el potencial que tiene el departamento para la producción agricola. Tambien se puede concluir que las areas con una pendiente elevada deben ser analizadas para conservación, protección contra la erosión o cultivos especiales adaptados a terrenos inclinados.

7) Cálculo de estadísticas zonales (20%)

Las estadisticas zonales permiten resumir datos raster como pendiente, altitud o humedad dentro de areas definidas por zonas que pueden ser poligonos administrativos, unidades de cultivo, cuencas, etc.

Suelen usarse en agricultura de precisión para caracterizar zonas del campo segun pendiente o inclinación para ajustar la fertilización o el riego.

En este caso vamos a calcular el promedio de los valores de pendiente por municipio, por lo que vamos a examinar la clasificación de pendiente segun el IGAC para la elaboración del mapa.

con esta clasificación procederemos a reclasificar el raster de la pendiente.

#Vamos a agrupar los valores del raster slope_perc en clases definidas por rangos.
m <- c(0, 3, 1,  
       3, 7, 2,  
       7, 12,  3, 
       12, 25, 4, 
       25, 50, 5, 
       50, 75, 6,
       75, 185, 7)
m <- matrix(m, ncol=3, byrow = TRUE)
rc <- classify(slope_perc, m, right=TRUE)

Esta reclasificación es util para realizar analisis agricolas de eroción, planificación, etc.

A continuación podemos calcular la estadisticas zonales usando exactextractr.

## Calculamos la pendiente media dentro de cada poligono del objeto munic apartir del raster slope_perc y lo guardamos en la columna mean_slope.
(munic$mean_slope <- exactextractr::exact_extract(slope_perc, munic, 'mean'))
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
##   |                                                                              |                                                                      |   0%  |                                                                              |==                                                                    |   3%  |                                                                              |=====                                                                 |   7%  |                                                                              |=======                                                               |  10%  |                                                                              |=========                                                             |  13%  |                                                                              |============                                                          |  17%  |                                                                              |==============                                                        |  20%  |                                                                              |================                                                      |  23%  |                                                                              |===================                                                   |  27%  |                                                                              |=====================                                                 |  30%  |                                                                              |=======================                                               |  33%  |                                                                              |==========================                                            |  37%  |                                                                              |============================                                          |  40%  |                                                                              |==============================                                        |  43%  |                                                                              |=================================                                     |  47%  |                                                                              |===================================                                   |  50%  |                                                                              |=====================================                                 |  53%  |                                                                              |========================================                              |  57%  |                                                                              |==========================================                            |  60%  |                                                                              |============================================                          |  63%  |                                                                              |===============================================                       |  67%  |                                                                              |=================================================                     |  70%  |                                                                              |===================================================                   |  73%  |                                                                              |======================================================                |  77%  |                                                                              |========================================================              |  80%  |                                                                              |==========================================================            |  83%  |                                                                              |=============================================================         |  87%  |                                                                              |===============================================================       |  90%  |                                                                              |=================================================================     |  93%  |                                                                              |====================================================================  |  97%  |                                                                              |======================================================================| 100%
##  [1] 34.3130493  0.9711066 32.4357758  1.3878907  0.9487980  1.5636197
##  [7] 34.1772461  1.8798674  0.9540940  0.7222221  0.5690166 21.9244385
## [13]  0.9260811  1.3292797  2.5145619  1.1275929  1.0748733  1.7687278
## [19]  0.4949985  0.5313346  1.6415391  0.4778264  1.2094039  0.9828508
## [25]  1.0238775  1.5891575  0.5086798  2.3828094  1.4427539  2.6509492

Una ve calculadas las estadisticas zonales podemos observar que da como resultado la pendiente media por poligono, indicando el porcentaje de la pendientre promedio de un poligono, demostrando de esta manera una gran variablidad en la pendiente media entre zonas.

hist(munic$mean_slope, 
     main = "la pendiente media del magdalena",
     xlab = "Pendiente (en porcentaje)")

Por medio de este grafico se puede evidenciar como es que la mayoria de los municipios tienen pedientes medias bajas, que se encuentran entre el 0% y el 5%, que indica qque predominan zonas planas o con un relieve suave, tambien hay presencia de municipios con pendientes medias mayores a 10% y unos pocos con valores entre el 20% y el 35%, Por lo cual se puede concluir que el departamento del magdalena es predominantemente plano.

Una vez que hemos calculado la pendiente en porcentaje, la vamos a clasificar como una categoria.

(munic$class <- exactextractr::exact_extract(rc, munic, 'mode')) 
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
##   |                                                                              |                                                                      |   0%  |                                                                              |==                                                                    |   3%  |                                                                              |=====                                                                 |   7%  |                                                                              |=======                                                               |  10%  |                                                                              |=========                                                             |  13%  |                                                                              |============                                                          |  17%  |                                                                              |==============                                                        |  20%  |                                                                              |================                                                      |  23%  |                                                                              |===================                                                   |  27%  |                                                                              |=====================                                                 |  30%  |                                                                              |=======================                                               |  33%  |                                                                              |==========================                                            |  37%  |                                                                              |============================                                          |  40%  |                                                                              |==============================                                        |  43%  |                                                                              |=================================                                     |  47%  |                                                                              |===================================                                   |  50%  |                                                                              |=====================================                                 |  53%  |                                                                              |========================================                              |  57%  |                                                                              |==========================================                            |  60%  |                                                                              |============================================                          |  63%  |                                                                              |===============================================                       |  67%  |                                                                              |=================================================                     |  70%  |                                                                              |===================================================                   |  73%  |                                                                              |======================================================                |  77%  |                                                                              |========================================================              |  80%  |                                                                              |==========================================================            |  83%  |                                                                              |=============================================================         |  87%  |                                                                              |===============================================================       |  90%  |                                                                              |=================================================================     |  93%  |                                                                              |====================================================================  |  97%  |                                                                              |======================================================================| 100%
##  [1] 5 1 5 1 1 1 5 1 1 1 1 5 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
## Calculamos la clase modal de la pendiente como una categoria y la guardamos en una nueva variable munic$class.

En el resultado de este comando se puede evidenciar como es que la mayoria de los municipios tienen una pendiente de calse 1, lo que indica que la pendiente mas común esta entre 0% y 3%.

Ahora procedemos a realizar un grafico para observar mejor el comportamiento de los datos.

hist(munic$class, 
     main = "la pendiente reclasificada del Magdalena", 
     xlab = "Pendiente (como una categoria)")

En este grafico se puede corroborar que mas de 25 municipios del departamento del magdalena tienen pendientes predominantemente entre 0% y 3%, confirmando que la mayoria del departamento es plano, mientras que la clase 5 aparece en 2 o 3 municipios.

Ahora procedemos a reproyectar el raaster rc desde el sistema de coordenadas MAGNA-SIRGAS hacia el sistema de coordenadas geograficas WGS 84 que utiliza grados decimales de longitud y latitud.

## reproyectamos el raster a corrdenadas geograficas por medio del comando "rc".
(rc.geo = project(rc, "EPSG:4326"))
## class       : SpatRaster 
## size        : 1785, 1048, 1  (nrow, ncol, nlyr)
## resolution  : 0.001357862, 0.001357862  (x, y)
## extent      : -74.96115, -73.53811, 8.931431, 11.35521  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326) 
## source(s)   : memory
## name        : slope 
## min value   :     0 
## max value   :     7

Podemos evidenciar que el raster contiene 1785 filas por 1048 columnas, lo que indica que tiene un total de 1.87 millones de celdas, en donde cada pixel tiene una resolución de 0.001357862 grados, lo que es alrededor de 151 metros en el ecuador, tambien se pueden ver los valores minimo y maximo de la pendiente reclasificada, que va desde 0 hasta 167.75 grados.

Ahora transfromamos el raster al sistema de coordenadas EPSG:4326 para poder realizar el mapa mas adelante.

(slope.geo = project(slope_perc, "EPSG:4326"))
## class       : SpatRaster 
## size        : 1785, 1048, 1  (nrow, ncol, nlyr)
## resolution  : 0.001357862, 0.001357862  (x, y)
## extent      : -74.96115, -73.53811, 8.931431, 11.35521  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326) 
## source(s)   : memory
## name        :    slope 
## min value   :   0.0000 
## max value   : 167.7531

8) Trazando la pendiente del terreno (20%)

Para realizar el mapa interactivo de la pendiente en el departamento del magdalena, lo primero que debemos hacer es crear una paleta de colores continua para poder visualizar el raster de pendientes con un degradado que vaya desde verde claro a rojo oscuro.

##Creamos una función de color por medio del comando ColorNumeric() basada en un gradiente númerico.

palredgreen <- colorNumeric(c("darkseagreen3","yellow", "orange2", "brown3", "darkred"), values(slope.geo),
  na.color = "transparent")

Por medio de esta gradiente de colores se puede representar de manera clara las zonas planas en color verde, suavemente inclinadas en naranja, empinadas o motañosas en rojo, siendo ideal para el análisis agrícola, la planificación del uso del suelo o estudios de erosión.

Procedemos a crear un mapa interactivo que combine el vector de los municipios con información sobre el nombre y la clase de pendiente, el raster de la pendiente y la paleta continua de colores en donde se representen los cambios en la pendiente.

## creamos el mapa a partir del codigo leaflet(munic) como capa base

leaflet(munic) %>% addTiles() %>% setView(-74.3, 10.3, 7.9) %>% 
    addPolygons(color = "gray", weight = 1.0, smoothFactor = 0.5,
    opacity = 0.4, fillOpacity = 0.10,
    popup = paste("Municipio: ", munic$mpio_cnmbr, "<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 en Magdalena (%)")
## Warning: sf layer has inconsistent datum (+proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs).
## Need '+proj=longlat +datum=WGS84'

El mapa presentado evidencia la variabilidad espacial de la pendiente del terreno en el departamento del Magdalena, destacando una clara diferenciación entre las zonas del norte y del sur. Las áreas costeras y de valle, como las cercanas a Ciénaga, Zona Bananera y Fundación, muestran pendientes bajas (color verde), lo que sugiere terrenos planos ideales para actividades agrícolas e infraestructurales. En contraste, las regiones del norte y noreste, especialmente en la zona de influencia de la Sierra Nevada de Santa Marta, exhiben pendientes altas (colores naranja y rojo), que indican terrenos montañosos y de mayor restricción para el uso antrópico intensivo.

9) Visualización alternativa de la pendiente del terreno 15%

Vmoa a realizar una visualización allternativa de la pendiente del terreno, pero ahora usando grados en lugar de porcentaje, tambien añadimos etiquetas con el nomber de los municipios y sus pendientes medias, pero tambien manteniendo los valores emergentes como en el grafico anterior.

Lo primero es asegurar la codificación UTF-8 para los nombres de los municipios y asi evitar errores al momento de realizar el mapa

munic <- st_transform(munic, crs = 4326)
slope_deg_geo <- terra::project(slope.geo, "EPSG:4326")
munic$mpio_cnmbr <- iconv(munic$mpio_cnmbr, from = "", to = "UTF-8")

luego creamos las etiquetas seguras en HTML para que se muestren al pasar el cursor.

labels <- sprintf(
  "<strong>Municipio:</strong> %s<br/><strong>Pendiente media:</strong> %.2f%%",
  munic$mpio_cnmbr,
  munic$mean_slope
) %>% lapply(htmltools::HTML)

Procedemos a crear una paleta de colores que representa a la paleta en grados

pal_grad <- colorNumeric(c("darkseagreen3","yellow", "orange2", "brown3", "darkred"), values(slope.geo),
  na.color = "transparent"
)

Por ultimo creamos el mapa interactivo con la pendiente en grados

leaflet(munic) %>%
  addTiles() %>%
  setView(lng = -74.3, lat = 10.3, zoom = 7.9) %>%
  addPolygons(
    color = "gray", weight = 1, opacity = 0.5, fillOpacity = 0.1,
    label = labels
  ) %>%
  addRasterImage(slope, colors = pal_grad, opacity = 0.8) %>%
  addLegend(
    pal = pal_grad, values = values(slope),
    title = "Pendiente del terreno en Magdalena (grados)"
  )

El mapa muestra la distribución espacial de la pendiente del terreno en grados en el departamento del Magdalena. Se observa que la mayor parte del territorio presenta pendientes bajas, especialmente en las zonas del centro y sur, lo cual sugiere terrenos relativamente planos. Sin embargo, hacia el norte y noroeste, en zonas cercanas a la Sierra Nevada de Santa Marta, se identifican pendientes elevadas que superan los 50 grados, indicando áreas montañosas o escarpadas. Esta información es crucial para la planificación del uso del suelo, ya que las pendientes más pronunciadas pueden limitar el desarrollo urbano, la infraestructura y ciertas actividades agrícolas, además de aumentar el riesgo de procesos erosivos y movimientos en masa. La incorporación de los valores promedio por municipio facilita una interpretación más precisa a escala local, permitiendo tomar decisiones informadas en la gestión territorial y la prevención de desastres.

10) Bibliografia

Hijmans, R. J. (2023). terra: Spatial Data Analysis. R package version 1.7-65. https://rspatial.org/terra/

Pebesma, E. (2018). Simple Features for R: Standardized Support for Spatial Vector Data. The R Journal, 10(1), 439–446. https://doi.org/10.32614/RJ-2018-009 (Base teórica del paquete sf, usado para datos vectoriales)

R Core Team. (2023). R: A language and environment for statistical computing. R Foundation for Statistical Computing, Vienna, Austria. https://www.R-project.org/

Beers, T., Dress, P. E., & Wensel, L. C. (1966). Aspect transformation in site productivity research. Journal of Forestry, 64(10), 691–692. (Fundamento sobre el uso de orientación en grados y su interpretación ecológica)

Dunnington, D. (2023). exactextractr: Fast Extraction from Raster Datasets Using Polygons. R package version 0.9.2. https://github.com/isciences/exactextractr (Usado para calcular estadísticas zonales precisas)

Lizarazo, I. (2024). Geomorphometric terrain attributes using R. Publicado en RPubs. https://rpubs.com/ials2un/geomorphometric (Tutorial base del que se usaron los fragmentos de código)

Instituto Geográfico Agustín Codazzi (IGAC). (2020). Implementación del nuevo sistema de coordenadas planas con origen nacional EPSG:9377 (MAGNA-SIRGAS 2018). https://geoportal.igac.gov.co/

Reproducibilidad

sessionInfo()
## R version 4.4.3 (2025-02-28 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 26100)
## 
## Matrix products: default
## 
## 
## locale:
## [1] LC_COLLATE=Spanish_Colombia.utf8  LC_CTYPE=Spanish_Colombia.utf8   
## [3] LC_MONETARY=Spanish_Colombia.utf8 LC_NUMERIC=C                     
## [5] LC_TIME=Spanish_Colombia.utf8    
## 
## time zone: America/Bogota
## tzcode source: internal
## 
## attached base packages:
## [1] stats     graphics  grDevices utils     datasets  methods   base     
## 
## other attached packages:
## [1] exactextractr_0.10.0 MultiscaleDTM_1.0    terra_1.8-54        
## [4] leaflet_2.2.2        sf_1.0-21            elevatr_0.99.0      
## 
## loaded via a namespace (and not attached):
##  [1] sass_0.4.10        generics_0.1.4     class_7.3-23       KernSmooth_2.23-26
##  [5] lattice_0.22-6     digest_0.6.37      magrittr_2.0.3     rgl_1.3.18        
##  [9] RColorBrewer_1.1-3 evaluate_1.0.3     grid_4.4.3         fastmap_1.2.0     
## [13] jsonlite_2.0.0     e1071_1.7-16       DBI_1.2.3          promises_1.3.2    
## [17] purrr_1.0.4        scales_1.4.0       crosstalk_1.2.1    codetools_0.2-20  
## [21] jquerylib_0.1.4    cli_3.6.5          shiny_1.10.0       rlang_1.1.6       
## [25] units_0.8-7        base64enc_0.1-3    cachem_1.1.0       yaml_2.3.10       
## [29] raster_3.6-32      tools_4.4.3        dplyr_1.1.4        httpuv_1.6.16     
## [33] png_0.1-8          vctrs_0.6.5        R6_2.6.1           mime_0.13         
## [37] proxy_0.4-27       lifecycle_1.0.4    classInt_0.4-11    htmlwidgets_1.6.4 
## [41] pkgconfig_2.0.3    progressr_0.15.1   bslib_0.9.0        pillar_1.10.2     
## [45] later_1.4.2        glue_1.8.0         Rcpp_1.0.14        tidyselect_1.2.1  
## [49] xfun_0.52          tibble_3.2.1       rstudioapi_0.17.1  knitr_1.50        
## [53] farver_2.1.2       xtable_1.8-4       htmltools_0.5.8.1  rmarkdown_2.29    
## [57] compiler_4.4.3     sp_2.2-0