El estudio de las características del terreno, como la pendiente y el aspecto, es fundamental en disciplinas como la geología, la geomorfología, y en este caso la agronomía. La pendiente indica el grado de inclinación de la superficie terrestre, mientras que el aspecto representa la dirección cardinal hacia la que está orientada dicha inclinación. En Colombia, y particularmente en el departamento de Santander, estos factores influyen en el uso del suelo, la conservación de ecosistemas y la planificación urbana y rural.
Para este análisis, se utilizaron herramientas de SIG en el lenguaje R, junto con paquetes especializados para el manejo de datos espaciales. Este documento presenta el proceso de cálculo y análisis de la pendiente y el aspecto a partir de un Modelo Digital de Elevaciones (DEM) en Santander, Colombia.
Es importante la eliminación de objetos previos en R para asegurar unn procesamiento limpio de los códigos.
rm(list=ls())
Las siguientes son las librerias necesarias:
-elevatr: Permitira obtener datos de elevación de distintas fuentes en línea y descargar modelos digitales de elevación de una zona específica.
-sf: Facilitara la lectura, manipulación y transformación de datos geográficos en formatos como (.gpkg), tambien para leer los límites municipales desde dpto_santander.gpkg.
-leaflet: Permitira mostrar mapas con los valores de pendiente en porcentaje y agregar datos espaciales en capas, definir estilos, colores y etiquetas.
-MultiscaleDTM: Permitira análizar modelos digitales de terreno, calcular atributos como lo son pendiente y aspecto.
-exactextractr: Extrae estadísticas de valores raster dentro de áreas vectoriales con alta precisión. Se usa para calcular la pendiente media dentro de los límites de cada municipio de Santander.
library(elevatr)
library(sf)
library(leaflet)
library(terra)
library(MultiscaleDTM)
library(exactextractr)
Se carga el DEM, que representa la altitud del terreno en una matriz de celdas del departamento de Santander.
(dem = terra::rast("datos/elevacion_santander.tif"))
## class : SpatRaster
## dimensions : 292, 245, 1 (nrow, ncol, nlyr)
## resolution : 0.008333333, 0.008333333 (x, y)
## extent : -74.525, -72.48333, 5.708333, 8.141667 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84
## source : elevacion_santander.tif
## name : elevacion_santander
## min value : 37
## max value : 4322
Usando la libreria “sf”, se cargarn los archivos vectoriales que representan los municipios.
(munic <- sf::st_read("datos/dpto_santander.gpkg"))
## Reading layer `dpto_santandercorr' from data source
## `C:\Users\lausi\OneDrive\Documents\2024-2\GEOMATICA\GB02\Proyecto R\datos\dpto_santander.gpkg'
## using driver `GPKG'
## Simple feature collection with 87 features and 5 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.52895 ymin: 5.707536 xmax: -72.47706 ymax: 8.14501
## Geodetic CRS: MAGNA-SIRGAS
Para optimizar el procesamiento de los datos.
dem2=terra::aggregate(dem,2, "mean")
Se recorta dem2, para extraer solo la región de interes.
dem3 = terra::crop(dem2,munic, mask=TRUE)
Reproyectar las coordenadas al Sistema Colombiano de Coordenadas (EPSG:9377)
(dem_plane=project(dem3,"EPSG:9377"))
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 1841.27, 1841.27 (x, y)
## extent : 4831189, 5057666, 2189140, 2457965 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : elevacion_santander
## min value : 38.70399
## max value : 4172.91113
(munic_plane = sf::st_transform(munic, "EPSG:9377"))
La pendiente mide la inclinación del terreno en grados o porcentaje. En Colombia, la variabilidad topográfica es extrema, con zonas de alta pendiente en la Cordillera Oriental y terrenos planos en la Orinoquía. La pendiente influye en la erosión del suelo, la distribución del agua y la estabilidad de las construcciones.
El aspecto indica la dirección hacia la que está orientada la pendiente. En Colombia, esto es relevante en la gestión de ecosistemas, ya que influye en la insolación, la humedad del suelo y la vegetación dominante.
Se calcula la pendiente y aspecto.
(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
## dimensions : 146, 123, 2 (nrow, ncol, nlyr)
## resolution : 1841.27, 1841.27 (x, y)
## extent : 4831189, 5057666, 2189140, 2457965 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## names : slope, aspect
## min values : 0.002031721, 0.09411775
## max values : 18.348005492, 359.98103122
Se extrae y visualiza la capa de pendiente del objeto slp_asp
(slope = subset(slp_asp, 1))
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 1841.27, 1841.27 (x, y)
## extent : 4831189, 5057666, 2189140, 2457965 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.002031721
## max value : 18.348005492
Visualizar los valores de pendiente.
terra::hist(slope,
main = "Pendiente de Santander",
xlab = "Slope (in degrees)")
Se extrae y visualiza la capa de aspecto del objeto slp_asp.
(aspect =subset(slp_asp, 2))
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 1841.27, 1841.27 (x, y)
## extent : 4831189, 5057666, 2189140, 2457965 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : aspect
## min value : 0.09411775
## max value : 359.98103122
Visualizar los datos de aspecto
terra::hist(aspect,
main = "Aspecto de Santander",
xlab = "Aspect (in degrees)")
(slope_perc = tan(slope*(pi/180))*100)
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 1841.27, 1841.27 (x, y)
## extent : 4831189, 5057666, 2189140, 2457965 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.003546021
## max value : 33.164813179
Visualizar nuevamente pendiente en porcentaje
terra::hist(slope_perc,
main = "Pendiente de Santander",
xlab = "Slope (in percentage)")
knitr::include_graphics("pediente_colombia.png")
Se reclasifica en categorias basadas en la clasificación y escala de colores.
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)
Se calcula la pendiente media para cada municipio y se visualiza.
(munic$mean_slope <- exactextractr::exact_extract(slope_perc, munic, 'mean'))
## | | | 0% | |= | 1% | |== | 2% | |== | 3% | |=== | 5% | |==== | 6% | |===== | 7% | |====== | 8% | |====== | 9% | |======= | 10% | |======== | 11% | |========= | 13% | |========== | 14% | |========== | 15% | |=========== | 16% | |============ | 17% | |============= | 18% | |============== | 20% | |============== | 21% | |=============== | 22% | |================ | 23% | |================= | 24% | |================== | 25% | |=================== | 26% | |=================== | 28% | |==================== | 29% | |===================== | 30% | |====================== | 31% | |======================= | 32% | |======================= | 33% | |======================== | 34% | |========================= | 36% | |========================== | 37% | |=========================== | 38% | |=========================== | 39% | |============================ | 40% | |============================= | 41% | |============================== | 43% | |=============================== | 44% | |=============================== | 45% | |================================ | 46% | |================================= | 47% | |================================== | 48% | |=================================== | 49% | |=================================== | 51% | |==================================== | 52% | |===================================== | 53% | |====================================== | 54% | |======================================= | 55% | |======================================= | 56% | |======================================== | 57% | |========================================= | 59% | |========================================== | 60% | |=========================================== | 61% | |=========================================== | 62% | |============================================ | 63% | |============================================= | 64% | |============================================== | 66% | |=============================================== | 67% | |=============================================== | 68% | |================================================ | 69% | |================================================= | 70% | |================================================== | 71% | |=================================================== | 72% | |=================================================== | 74% | |==================================================== | 75% | |===================================================== | 76% | |====================================================== | 77% | |======================================================= | 78% | |======================================================== | 79% | |======================================================== | 80% | |========================================================= | 82% | |========================================================== | 83% | |=========================================================== | 84% | |============================================================ | 85% | |============================================================ | 86% | |============================================================= | 87% | |============================================================== | 89% | |=============================================================== | 90% | |================================================================ | 91% | |================================================================ | 92% | |================================================================= | 93% | |================================================================== | 94% | |=================================================================== | 95% | |==================================================================== | 97% | |==================================================================== | 98% | |===================================================================== | 99% | |======================================================================| 100%
## [1] 8.5961952 10.2262630 11.5775385 11.1763353 5.1169653 8.9878035
## [7] 0.4011796 9.5779610 5.2203121 8.7554998 15.5300531 16.1785126
## [13] 13.2195787 16.3794708 9.8711424 7.6783285 12.9632902 12.1816616
## [19] 10.0960360 0.9872550 11.8313122 4.7065201 12.3607206 11.7571850
## [25] 6.8785210 8.3520813 10.6374464 11.4932461 9.0089846 12.1109695
## [31] 14.7372274 11.7109289 12.7455320 15.7045774 6.8999715 7.6205020
## [37] 11.5254173 5.8316870 7.5713325 2.9738533 3.6705849 12.9072342
## [43] 6.3842149 15.1315145 11.1639690 7.6971846 7.9108424 5.7200704
## [49] 9.8601027 13.1644440 15.7395544 11.2217131 7.5197940 16.0861111
## [55] 6.0728612 4.1395965 11.7794142 9.6467056 7.7013807 7.3309479
## [61] 11.4358091 8.3190975 6.9305234 0.5666540 0.2218978 4.2022219
## [67] 0.4335837 15.9248524 4.6469350 6.3672614 10.0372496 18.1386452
## [73] 14.4555302 6.0370531 14.5291405 11.4257183 5.2277617 8.2664986
## [79] 5.3082895 10.3270292 13.4274807 10.8076439 5.9068298 7.1984749
## [85] 14.9902325 5.6518388 11.8875523
hist(munic$mean_slope,
main = "Pendiente media de Santander",
xlab = "Slope (in percentage)")
Se reclasifica la pendiente en categorías.
(munic$class <- exactextractr::exact_extract(rc, munic, 'mode'))
## | | | 0% | |= | 1% | |== | 2% | |== | 3% | |=== | 5% | |==== | 6% | |===== | 7% | |====== | 8% | |====== | 9% | |======= | 10% | |======== | 11% | |========= | 13% | |========== | 14% | |========== | 15% | |=========== | 16% | |============ | 17% | |============= | 18% | |============== | 20% | |============== | 21% | |=============== | 22% | |================ | 23% | |================= | 24% | |================== | 25% | |=================== | 26% | |=================== | 28% | |==================== | 29% | |===================== | 30% | |====================== | 31% | |======================= | 32% | |======================= | 33% | |======================== | 34% | |========================= | 36% | |========================== | 37% | |=========================== | 38% | |=========================== | 39% | |============================ | 40% | |============================= | 41% | |============================== | 43% | |=============================== | 44% | |=============================== | 45% | |================================ | 46% | |================================= | 47% | |================================== | 48% | |=================================== | 49% | |=================================== | 51% | |==================================== | 52% | |===================================== | 53% | |====================================== | 54% | |======================================= | 55% | |======================================= | 56% | |======================================== | 57% | |========================================= | 59% | |========================================== | 60% | |=========================================== | 61% | |=========================================== | 62% | |============================================ | 63% | |============================================= | 64% | |============================================== | 66% | |=============================================== | 67% | |=============================================== | 68% | |================================================ | 69% | |================================================= | 70% | |================================================== | 71% | |=================================================== | 72% | |=================================================== | 74% | |==================================================== | 75% | |===================================================== | 76% | |====================================================== | 77% | |======================================================= | 78% | |======================================================== | 79% | |======================================================== | 80% | |========================================================= | 82% | |========================================================== | 83% | |=========================================================== | 84% | |============================================================ | 85% | |============================================================ | 86% | |============================================================= | 87% | |============================================================== | 89% | |=============================================================== | 90% | |================================================================ | 91% | |================================================================ | 92% | |================================================================= | 93% | |================================================================== | 94% | |=================================================================== | 95% | |==================================================================== | 97% | |==================================================================== | 98% | |===================================================================== | 99% | |======================================================================| 100%
## [1] 3 4 4 4 2 3 1 4 1 4 4 4 4 4 3 3 4 4 3 1 4 2 4 4 2 1 4 2 3 4 4 3 4 4 2 3 3 2
## [39] 3 1 2 4 2 4 4 3 2 2 3 4 4 4 2 4 2 2 4 3 3 3 4 2 3 1 1 1 1 4 2 2 4 4 4 1 4 4
## [77] 1 3 2 2 4 4 3 2 4 1 4
Visualizar reclasificacion de pendiente
hist(munic$class,
main = "Pendiente reclacificada de Santander",
xlab = "Slope (as a category)")
Se reproyecta la raster reclasificada a las coordenadas originales para compatibilidad con otros datos.
(rc.geo = project(rc, "EPSG:4326"))
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 0.01666669, 0.01666669 (x, y)
## extent : -74.53284, -72.48283, 5.711195, 8.144531 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 1
## max value : 5
Reproyectar porcentaje de pendiente
(slope.geo = project(slope_perc, "EPSG:4326"))
## class : SpatRaster
## dimensions : 146, 123, 1 (nrow, ncol, nlyr)
## resolution : 0.01666669, 0.01666669 (x, y)
## extent : -74.53284, -72.48283, 5.711195, 8.144531 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 0.003546021
## max value : 31.476469040
Usando la paleta “colorNumeric” para la pendiente
palredgreen <- colorNumeric(c("darkolivegreen4","cyan3", "darkgoldenrod1", "darkred", "chocolate4"), values(slope.geo),
na.color = "transparent")
Visualizar la pendiente (%), ajustando los valores para Santander
leaflet(munic) %>% addTiles() %>% setView(-72.8, 6.9, 8.3) %>%
addPolygons(color = "gray", weight = 1.0, smoothFactor = 0.5,
opacity = 0.4, fillOpacity = 0.10,
popup = paste("Municipio: ", munic$mpio_cnmbr, "<br>",
"Slope class: ", munic$class, "<br>")) %>%
addRasterImage(slope.geo, colors = palredgreen, opacity = 0.8) %>%
addLegend(pal = palredgreen, values = values(slope.geo),
title = "Pendiente en 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'
slope_deg <- atan(slope*(pi/180)) * (180/pi)
munic$mean_slope_deg <- exactextractr::exact_extract(slope_deg, munic, 'mean')
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
## | | | 0% | |= | 1% | |== | 2% | |== | 3% | |=== | 5% | |==== | 6% | |===== | 7% | |====== | 8% | |====== | 9% | |======= | 10% | |======== | 11% | |========= | 13% | |========== | 14% | |========== | 15% | |=========== | 16% | |============ | 17% | |============= | 18% | |============== | 20% | |============== | 21% | |=============== | 22% | |================ | 23% | |================= | 24% | |================== | 25% | |=================== | 26% | |=================== | 28% | |==================== | 29% | |===================== | 30% | |====================== | 31% | |======================= | 32% | |======================= | 33% | |======================== | 34% | |========================= | 36% | |========================== | 37% | |=========================== | 38% | |=========================== | 39% | |============================ | 40% | |============================= | 41% | |============================== | 43% | |=============================== | 44% | |=============================== | 45% | |================================ | 46% | |================================= | 47% | |================================== | 48% | |=================================== | 49% | |=================================== | 51% | |==================================== | 52% | |===================================== | 53% | |====================================== | 54% | |======================================= | 55% | |======================================= | 56% | |======================================== | 57% | |========================================= | 59% | |========================================== | 60% | |=========================================== | 61% | |=========================================== | 62% | |============================================ | 63% | |============================================= | 64% | |============================================== | 66% | |=============================================== | 67% | |=============================================== | 68% | |================================================ | 69% | |================================================= | 70% | |================================================== | 71% | |=================================================== | 72% | |=================================================== | 74% | |==================================================== | 75% | |===================================================== | 76% | |====================================================== | 77% | |======================================================= | 78% | |======================================================== | 79% | |======================================================== | 80% | |========================================================= | 82% | |========================================================== | 83% | |=========================================================== | 84% | |============================================================ | 85% | |============================================================ | 86% | |============================================================= | 87% | |============================================================== | 89% | |=============================================================== | 90% | |================================================================ | 91% | |================================================================ | 92% | |================================================================= | 93% | |================================================================== | 94% | |=================================================================== | 95% | |==================================================================== | 97% | |==================================================================== | 98% | |===================================================================== | 99% | |======================================================================| 100%
Usando “colorNumeric”
palSlopeDegrees <- colorNumeric(palette = c("darkolivegreen4", "cyan3", "darkgoldenrod1", "darkred", "chocolate4"),domain = range (values(slope.geo), na.rm = TRUE), na.color = "transparent")
Se calculan las coordenadas de los centroides de cada municipio y se añaden al dataset.
munic <- st_as_sf(munic)
centroides <- st_centroid(munic)
munic$longitude <- st_coordinates(centroides)[, 1]
munic$latitude <- st_coordinates(centroides)[, 2]
head(munic[, c("mpio_cnmbr", "longitude", "latitude")])
leaflet(munic) %>%
addTiles() %>%
setView(-72.8, 6.9, 8.3) %>%
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>",
"pendiente promedio: ", round(munic$mean_slope_deg, 1), "°", "<br>")) %>%
addRasterImage(slope.geo, colors = palredgreen, opacity = 0.8) %>%
addLegend(pal = palredgreen, values = values(slope.geo),
title = "Pendiente en Santander (%)") %>%
addLabelOnlyMarkers(
lng = munic$longitude,
lat = munic$latitude, #
label = paste(munic$mpio_cnmbr, ": ", round(munic$mean_slope_deg, 1), "°", sep = ""),
labelOptions = labelOptions (noHide = TRUE, direction = "auto", textOnly = TRUE, style = list( "font-size" = "7px", "font-weight" = "bold", "color" = "black", "text-shadow" = "0.5px 0.5px white")))
Usando colorNumeric
pal_aspect <- colorNumeric(
palette = c("gray", "red", "orange", "yellow", "green", "cyan", "blue", "purple", "brown"),
domain = values(aspect),
na.color = "transparent"
)
aspect_values <- c(-1, 0, 22.5, 67.5, 112.5, 157.5, 202.5, 247.5, 292.5, 337.5)
Finalmente, obtenemos el mapa de aspecto de Santander
leaflet(munic) %>%
addTiles() %>%
setView(-72.8, 6.9, 8.3) %>%
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(aspect, colors = pal_aspect, opacity = 0.8) %>%
addLegend(pal = pal_aspect, values = values(aspect),
title = "Aspecto Santander (Grados)", opacity = 0.7) %>%
addControl(
html = "<div style='background-color: white; padding: 10px; border-radius: 5px; border: 2px solid black; opacity: 0.8; font-size: 14px;'>
<b>Direction Legend</b><br>
<span style='color: red;'>North (0-22.5)</span><br>
<span style='color: orange;'>Northeast (22.5-67.5)</span><br>
<span style='color: yellow;'>East (67.5-112.5)</span><br>
<span style='color: green;'>Southeast (112.5-157.5)</span><br>
<span style='color: cyan;'>South (157.5-202.5)</span><br>
<span style='color: blue;'>Southwest (202.5-247.5)</span><br>
<span style='color: purple;'>West (247.5-292.5)</span><br>
<span style='color: brown;'>North (337.5-360)</span><br>
</div>",
position = "bottomright",
className = "leaflet-control-legend"
)
En Santander, predominan las pendientes suaves en valles y zonas planas, facilitando la agricultura y la construcción. Sin embargo, en áreas montañosas, las pendientes son más pronunciadas, lo que requiere técnicas especiales de manejo del suelo. La pendiente puede expresarse en grados o porcentaje, siendo útil en diferentes contextos. En general, las pendientes más altas alcanzan valores cercanos al 18° o 33% en porcentaje.
A nivel municipal, Bucaramanga presenta pendientes moderadas (5-10%), con un aspecto predominante hacia el noreste. Barrancabermeja, con pendientes bajas (1-5%). Floridablanca, con pendientes entre 7-15%, mientras que Socorro, con inclinaciones entre 10-20%. Estos factores influyen en la planificación territorial, afectando la agricultura, la urbanización y la gestión de riesgos como deslizamientos de tierra.
En el aspecto del terrreno podemos ver patrones distintivos en los diferentes municipios. En Cúcuta, por ejemplo, predomina la orientación hacia el noreste y este, influyendo en la exposición solar y el microclima local, beneficioso para la agricultura. Pamplona presenta una variedad de aspectos, con áreas orientadas hacia el norte, noroeste y suroeste, con un terreno montañoso que presenta desafíos y oportunidades para la agricultura y la construcción. En Bucaramanga, la orientación hacia el noreste y sureste afecta la distribución de vegetación y el desarrollo urbano.
Lizarazo, I., 2025. Geomorphometric terrain attributes in R. Disponible en https://rpubs.com/ials2un/geomorphometric
sessionInfo()
## R version 4.4.2 (2024-10-31 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 11 x64 (build 22631)
##
## Matrix products: default
##
##
## locale:
## [1] LC_COLLATE=English_United States.utf8
## [2] LC_CTYPE=English_United States.utf8
## [3] LC_MONETARY=English_United States.utf8
## [4] LC_NUMERIC=C
## [5] LC_TIME=English_United States.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_0.9 terra_1.8-10
## [4] leaflet_2.2.2 sf_1.0-19 elevatr_0.99.0
##
## loaded via a namespace (and not attached):
## [1] s2_1.1.7 sass_0.4.9 generics_0.1.3 class_7.3-22
## [5] KernSmooth_2.23-24 lattice_0.22-6 digest_0.6.37 magrittr_2.0.3
## [9] rgl_1.3.17 evaluate_1.0.1 grid_4.4.2 fastmap_1.2.0
## [13] jsonlite_1.8.9 e1071_1.7-16 DBI_1.2.3 promises_1.3.2
## [17] purrr_1.0.2 scales_1.3.0 crosstalk_1.2.1 codetools_0.2-20
## [21] jquerylib_0.1.4 cli_3.6.3 shiny_1.10.0 rlang_1.1.4
## [25] units_0.8-5 munsell_0.5.1 base64enc_0.1-3 cachem_1.1.0
## [29] yaml_2.3.10 raster_3.6-31 tools_4.4.2 dplyr_1.1.4
## [33] colorspace_2.1-1 httpuv_1.6.15 png_0.1-8 vctrs_0.6.5
## [37] R6_2.5.1 mime_0.12 proxy_0.4-27 lifecycle_1.0.4
## [41] classInt_0.4-11 htmlwidgets_1.6.4 pkgconfig_2.0.3 progressr_0.15.1
## [45] bslib_0.8.0 pillar_1.10.0 later_1.4.1 glue_1.8.0
## [49] Rcpp_1.0.14 tidyselect_1.2.1 xfun_0.49 tibble_3.2.1
## [53] rstudioapi_0.17.1 knitr_1.49 farver_2.1.2 xtable_1.8-4
## [57] htmltools_0.5.8.1 rmarkdown_2.29 wk_0.9.4 compiler_4.4.2
## [61] sp_2.1-4