1. Introducción

Este notebook busca ilustrar los atributos geomorfológicos del departamento de Norte de Santander, Colombia, usando modelos de elevación digital DEM. Se utiliza el paquete Multiscale DTM de R para el procesamiento y análisis de los datos a fin de obtener variables que describan el terreno para comprender de mejor manera la variabilidad topográfica del departamento.

title: Modelos de Elevación Digital DEMs

Puede definirse como la representación digital del relieve de la tierra, donde a cada punto (Vectorial) o cuadrícula (Raster) le corresponde un valor de elevación. Estos modelos se utilizan para visualizar y analizar la topografía de un terreno, puede usarse en distintas disciplinas, entre ellas la agronomía, ya que permite tomar decisiones informadas según las necesidades del usuario.

2. Configuración del cuaderno

Los paquetes necesarios deben instalarse con antelación desde la consola.

## SETUP
# INSTALL THIS PACKAGE FROM THE CONSOLE, NOT FROM THIS CHUNK
# paquetes = c("MultiscaleDTM", "exactextractr")
# install.packages(paquetes)

2.1 Limpieza de memoria

Se debe limpiar la memoria para mejorar el rendimiento del código, evitando la confusión de variables o archivos dentro del notebook

rm(list=ls())

Adicionalmente se requiere el uso de las siguientes librerías

library(elevatr)
## Warning: package 'elevatr' was built under R version 4.5.1
## 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)
## Warning: package 'sf' was built under R version 4.5.1
## Linking to GEOS 3.13.1, GDAL 3.11.0, PROJ 9.6.0; sf_use_s2() is TRUE
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.5.1
library(terra)
## Warning: package 'terra' was built under R version 4.5.1
## terra 1.8.60
library(MultiscaleDTM)
## Warning: package 'MultiscaleDTM' was built under R version 4.5.1
library(exactextractr)
## Warning: package 'exactextractr' was built under R version 4.5.1

3. Datos de elevación de Norte de Santander

A continuación, se usará la base de datos trabajada a lo largo del curso de Geomática Básica.

Inicialmente, se carga el DEM raster de Norte de Santander obtenido de un documento anteriormente trabajado. Se lee DEM usando la librería Terra, este archivo se llamará “dem”

# change the path & DEM filename as needed
(dem = terra::rast("NORTE DESANTANDER_ELEV.tif"))
## class       : SpatRaster 
## size        : 289, 190, 1  (nrow, ncol, nlyr)
## resolution  : 0.008333333, 0.008333333  (x, y)
## extent      : -73.63333, -72.05, 6.875, 9.283333  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 
## source      : NORTE DESANTANDER_ELEV.tif 
## name        : NORTE DESANTANDER_ELEV

Propiedades del documento “dem”: Tiene clase SpatRaster, ideal para trabajar con datos de tipo espacial raster. Posee una tabla con un total de 289 filas, 190 columnas y una sola capa. Cada celda tiene una resolución de aproximadamente 0,0083 grados en (x,y), es decir, se tiene un nivel de detalle bastante alto.

El sistema de referencia espacial es geográfico, con un elipsoide GRS80.

Reducir la resolución del DEM, para evitar problemáticas en la memoria, ya que se agrupan las celdas del archivo DEM original en bloques de 2*2, promediando valores, así, se reduce la resolución y por lo tanto, la carga de la memoria del sistema:

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

Se incluye el geopackage del departamento con las limitaciones del departamento. Se usa la librería sf para esta acción

list.files("Norte.gpkg" )
## character(0)
municipios <- st_read("Norte.gpkg" )
## Reading layer `municipios' from data source `E:\P8\Norte.gpkg' using driver `GPKG'
## Simple feature collection with 40 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: -73.63379 ymin: 6.872201 xmax: -72.04761 ymax: 9.290847
## Geodetic CRS:  MAGNA-SIRGAS

Preguardado de los archivos en un nuevo atributo

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

3.1 Transformación de coordenadas

para calcular correctamente la geomorgfología del departamento el DEM debe tener coordenadas planas. Para el año 2020, el Instituto Geográfico Agustin Codazzi (IGAC) adopta el sistema de coordenadas plana con origen único nacional en Colombia, con código EPSG 9377. Se usa el siguiente código para la transformación de coordenadas:

# check the parameters of this terra function here
# https://rdrr.io/github/rspatial/terra/man/project.html
(dem_plane = project(dem3, "EPSG:9377"))
## class       : SpatRaster 
## size        : 145, 95, 1  (nrow, ncol, nlyr)
## resolution  : 1839.955, 1839.955  (x, y)
## extent      : 4930055, 5104850, 2317162, 2583955  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        : NORTE DESANTANDER_ELEV 
## min value   :                 28.000 
## max value   :               3965.511

Como se observa anteriormente, la transformación de coordenadas fue exitosa.

Se transforma el objeto a un vectorial, con el siguiente código:

# check the parameters of this sf function here
# https://github.com/rstudio/cheatsheets/blob/main/sf.pdf
(munic_plane = sf::st_transform(municipios, "EPSG:9377"))
## Simple feature collection with 40 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension:     XY
## Bounding box:  xmin: 4930141 ymin: 2317409 xmax: 5105147 ymax: 2584646
## Projected CRS: MAGNA-SIRGAS 2018 / Origen-Nacional
## First 10 features:
##    dpto_ccdgo mpio_ccdgo mpio_cdpmp         dpto_cnmbr         mpio_cnmbr
## 1          54        001      54001 NORTE DE SANTANDER SAN JOSÉ DE CÚCUTA
## 2          54        003      54003 NORTE DE SANTANDER             ÁBREGO
## 3          54        051      54051 NORTE DE SANTANDER          ARBOLEDAS
## 4          54        099      54099 NORTE DE SANTANDER          BOCHALEMA
## 5          54        109      54109 NORTE DE SANTANDER         BUCARASICA
## 6          54        125      54125 NORTE DE SANTANDER             CÁCOTA
## 7          54        128      54128 NORTE DE SANTANDER            CÁCHIRA
## 8          54        172      54172 NORTE DE SANTANDER          CHINÁCOTA
## 9          54        174      54174 NORTE DE SANTANDER            CHITAGÁ
## 10         54        206      54206 NORTE DE SANTANDER         CONVENCIÓN
##    mpio_crslc mpio_tipo mpio_narea mpio_nano shape_Leng shape_Area
## 1        1972 MUNICIPIO  1133.8983      2023  2.8800550 0.09295484
## 2        1806 MUNICIPIO  1382.4498      2023  2.2393759 0.11336240
## 3        1835 MUNICIPIO   456.1490      2023  1.1611936 0.03736204
## 4        1826 MUNICIPIO   170.2783      2023  0.7577804 0.01394549
## 5        1838 MUNICIPIO   270.7909      2023  0.8281364 0.02220518
## 6        1630 MUNICIPIO   138.9222      2023  0.5561253 0.01136823
## 7        1911 MUNICIPIO   615.8199      2023  1.6560289 0.05045724
## 8        1775 MUNICIPIO   166.2538      2023  0.7575339 0.01361345
## 9        1808 MUNICIPIO  1185.1780      2023  1.9283047 0.09692833
## 10       1829 MUNICIPIO   931.7834      2023  2.9121305 0.07657413
##                              geom
## 1  MULTIPOLYGON (((5057461 248...
## 2  MULTIPOLYGON (((4998143 247...
## 3  MULTIPOLYGON (((5029614 241...
## 4  MULTIPOLYGON (((5040019 239...
## 5  MULTIPOLYGON (((5005485 246...
## 6  MULTIPOLYGON (((5041813 236...
## 7  MULTIPOLYGON (((4995347 242...
## 8  MULTIPOLYGON (((5040417 239...
## 9  MULTIPOLYGON (((5047111 235...
## 10 MULTIPOLYGON (((4999605 258...

4.Cálculo de los atributos geomorfométricos.

Para calcular el aspecto y la pendiente, se debe usar la función SlpAsp de la librería MultiscaleDTM. Inicialmente, se define el parámetro w como el tamaño de la ventana usada para calcular los atributos. Para este caso, w=c(3,3), es decir, una ventana con celdas de 3*3. Continuando con e código, el parámetro method define eñ tipo de vecindad utilizado para los cálculos, donde “queen” es un tipo de vecindad que incluye aquellos datos que pueden llamarse vecinos directos o intermedios.

# Explain what is w 
# Explain what is method
# Change if needed
(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        : 145, 95, 2  (nrow, ncol, nlyr)
## resolution  : 1839.955, 1839.955  (x, y)
## extent      : 4930055, 5104850, 2317162, 2583955  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## names       :        slope,       aspect 
## min values  :  0.001763495,   0.09431379 
## max values  : 18.945262960, 359.98923683

Se deben separar los resultados del código anterior en dos capas: Capa 1: Capa de la pendiente.

(slope = subset(slp_asp, 1))
## class       : SpatRaster 
## size        : 145, 95, 1  (nrow, ncol, nlyr)
## resolution  : 1839.955, 1839.955  (x, y)
## extent      : 4930055, 5104850, 2317162, 2583955  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :        slope 
## min value   :  0.001763495 
## max value   : 18.945262960

La capa de pendiente, puede visualizarse a continuación:

terra::hist(slope, 
     main = "Pendiente Norte de Santander", 
     xlab = "Pendiente (en grados)")

Capa 2: Orientación

(aspect =subset(slp_asp, 2))
## class       : SpatRaster 
## size        : 145, 95, 1  (nrow, ncol, nlyr)
## resolution  : 1839.955, 1839.955  (x, y)
## extent      : 4930055, 5104850, 2317162, 2583955  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :       aspect 
## min value   :   0.09431379 
## max value   : 359.98923683

La capa orientación, puede visualizarse a continuación:

terra::hist(aspect, 
     main = "Aspecto de Norte de Santander", 
     xlab = "Aspect (en grados)")

Se debe convertir la pendiente de grados a porcentaje:

# 
(slope_perc = tan(slope*(pi/180))*100)
## class       : SpatRaster 
## size        : 145, 95, 1  (nrow, ncol, nlyr)
## resolution  : 1839.955, 1839.955  (x, y)
## extent      : 4930055, 5104850, 2317162, 2583955  (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377) 
## source(s)   : memory
## name        :        slope 
## min value   :  0.003077879 
## max value   : 34.325935606
terra::hist(slope_perc, 
     main = "Pendiente de Norte de Santander", 
     xlab = "Pendiente (% Pendiente)")

#terra::hist(slope_perc)

5.Cálculo de estadísticas zonales en Norte de Santander

Inicialmente, para analizar las pendientes en el departamento, se utiliza la clasificación diseñada por el IGAC con fines agrológicos, que puede observarse a continuación:

Esta clasificación divide los valores de pendiente en diferentes rangos, representando la dificultad del manejo del terreno Para realizar la computación de zonas estáticas parala transformación de los porcentajes continuos de la pendiente a intervalos categorizados se utiliza la siguiente matriz, a fin de obtener un nuevo ráster reclasificado que permite identificar las áreas con pendientes similares y categorizarlas según su inclinación.

# Reclassify the slope raster
#rc <- classify(slope_perc, c(0, 3, 7, 12, 25,50, 75), include.lowest=TRUE, brackets=TRUE)
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 <- classify(slope_perc, m, right=TRUE)

Cálculo de las estadísticas zonales usando exactextractr

(municipios$mean_slope <- exactextractr::exact_extract(slope_perc, municipios, 'mean'))
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
##   |                                                                              |                                                                      |   0%  |                                                                              |==                                                                    |   2%  |                                                                              |====                                                                  |   5%  |                                                                              |=====                                                                 |   8%  |                                                                              |=======                                                               |  10%  |                                                                              |=========                                                             |  12%  |                                                                              |==========                                                            |  15%  |                                                                              |============                                                          |  18%  |                                                                              |==============                                                        |  20%  |                                                                              |================                                                      |  22%  |                                                                              |==================                                                    |  25%  |                                                                              |===================                                                   |  28%  |                                                                              |=====================                                                 |  30%  |                                                                              |=======================                                               |  32%  |                                                                              |========================                                              |  35%  |                                                                              |==========================                                            |  38%  |                                                                              |============================                                          |  40%  |                                                                              |==============================                                        |  42%  |                                                                              |================================                                      |  45%  |                                                                              |=================================                                     |  48%  |                                                                              |===================================                                   |  50%  |                                                                              |=====================================                                 |  52%  |                                                                              |======================================                                |  55%  |                                                                              |========================================                              |  58%  |                                                                              |==========================================                            |  60%  |                                                                              |============================================                          |  62%  |                                                                              |==============================================                        |  65%  |                                                                              |===============================================                       |  68%  |                                                                              |=================================================                     |  70%  |                                                                              |===================================================                   |  72%  |                                                                              |====================================================                  |  75%  |                                                                              |======================================================                |  78%  |                                                                              |========================================================              |  80%  |                                                                              |==========================================================            |  82%  |                                                                              |============================================================          |  85%  |                                                                              |=============================================================         |  88%  |                                                                              |===============================================================       |  90%  |                                                                              |=================================================================     |  92%  |                                                                              |==================================================================    |  95%  |                                                                              |====================================================================  |  98%  |                                                                              |======================================================================| 100%
##  [1]  3.2448459  9.1423550 15.6680441 11.8595142 12.0742102 10.2616091
##  [7] 12.2997713  9.7966852 14.8944759  7.1044455 15.3004894  9.6968250
## [13]  8.8860168  7.5813532  7.9369020 12.2097578 10.4355650  9.7403421
## [19] 15.6741705  6.7737608  8.6346407  8.3568897 13.1622419 12.7267027
## [25]  7.4958739 12.7002172 14.2353001  0.1256056 10.3348341 12.8406048
## [31]  8.9145470  7.0051656  9.8731098  8.1491070  9.9314880  9.3403406
## [37]  2.1978977 12.7815981 13.1182680  6.9189868

Visualización gráfica mediante histograma de la pendiente media en el Norte de Santander

hist(municipios$mean_slope, 
     main = "Pendiente media en Norte de Santander", 
     xlab = "Pendiente (% Pendiente)")

Pendiente predominante de los municipios de Norte de Santander

(municipios$class <- exactextractr::exact_extract(rc, municipios, 'mode'))
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
##   |                                                                              |                                                                      |   0%  |                                                                              |==                                                                    |   2%  |                                                                              |====                                                                  |   5%  |                                                                              |=====                                                                 |   8%  |                                                                              |=======                                                               |  10%  |                                                                              |=========                                                             |  12%  |                                                                              |==========                                                            |  15%  |                                                                              |============                                                          |  18%  |                                                                              |==============                                                        |  20%  |                                                                              |================                                                      |  22%  |                                                                              |==================                                                    |  25%  |                                                                              |===================                                                   |  28%  |                                                                              |=====================                                                 |  30%  |                                                                              |=======================                                               |  32%  |                                                                              |========================                                              |  35%  |                                                                              |==========================                                            |  38%  |                                                                              |============================                                          |  40%  |                                                                              |==============================                                        |  42%  |                                                                              |================================                                      |  45%  |                                                                              |=================================                                     |  48%  |                                                                              |===================================                                   |  50%  |                                                                              |=====================================                                 |  52%  |                                                                              |======================================                                |  55%  |                                                                              |========================================                              |  58%  |                                                                              |==========================================                            |  60%  |                                                                              |============================================                          |  62%  |                                                                              |==============================================                        |  65%  |                                                                              |===============================================                       |  68%  |                                                                              |=================================================                     |  70%  |                                                                              |===================================================                   |  72%  |                                                                              |====================================================                  |  75%  |                                                                              |======================================================                |  78%  |                                                                              |========================================================              |  80%  |                                                                              |==========================================================            |  82%  |                                                                              |============================================================          |  85%  |                                                                              |=============================================================         |  88%  |                                                                              |===============================================================       |  90%  |                                                                              |=================================================================     |  92%  |                                                                              |==================================================================    |  95%  |                                                                              |====================================================================  |  98%  |                                                                              |======================================================================| 100%
##  [1] 1 3 4 4 4 3 4 3 4 2 4 4 3 3 2 4 4 3 4 1 2 1 4 4 2 4 4 1 3 4 3 1 2 2 3 3 1 4
## [39] 4 1
hist(municipios$class, 
     main = "Pendiente reclasificada de Norte de Santander", 
     xlab = "Pendiente (y su categoría)")

#terra::hist(slope_perc)

Transformación de la pendiente a coordenadas geográficas

# This is the reclassified slope
(rc.geo = project(rc, "EPSG:4326"))
## class       : SpatRaster 
## size        : 145, 96, 1  (nrow, ncol, nlyr)
## resolution  : 0.01666675, 0.01666675  (x, y)
## extent      : -73.63711, -72.0371, 6.867916, 9.284596  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326) 
## source(s)   : memory
## name        : slope 
## min value   :     1 
## max value   :     5

Luego de obtener las coordenadas geográficas, estas se convierten a porcentaje de pendiente

# This is the percentage slope
(slope.geo = project(slope_perc, "EPSG:4326"))
## class       : SpatRaster 
## size        : 145, 96, 1  (nrow, ncol, nlyr)
## resolution  : 0.01666675, 0.01666675  (x, y)
## extent      : -73.63711, -72.0371, 6.867916, 9.284596  (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326) 
## source(s)   : memory
## name        :       slope 
## min value   :  0.02751734 
## max value   : 31.43915367

6.Representación gráfica de la pendiente del terreno

Al querer graficar los procedimientos hechos anteriormente, se genera un “mapa” interactivo, con la intención de visualizar la pendiente de los municipios en Norte de Santander. Es bastante útil ya que permite comprender las características topográficas de mejor manera y generar un material esencial para tomar decisiones relacionadas con el uso de los suelos y la planificación de actividades en el territorio.

Para la configuración del mapa interactivo, inicialmente se definen los colores para los diferentes niveles de la pendiente, usando el más bajo como aguamarina, y el más alto como rojo oscuro. Se identifican los límites municipales con un borde de coor gris, y la opacidad del relleno es de un 40%, además, al interactuar el mapa haciendo clic en algún municipio, se desplegará el cuadro emergente con el nombre del municipio y la clase de pendiente más frecuente.

# expand the number of colors to improve your visualization
# https://r-graph-gallery.com/42-colors-names.html
palredgreen <- colorNumeric(c("darkseagreen3","yellow2", "orange", "brown2", "darkred"), values(slope.geo),
  na.color = "transparent")
leaflet(municipios) %>% addTiles() %>% setView(-72.36, 6.99, 9.30) %>% 
    addPolygons(color = "gray", weight = 1.0, smoothFactor = 0.5,
    opacity = 0.4, fillOpacity = 0.10,
    popup = paste("Municipio: ", municipios$mpio_cnmbr, "<br>",
                          "Slope class: ", municipios$class, "<br>")) %>%
  addRasterImage(slope.geo, colors = palredgreen, opacity = 0.8)  %>%
  addLegend(pal = palredgreen, values = values(slope.geo),
    title = "Pendiente del Terreno en Norte de Santander (%)")
## 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'

7. Visualización alternativa de la pendiente en grados.

Se propone visualizar la pendiente del terreno en grados, junto con las etiquetas de cada municipio con el siguiente código, manteniendo las ventanas emergentes así: Incialmente se cambia de nuevo el sistema de coordenadas para que no se generen errores en la geometría

library(sf)
library(terra)
library(leaflet)
print(st_crs(municipios))
## Coordinate Reference System:
##   User input: MAGNA-SIRGAS 
##   wkt:
## GEOGCRS["MAGNA-SIRGAS",
##     DATUM["Marco Geocentrico Nacional de Referencia",
##         ELLIPSOID["GRS 1980",6378137,298.257222101,
##             LENGTHUNIT["metre",1]]],
##     PRIMEM["Greenwich",0,
##         ANGLEUNIT["degree",0.0174532925199433]],
##     CS[ellipsoidal,2],
##         AXIS["geodetic latitude (Lat)",north,
##             ORDER[1],
##             ANGLEUNIT["degree",0.0174532925199433]],
##         AXIS["geodetic longitude (Lon)",east,
##             ORDER[2],
##             ANGLEUNIT["degree",0.0174532925199433]],
##     USAGE[
##         SCOPE["Horizontal component of 3D system."],
##         AREA["Colombia - onshore and offshore. Includes San Andres y Providencia, Malpelo Islands, Roncador Bank, Serrana Bank and Serranilla Bank."],
##         BBOX[-4.23,-84.77,15.51,-66.87]],
##     ID["EPSG",4686]]
if (st_crs(municipios)$epsg != 4326) {
  municipios <- st_transform(municipios, crs = 4326)
}
print(terra::crs(slope.geo))
## [1] "GEOGCRS[\"WGS 84\",\n    ENSEMBLE[\"World Geodetic System 1984 ensemble\",\n        MEMBER[\"World Geodetic System 1984 (Transit)\"],\n        MEMBER[\"World Geodetic System 1984 (G730)\"],\n        MEMBER[\"World Geodetic System 1984 (G873)\"],\n        MEMBER[\"World Geodetic System 1984 (G1150)\"],\n        MEMBER[\"World Geodetic System 1984 (G1674)\"],\n        MEMBER[\"World Geodetic System 1984 (G1762)\"],\n        MEMBER[\"World Geodetic System 1984 (G2139)\"],\n        MEMBER[\"World Geodetic System 1984 (G2296)\"],\n        ELLIPSOID[\"WGS 84\",6378137,298.257223563,\n            LENGTHUNIT[\"metre\",1]],\n        ENSEMBLEACCURACY[2.0]],\n    PRIMEM[\"Greenwich\",0,\n        ANGLEUNIT[\"degree\",0.0174532925199433]],\n    CS[ellipsoidal,2],\n        AXIS[\"geodetic latitude (Lat)\",north,\n            ORDER[1],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n        AXIS[\"geodetic longitude (Lon)\",east,\n            ORDER[2],\n            ANGLEUNIT[\"degree\",0.0174532925199433]],\n    USAGE[\n        SCOPE[\"Horizontal component of 3D system.\"],\n        AREA[\"World.\"],\n        BBOX[-90,-180,90,180]],\n    ID[\"EPSG\",4326]]"
if (terra::crs(slope.geo, describe = TRUE)$code != 4326) { names(slope.geo) <- "slope"
 slope.geo <- terra::project(slope.geo, "EPSG:4326")
}

Calcular los centroides de los municipios luego de la transformación de las coordenadas:

centers <- st_centroid(municipios)
## Warning: st_centroid assumes attributes are constant over geometries

8.Representación de la visualización alternativa de la pendiente en grados.

Se propone el siguiente código para visualizar la pendiente en grados de forma alternativa, además, se agrega información adicional como el nombre de cada municipio y los valores medios de la pendiente.

palredgreen <- colorNumeric(palette = c("aquamarine","chartreuse","darkseagreen3","yellow2", "orange", "brown2","chocolate", "darkred"),
domain = values(slope.geo, na.rm = TRUE))
leaflet(municipios) %>%
  addTiles() %>%
  setView(lng = -72.36, lat =  6.99, zoom = 9.30) %>%
  addPolygons(color = "white", weight = 1.0, smoothFactor = 0.5,
              opacity = 0.25, fillOpacity = 0.15,
              popup = paste("Municipios: ", municipios$mpio_cnmbr, "<br>",
                            "Km2: ", municipios$area, "<br>",
                            "Pendiente media de Norte de Santander (grados): ", round(municipios$class, 2), "<br>")) %>%
  addLabelOnlyMarkers(data = centers,
                      lng = ~st_coordinates(centers)[,1], lat = ~st_coordinates(centers)[,2],
                      label = ~paste(mpio_cnmbr, " - ", round(municipios$class, 2), "°"),
                      labelOptions = labelOptions(noHide = TRUE, direction = 'top',
                                                  textOnly = TRUE, textsize = "10px")) %>%
  addRasterImage(slope.geo, colors = palredgreen, opacity = 0.9, project = FALSE) %>%
  addLegend(pal = palredgreen, values = values(slope.geo),
            title = "Pendiente de Norte de Santander (grados)")

El gráfico anterior representa la pendiente del departamento en grados, usando una paleta de colores que se maneja desde aguamarina para valores bajos y rojo oscuro para los valores más altos. Con la intención de dar mayor información, se agregan las etiquetas de los municipios, el valor promedio de la pendiente en grados y un cuadro emergente con detalles adicionales. Este tipo de representaciones ofrecen información útil para la toma de decisiones dentro de los territorios, enfocadas al análisis de riesgos, usos recomendados o posibles del terreno, planificación en temas de infraestructura vial, por ejemplo, para que se adapte integralmente a las condiciones del terreno. Y por último, pero no menos importante,la planeación y seleción de áreas para usos agrícolas y pecuarios.

9. Visualización del aspecto de Norte de Santander

A continuación, se presenta un código que permite visualizar las pendeintes del Chocó, usando un método plano, se aplican colores llamativos que permitan identificar las variaciones de las pendientes, todo esto, usando la librería Raster.

library(raster)
## Warning: package 'raster' was built under R version 4.5.1
## Cargando paquete requerido: sp
## Warning: package 'sp' was built under R version 4.5.1
library(leaflet)

# Definir la paleta de colores para el aspecto (orientación del terreno)
pal_aspect <- colorNumeric(
  palette = c("red", "orange", "yellow", "green", "cyan", "blue", "magenta", "purple"),
  domain = values(aspect),
  na.color = "transparent"
)

# Crear el mapa con Leaflet
leaflet(municipios) %>%
  addTiles() %>%
  setView(-72.36, 6.99, zoom = 9.30) %>%
  addPolygons(
    color = "gray", weight = 1.0, smoothFactor = 0.5,
    opacity = 0.4, fillOpacity = 0.10,
    popup = paste(
      "Municipios: ", municipios$mpio_cnmbr, "<br>",
      "Aspect (°): ", round(municipios$class, )
    )
  ) %>%
  addRasterImage(aspect, colors = pal_aspect, opacity = 0.8) %>%
  addLegend(
    pal = pal_aspect, values = values(aspect),
    title = "Aspecto del Terreno (°)"
  )

10.Conclusiones

La elevación del territorio en el departamento de Norte de Santander, Colombia, es el resultado de complejos procesos geológicos asociados a la dinámica tectónica de la región andina. Este territorio se encuentra en la zona de interacción entre las placas tectónicas de Nazca, Caribe y Suramericana, lo que ha dado lugar a la formación de la Cordillera Oriental de los Andes. El levantamiento orogénico en esta región ha sido impulsado por la subducción de la placa de Nazca bajo la placa Suramericana, generando un proceso de compresión y fracturación de la corteza terrestre que ha elevado grandes masas de roca a lo largo de millones de años. La interacción de fallas geológicas activas, como la Falla de Bucaramanga-Santa Marta y la de Chitagá, contribuye a la continua actividad sísmica y al modelado del relieve montañoso característico del departamento. Además de los procesos tectónicos, la erosión diferencial y la actividad volcánica han influido en la topografía de Norte de Santander. La acción de agentes externos como el agua y el viento ha esculpido el paisaje, favoreciendo la formación de valles y cañones profundos, como el del río Pamplonita. La existencia de depósitos sedimentarios en algunas áreas sugiere que el territorio ha experimentado variaciones en su elevación debido a la acumulación y erosión de materiales a lo largo del tiempo geológico. Los estudios geológicos han identificado la presencia de antiguas cuencas marinas que, debido a los movimientos tectónicos, fueron progresivamente levantadas.Desde un enfoque científico, la elevación de Norte de Santander también ha tenido efectos en su clima y biodiversidad. Los diferentes pisos térmicos que resultan de la variación altitudinal han generado una diversidad de ecosistemas, desde bosques húmedos tropicales en las zonas bajas hasta páramos en las áreas más elevadas. Esta variabilidad geográfica ha permitido el desarrollo de una flora y fauna adaptada a distintas condiciones ambientales. Asimismo, los cambios en la altitud han influido en los patrones de precipitación y temperatura, haciendo que algunas zonas sean más propensas a la erosión y graduales. En conclusión, la elevación de Norte de Santander es el producto de una interacción compleja entre procesos geológicos internos y externos que han moldeado su alivio a lo largo de millones de años.

Bibliografía

Lizarazo, I., 2025. Geomorphometric terrain attributes in R. Available at https://rpubs.com/ials2un/geomorphometric