Este cuaderno ilustra como calcular atributos geomorfometricos del terreno apartir de modelos de elevacion digitales cuadriculados. su objetivo es ilustrar conceptos y herramientas basicas de geoinformatica.
rm(list=ls())
library(elevatr)
library(sf)
library(leaflet)
library(terra)
library(exactextractr)
library(MultiscaleDTM)
Este conjunto de operaciones está orientado a la preparación y transformación de datos espaciales para análisis geoespacial en el Departamento de Sucre, trabajando con modelos digitales de elevación (DEM) y datos vectoriales de municipios. Los pasos incluyen la lectura y agregación del DEM, recorte del raster a los límites de los municipios, y transformación de ambos tipos de datos a sistemas de coordenadas específicos.
(dem = terra::rast("Sucre/dpto_sucre_elevacion.tif"))
## class : SpatRaster
## dimensions : 223, 140, 1 (nrow, ncol, nlyr)
## resolution : 0.008333333, 0.008333333 (x, y)
## extent : -75.7, -74.53333, 8.283333, 10.14167 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84
## source : dpto_sucre_elevacion.tif
## name : dpto_sucre_elevacion
dem2 = terra::aggregate(dem,2, "mean")
munic <- sf::st_read("Sucre/Mun_Sucre.gpkg")
## Reading layer `mapa' from data source
## `C:\Users\carlo\Desktop\GB2-EXAMEN\SUCRE\Mun_Sucre.gpkg' using driver `GPKG'
## Simple feature collection with 26 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -75.70603 ymin: 8.277882 xmax: -74.53271 ymax: 10.14548
## Geodetic CRS: MAGNA-SIRGAS
munic
## Simple feature collection with 26 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -75.70603 ymin: 8.277882 xmax: -74.53271 ymax: 10.14548
## Geodetic CRS: MAGNA-SIRGAS
## First 10 features:
## dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr mpio_cnmbr
## 1 70 001 70001 SUCRE SINCELEJO
## 2 70 110 70110 SUCRE BUENAVISTA
## 3 70 124 70124 SUCRE CAIMITO
## 4 70 204 70204 SUCRE COLOSÓ
## 5 70 215 70215 SUCRE COROZAL
## 6 70 221 70221 SUCRE COVEÑAS
## 7 70 230 70230 SUCRE CHALÁN
## 8 70 233 70233 SUCRE EL ROBLE
## 9 70 235 70235 SUCRE GALERAS
## 10 70 265 70265 SUCRE GUARANDA
## mpio_crslc mpio_tipo
## 1 Ley 47 de Agosto 30 de 1966 MUNICIPIO
## 2 Ordenanza 9 del 5 de Noviembre de 1968 MUNICIPIO
## 3 Ordenanza 58 de Abril 28 de 1914 MUNICIPIO
## 4 1907 MUNICIPIO
## 5 Ley 44 de 1876 MUNICIPIO
## 6 Decreto 0063 de febrero 07 de 2002 MUNICIPIO
## 7 Ordenanza 6 de Octubre 30 de 1968 MUNICIPIO
## 8 Decreto 356 de 98, fallo 5 de Mayo de 99 y Sentencia del 17 MUNICIPIO
## 9 Ordenanza 4 de Octubre 15 de 1968 MUNICIPIO
## 10 Ordenanza 2 de Octubre 31 de 1984 MUNICIPIO
## mpio_narea mpio_nano shape_Leng shape_Area geom
## 1 279.69771 2023 1.1431571 0.023005955 MULTIPOLYGON (((-75.49687 9...
## 2 146.47566 2023 0.8805553 0.012052022 MULTIPOLYGON (((-74.93518 9...
## 3 412.46981 2023 1.1794901 0.033885959 MULTIPOLYGON (((-75.19855 8...
## 4 131.16269 2023 0.7882677 0.010795532 MULTIPOLYGON (((-75.3837 9....
## 5 286.11257 2023 1.4119720 0.023529464 MULTIPOLYGON (((-75.28363 9...
## 6 56.55515 2023 0.4268842 0.004651922 MULTIPOLYGON (((-75.60529 9...
## 7 83.71001 2023 0.5720244 0.006890902 MULTIPOLYGON (((-75.35705 9...
## 8 198.43440 2023 1.2342195 0.016314220 MULTIPOLYGON (((-75.13801 9...
## 9 321.85643 2023 1.1237950 0.026468388 MULTIPOLYGON (((-74.93398 9...
## 10 361.86764 2023 1.4238869 0.029704319 MULTIPOLYGON (((-74.56933 8...
dem3 = terra::crop(dem2,munic, mask=TRUE)
(dem_plane = project(dem3, "EPSG:9377"))
## class : SpatRaster
## dimensions : 113, 70, 1 (nrow, ncol, nlyr)
## resolution : 1839.834, 1839.834 (x, y)
## extent : 4702678, 4831466, 2472003, 2679904 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : dpto_sucre_elevacion
## min value : 1.59552
## max value : 530.25793
(munic_plane = sf::st_transform(munic, "EPSG:4326"))
## Simple feature collection with 26 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -75.70603 ymin: 8.277882 xmax: -74.53271 ymax: 10.14548
## Geodetic CRS: WGS 84
## First 10 features:
## dpto_ccdgo mpio_ccdgo mpio_cdpmp dpto_cnmbr mpio_cnmbr
## 1 70 001 70001 SUCRE SINCELEJO
## 2 70 110 70110 SUCRE BUENAVISTA
## 3 70 124 70124 SUCRE CAIMITO
## 4 70 204 70204 SUCRE COLOSÓ
## 5 70 215 70215 SUCRE COROZAL
## 6 70 221 70221 SUCRE COVEÑAS
## 7 70 230 70230 SUCRE CHALÁN
## 8 70 233 70233 SUCRE EL ROBLE
## 9 70 235 70235 SUCRE GALERAS
## 10 70 265 70265 SUCRE GUARANDA
## mpio_crslc mpio_tipo
## 1 Ley 47 de Agosto 30 de 1966 MUNICIPIO
## 2 Ordenanza 9 del 5 de Noviembre de 1968 MUNICIPIO
## 3 Ordenanza 58 de Abril 28 de 1914 MUNICIPIO
## 4 1907 MUNICIPIO
## 5 Ley 44 de 1876 MUNICIPIO
## 6 Decreto 0063 de febrero 07 de 2002 MUNICIPIO
## 7 Ordenanza 6 de Octubre 30 de 1968 MUNICIPIO
## 8 Decreto 356 de 98, fallo 5 de Mayo de 99 y Sentencia del 17 MUNICIPIO
## 9 Ordenanza 4 de Octubre 15 de 1968 MUNICIPIO
## 10 Ordenanza 2 de Octubre 31 de 1984 MUNICIPIO
## mpio_narea mpio_nano shape_Leng shape_Area geom
## 1 279.69771 2023 1.1431571 0.023005955 MULTIPOLYGON (((-75.49687 9...
## 2 146.47566 2023 0.8805553 0.012052022 MULTIPOLYGON (((-74.93518 9...
## 3 412.46981 2023 1.1794901 0.033885959 MULTIPOLYGON (((-75.19855 8...
## 4 131.16269 2023 0.7882677 0.010795532 MULTIPOLYGON (((-75.3837 9....
## 5 286.11257 2023 1.4119720 0.023529464 MULTIPOLYGON (((-75.28363 9...
## 6 56.55515 2023 0.4268842 0.004651922 MULTIPOLYGON (((-75.60529 9...
## 7 83.71001 2023 0.5720244 0.006890902 MULTIPOLYGON (((-75.35705 9...
## 8 198.43440 2023 1.2342195 0.016314220 MULTIPOLYGON (((-75.13801 9...
## 9 321.85643 2023 1.1237950 0.026468388 MULTIPOLYGON (((-74.93398 9...
## 10 361.86764 2023 1.4238869 0.029704319 MULTIPOLYGON (((-74.56933 8...
El análisis de la pendiente del terreno es esencial para comprender la inclinación del terreno y su relación con otros factores geográficos y ambientales. En este análisis, se calcula la pendiente y el aspecto del terreno en el Departamento de Sucre a partir de un modelo digital de terreno (DTM).
Primero, se utilizan herramientas avanzadas como el paquete MultiscaleDTM para calcular la pendiente y el aspecto utilizando un vecindario de 3x3 y un método de vecindad “queen”, lo que permite obtener una representación detallada de la inclinación y la dirección del terreno en grados.
El histograma generado muestra la distribución de los valores de pendiente en el Departamento de Sucre, proporcionando una visualización de cómo varían las inclinaciones del terreno a lo largo de la región. Este tipo de análisis es crucial para la gestión del territorio, la agricultura, la ingeniería civil y la evaluación de riesgos naturales, como deslizamientos de tierra o inundaciones.
(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 : 113, 70, 2 (nrow, ncol, nlyr)
## resolution : 1839.834, 1839.834 (x, y)
## extent : 4702678, 4831466, 2472003, 2679904 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## names : slope, aspect
## min values : 0.0009308692, 0.01101528
## max values : 4.4821872704, 359.92884285
(slope = subset(Slp_asp, 1))
## class : SpatRaster
## dimensions : 113, 70, 1 (nrow, ncol, nlyr)
## resolution : 1839.834, 1839.834 (x, y)
## extent : 4702678, 4831466, 2472003, 2679904 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.0009308692
## max value : 4.4821872704
terra::hist(slope, main = "Sucre's slope",
xlab = "slope (in degrees)")
El aspecto del terreno se refiere a la dirección en la que una pendiente se orienta, medido en grados, y es un factor importante en la determinación de las condiciones ambientales y climáticas de una región. En el Departamento de Sucre, el análisis del aspecto permite identificar cómo se distribuyen las direcciones del terreno en la región, lo que es útil para estudiar la exposición al sol, el flujo de agua, y otros factores geográficos.
(aspect = subset(Slp_asp, 2))
## class : SpatRaster
## dimensions : 113, 70, 1 (nrow, ncol, nlyr)
## resolution : 1839.834, 1839.834 (x, y)
## extent : 4702678, 4831466, 2472003, 2679904 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : aspect
## min value : 0.01101528
## max value : 359.92884285
terra::hist(aspect,
main = "Sucre's aspect",
xlab = "aspect (in degrees)")
Este análisis tiene como objetivo convertir la pendiente del terreno del Departamento de Sucre de grados a porcentaje y luego clasificarla en categorías de acuerdo con la intensidad de la pendiente. La conversión a porcentaje facilita la comprensión de la inclinación del terreno, mientras que la clasificación permite agrupar las pendientes en diferentes rangos que pueden ser útiles para estudios de riesgo, planificación territorial y uso del suelo.
(slope_perc = tan(slope * (pi/180)) * 100)
## class : SpatRaster
## dimensions : 113, 70, 1 (nrow, ncol, nlyr)
## resolution : 1839.834, 1839.834 (x, y)
## extent : 4702678, 4831466, 2472003, 2679904 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.001624673
## max value : 7.838889804
plot(slope_perc)
terra::hist(slope_perc,
main = "Sucre's slope",
xlab = "slope (in percentage)")
rc <- classify(slope_perc, c(0, 3, 7, 12, 25, 50, 75), include.lowest=TRUE, brackets=TRUE )
Este análisis muestra la distribución de la pendiente promedio en porcentaje del Departamento de Sucre. Primero, se clasifican las pendientes del terreno en diferentes categorías utilizando rangos específicos, lo que permite asignar a cada área una clase de pendiente según su valor. Luego, se calcula la pendiente promedio de cada municipio, lo que ofrece una visión general de las variaciones topográficas en la región.
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)
(munic$mean_slope <- exactextractr::exact_extract(slope_perc, munic, 'mean'))
## | | | 0% | |=== | 4% | |===== | 8% | |======== | 12% | |=========== | 15% | |============= | 19% | |================ | 23% | |=================== | 27% | |====================== | 31% | |======================== | 35% | |=========================== | 38% | |============================== | 42% | |================================ | 46% | |=================================== | 50% | |====================================== | 54% | |======================================== | 58% | |=========================================== | 62% | |============================================== | 65% | |================================================ | 69% | |=================================================== | 73% | |====================================================== | 77% | |========================================================= | 81% | |=========================================================== | 85% | |============================================================== | 88% | |================================================================= | 92% | |=================================================================== | 96% | |======================================================================| 100%
## [1] 0.99318403 0.38188815 0.17414238 3.35606384 0.46806931 0.32033587
## [7] 4.02443218 0.34662846 0.33519977 0.04102257 0.38929290 0.72070783
## [13] 0.02801267 0.92830676 1.41653001 0.42902663 0.54026157 0.10614514
## [19] 0.55798924 0.17493942 0.70880634 0.65105468 0.45322528 0.02788872
## [25] 0.24941583 1.30437350
hist(munic$mean_slope,
main = "Sucre's mean slope",
xlab = "slope (in percentage)")
El histograma de la distribución de las clases de pendiente es una herramienta visual que permite entender cómo se distribuyen las diferentes categorías de pendiente en el Departamento de Sucre. Este análisis se basa en la clasificación de la pendiente del terreno, que puede incluir rangos como pendiente baja, media o alta. Mediante este histograma, se puede observar cuántas áreas (por ejemplo, municipios) pertenecen a cada una de estas categorías, lo que proporciona información valiosa sobre la topografía de la región.
(munic$class <- exactextractr::exact_extract(rc, munic, 'mode'))
## | | | 0% | |=== | 4% | |===== | 8% | |======== | 12% | |=========== | 15% | |============= | 19% | |================ | 23% | |=================== | 27% | |====================== | 31% | |======================== | 35% | |=========================== | 38% | |============================== | 42% | |================================ | 46% | |=================================== | 50% | |====================================== | 54% | |======================================== | 58% | |=========================================== | 62% | |============================================== | 65% | |================================================ | 69% | |=================================================== | 73% | |====================================================== | 77% | |========================================================= | 81% | |=========================================================== | 85% | |============================================================== | 88% | |================================================================= | 92% | |=================================================================== | 96% | |======================================================================| 100%
## [1] 1 1 1 1 1 1 2 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
hist(munic$class,
main = "Sucre's reclassified slope",
xlab = "slope (as a category)")
El histograma de la distribución de la pendiente del terreno ofrece una representación gráfica que muestra cómo se distribuyen los valores de pendiente en un área geográfica específica. Este análisis es crucial para entender las variaciones en la inclinación del terreno, lo que puede ser útil en estudios relacionados con la erosión, la planificación del uso del suelo, la agricultura, y la gestión de recursos naturales.
terra::hist(slope_perc)
La transformación de datos espaciales es un paso esencial para asegurar que los datos geográficos sean compatibles con sistemas de visualización y análisis basados en coordenadas geográficas. Este proceso convierte los datos del objeto espacial (rc), que podrían estar en un sistema de proyección distinto, al sistema de coordenadas EPSG:4326. Esta proyección geográfica, que utiliza latitud y longitud, es ampliamente utilizada en plataformas web como Leaflet y otros sistemas de información geográfica (SIG).
Al realizar esta transformación, los datos se alinean con los estándares globales de latitud y longitud, lo que facilita su integración con otros conjuntos de datos geoespaciales y permite una visualización precisa en mapas interactivos. Esta conversión es fundamental para el análisis espacial, la toma de decisiones informada y la correcta interpretación de la información geográfica, ya sea en estudios de planificación urbana, análisis ambiental, o cualquier otro ámbito que requiera datos espaciales en formato geográfico.
Este código está proyectando el objeto rc al sistema de coordenadas EPSG:4326, que es el sistema de coordenadas geográficas (latitud/longitud) comúnmente utilizado en mapas web.
(rc.geo = project(rc, "EPSG:4326"))
## class : SpatRaster
## dimensions : 113, 71, 1 (nrow, ncol, nlyr)
## resolution : 0.01666703, 0.01666703 (x, y)
## extent : -75.71422, -74.53086, 8.265791, 10.14917 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 1
## max value : 3
Este proceso de transformación convierte un raster de pendiente del terreno a coordenadas geográficas en el sistema EPSG:4326, lo que facilita su visualización y análisis en plataformas web interactivas como Leaflet. Al proyectar el raster en este sistema de coordenadas geográficas (latitud y longitud), se asegura que los datos de pendiente, que representan la inclinación del terreno, puedan ser sobrepuestos correctamente en un mapa interactivo.
(slope.geo = project(slope_perc, "EPSG:4326"))
## class : SpatRaster
## dimensions : 113, 71, 1 (nrow, ncol, nlyr)
## resolution : 0.01666703, 0.01666703 (x, y)
## extent : -75.71422, -74.53086, 8.265791, 10.14917 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 0.003078969
## max value : 7.526044846
Este mapa interactivo visualiza la pendiente del terreno del Departamento de Sucre, permitiendo explorar las variaciones en la inclinación del paisaje en diferentes municipios. Utilizando una paleta de colores que va desde tonos verdes para las pendientes suaves hasta rojos y marrones para las pendientes más pronunciadas, el mapa proporciona una representación clara y accesible de cómo varía la pendiente en toda la región.
palredgreen <- colorNumeric(c("darkseagreen3","yellow2", "orange", "brown2", "darkred"), values(slope.geo),
na.color = "transparent")
leaflet(munic) %>% addTiles() %>% setView(-75.3, lat = 9.3, zoom = 8) %>%
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 de terreno del departamento de sucre (%")
Este mapa interactivo proporciona una visualización detallada de la dirección del terreno en el Departamento de Sucre, mostrando cómo varía la inclinación y orientación del paisaje en toda la región. Utilizando una paleta de colores intuitiva, el mapa destaca las diferentes direcciones del terreno, desde el norte (azul) hasta el noroeste (ligeramente azul), pasando por otras direcciones como el este y sur, lo que permite identificar patrones geográficos importantes para la planificación territorial y estudios ambientales.
pal_aspect <- colorNumeric(
palette = c("blue", "green", "yellow", "orange", "red", "pink", "purple", "lightblue"),
domain = values(aspect),
na.color = "transparent"
)
leaflet(munic) %>%
addTiles() %>%
setView(-75.3, lat = 9.3, zoom = 8) %>% # Coordenadas del Departamento de Sucre
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 = "Direccion terreno basado en DTM (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: blue;'>Norte</span><br>
<span style='color: green;'>Noreste</span><br>
<span style='color: yellow;'>Este</span><br>
<span style='color: orange;'>Sureste</span><br>
<span style='color: red;'>Sur</span><br>
<span style='color: pink;'>Suroeste</span><br>
<span style='color: purple;'>Oeste</span><br>
<span style='color: lightblue;'>Noroeste</span><br>
</div>",
position = "bottomright",
className = "leaflet-control-legend"
)
Principalmente se uso Lizarazo, I., 2025. Geomorphometric terrain attributes in R. Available at https://rpubs.com/cmesao/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=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] MultiscaleDTM_0.9.1 exactextractr_0.10.0 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] utf8_1.2.4 generics_0.1.3 sass_0.4.9 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] fansi_1.0.6 purrr_1.0.2 scales_1.3.0 crosstalk_1.2.1
## [21] codetools_0.2-20 jquerylib_0.1.4 cli_3.6.3 shiny_1.10.0
## [25] rlang_1.1.4 units_0.8-5 munsell_0.5.1 base64enc_0.1-3
## [29] cachem_1.1.0 yaml_2.3.10 tools_4.4.2 raster_3.6-30
## [33] dplyr_1.1.4 colorspace_2.1-1 httpuv_1.6.15 png_0.1-8
## [37] vctrs_0.6.5 R6_2.5.1 mime_0.12 proxy_0.4-27
## [41] lifecycle_1.0.4 classInt_0.4-10 htmlwidgets_1.6.4 pkgconfig_2.0.3
## [45] pillar_1.9.0 progressr_0.15.1 bslib_0.8.0 later_1.4.1
## [49] glue_1.8.0 Rcpp_1.0.13-1 tidyselect_1.2.1 tibble_3.2.1
## [53] xfun_0.49 rstudioapi_0.17.1 knitr_1.49 farver_2.1.2
## [57] xtable_1.8-4 htmltools_0.5.8.1 rmarkdown_2.29 compiler_4.4.2
## [61] sp_2.1-4