En este cuaderno se presenta la forma en que se calculó los atributos geomorfométricos de un terreno a partir de modelos digitales de elevación en un formato DEM.
Como paso inicial de limpia la memoria:
rm(list=ls())
Lo siguiente la instalación y el uso de librerías.
library(sp)
## Warning: package 'sp' was built under R version 4.5.2
library(sf)
## Warning: package 'sf' was built under R version 4.5.2
## Linking to GEOS 3.13.1, GDAL 3.11.4, PROJ 9.7.0; sf_use_s2() is TRUE
library(leaflet)
## Warning: package 'leaflet' was built under R version 4.5.2
library(terra)
## Warning: package 'terra' was built under R version 4.5.2
## terra 1.8.70
library(MultiscaleDTM)
## Warning: package 'MultiscaleDTM' was built under R version 4.5.2
library(exactextractr)
## Warning: package 'exactextractr' was built under R version 4.5.2
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.5.2
library(tidyterra)
## Warning: package 'tidyterra' was built under R version 4.5.2
##
## Adjuntando el paquete: 'tidyterra'
## The following object is masked from 'package:stats':
##
## filter
Cada librería cumple una función en el cuaderno: - Terra: Lectura y procesamiento de datos espaciales Ráster. - sf: Lectura y procesamiento de datos espaciales vectoriales. - leaflet: Permitió la creación de mapas móviles o interactivos. - MultiscaleDTM: Análisis de terreno en capas espaciales distintas aplicando DEM. - Exactextractr: Extrae valores ráster dentro de polígonos - sp: Manejo de datos espaciales en R proporciona clases y métodos para puntos, líneas, polígonos y cuadrículas. - ggplot2: La relación entre variables y el aspecto gráfico con las capas geométricas como puntos y líneas. - tidyterra: Mezcla terra con la proyección y visualización de efectos espaciales.
Su función principal, SlpAsp(), calcula la pendiente (slope) y la exposición (aspect). Este método es una versión mejorada de los algoritmos clásicos que usan ventanas de 3×3 celdas para estimar cómo cambia la elevación entre una celda y sus vecinas Para estos cálculos se utilizan distintos métodos, según las celdas que se consideren alrededor de la celda central: Rook: usa solo las cuatro celdas que están arriba, abajo, a la izquierda y a la derecha. Es rápido y simple, pero no detecta variaciones diagonales. Queen: incluye las ocho celdas vecinas (cardinales y diagonales). Da resultados más completos y suaves, aunque tarda un poco más en procesar. Boundary: utiliza todas las celdas del borde de la ventana (por ejemplo, las 16 externas en una ventana de 5×5). Permite analizar patrones de relieve amplios, aunque puede suavizar los detalles locales.
En esta parte se necesitan cargar los datos ráster del departamento de Amazonas, por esto se usa la librería terra. Adicional a esto se comprueba la ruta para ubicar los archivos necesarios y se aplican y leen en el cuaderno.
getwd()
## [1] "C:/Users/DELL/Desktop"
A continuación, se asigna “dem” a la memoria de R y la función “rast” cumple la función para cargar el objeto de elevación.
(dem = terra::rast("Datos/COL_ref/COL_msk_alt.tif"))
## class : SpatRaster
## size : 2136, 1800, 1 (nrow, ncol, nlyr)
## resolution : 0.008333333, 0.008333333 (x, y)
## extent : -81.8, -66.8, -4.3, 13.5 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84
## source : COL_msk_alt.tif
## name : COL_msk_alt
## min value : -28
## max value : 5453
Con la función aggregate() sirve para modificar la resolución espacial de una ráster, combinando celdas originales con celdas grandes. Esta modificación se asigna a un nuevo dem (dem2) pero con una resolución mas grande.
dem2 = terra::aggregate(dem,2, "mean")
## |---------|---------|---------|---------|=========================================
Esto disminuye el total de celdas, reduciendo el tamaño del archivo para el facil procesamiento.
dem2
## class : SpatRaster
## size : 1068, 900, 1 (nrow, ncol, nlyr)
## resolution : 0.01666667, 0.01666667 (x, y)
## extent : -81.8, -66.8, -4.3, 13.5 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84
## source(s) : memory
## name : COL_msk_alt
## min value : -3.00
## max value : 5222.75
file.exists("Datos/Amazonas Munic.gpkg")
## [1] TRUE
Ahora con la librería sf a la variable munic se le asigna el gpkg que contiene los límites de los municipios de Amazonas:
(munic <- sf::st_read("Datos/Amazonas Munic.gpkg"))
## Reading layer `cortado' from data source
## `C:\Users\DELL\Desktop\Datos\Amazonas Munic.gpkg' using driver `GPKG'
## Simple feature collection with 8 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.38985 ymin: -4.228429 xmax: -69.36835 ymax: 0.1603
## Geodetic CRS: WGS 84
## Simple feature collection with 8 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -74.38985 ymin: -4.228429 xmax: -69.36835 ymax: 0.1603
## Geodetic CRS: WGS 84
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2
## 1 53 COL Colombia 1 Amazonas 1 El Encanto
## 2 53 COL Colombia 1 Amazonas 2 La Chorrera
## 3 53 COL Colombia 1 Amazonas 3 La Pedrera
## 4 53 COL Colombia 1 Amazonas 4 Leticia
## 5 53 COL Colombia 1 Amazonas 5 Mirití-Paraná
## 6 53 COL Colombia 1 Amazonas 6 Puerto Nariño
## 7 53 COL Colombia 1 Amazonas 7 Puerto Santander
## 8 53 COL Colombia 1 Amazonas 8 Tarapacá
## TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2
## 1 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 2 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 3 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 4 Municipio Municipality <NA> <NA>
## 5 Corregimiento Departamento Corregimiento Departamento <NA> Miriti Parana
## 6 Municipio Municipality <NA> <NA>
## 7 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 8 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## geom
## 1 MULTIPOLYGON (((-73.23018 -...
## 2 MULTIPOLYGON (((-71.9802 -1...
## 3 MULTIPOLYGON (((-72.61586 -...
## 4 MULTIPOLYGON (((-70.0579 -4...
## 5 MULTIPOLYGON (((-70.2188 -0...
## 6 MULTIPOLYGON (((-70.28952 -...
## 7 MULTIPOLYGON (((-71.4002 -0...
## 8 MULTIPOLYGON (((-70.1296 -3...
Ahora se deben alinear los datos en coordenadas geográficas que coincidan, para proceder a eso se debe anteceder con consultar los crs.
(Amazonas_crs = crs(munic))
## [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]]"
crs(dem2)
## [1] "GEOGCRS[\"WGS 84\",\n DATUM[\"unknown\",\n ELLIPSOID[\"WGS84\",6378137,298.257223563,\n LENGTHUNIT[\"metre\",1,\n ID[\"EPSG\",9001]]]],\n PRIMEM[\"Greenwich\",0,\n ANGLEUNIT[\"degree\",0.0174532925199433,\n ID[\"EPSG\",9122]]],\n CS[ellipsoidal,2],\n AXIS[\"latitude\",north,\n ORDER[1],\n ANGLEUNIT[\"degree\",0.0174532925199433,\n ID[\"EPSG\",9122]]],\n AXIS[\"longitude\",east,\n ORDER[2],\n ANGLEUNIT[\"degree\",0.0174532925199433,\n ID[\"EPSG\",9122]]]]"
crs(dem2) <- Amazonas_crs
(crs(dem2))
## [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]]"
Se debe recortar los limites del Amazonas al dem2 creando la nueva capa dem3
dem3 = terra::crop(dem2,munic, mask=TRUE)
Se calculan los atributos del terreno, pasar el DEM a coordenadas planas para transformar los datos de entrada al sistema Colombiano
(dem_plane = project(dem3, "EPSG:9377"))
## class : SpatRaster
## size : 264, 302, 1 (nrow, ncol, nlyr)
## resolution : 1848.502, 1848.502 (x, y)
## extent : 4846116, 5404364, 1088497, 1576501 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : COL_msk_alt
## min value : 60.75
## max value : 306.21
(munic_plane = sf::st_transform(munic, "EPSG:9377"))
## Simple feature collection with 8 features and 11 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: 4845400 ymin: 1090195 xmax: 5404114 ymax: 1575767
## Projected CRS: MAGNA-SIRGAS 2018 / Origen-Nacional
## ID_0 ISO NAME_0 ID_1 NAME_1 ID_2 NAME_2
## 1 53 COL Colombia 1 Amazonas 1 El Encanto
## 2 53 COL Colombia 1 Amazonas 2 La Chorrera
## 3 53 COL Colombia 1 Amazonas 3 La Pedrera
## 4 53 COL Colombia 1 Amazonas 4 Leticia
## 5 53 COL Colombia 1 Amazonas 5 Mirití-Paraná
## 6 53 COL Colombia 1 Amazonas 6 Puerto Nariño
## 7 53 COL Colombia 1 Amazonas 7 Puerto Santander
## 8 53 COL Colombia 1 Amazonas 8 Tarapacá
## TYPE_2 ENGTYPE_2 NL_NAME_2 VARNAME_2
## 1 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 2 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 3 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 4 Municipio Municipality <NA> <NA>
## 5 Corregimiento Departamento Corregimiento Departamento <NA> Miriti Parana
## 6 Municipio Municipality <NA> <NA>
## 7 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## 8 Corregimiento Departamento Corregimiento Departamento <NA> <NA>
## geom
## 1 MULTIPOLYGON (((4974409 136...
## 2 MULTIPOLYGON (((5113382 135...
## 3 MULTIPOLYGON (((5042723 145...
## 4 MULTIPOLYGON (((5326564 110...
## 5 MULTIPOLYGON (((5309465 150...
## 6 MULTIPOLYGON (((5300930 113...
## 7 MULTIPOLYGON (((5177945 145...
## 8 MULTIPOLYGON (((5318898 119...
En este caso se cambio el sistema crs al sistema nacional de coordenadas para los datos del gpkg asignando este cambio a la variable “munic_plane”
Para este paso, necesitamos calcular atributos del terreno —específicamente pendiente (slope) y exposición (aspect)— usando la función SlpAsp del paquete MultiscaleDTM en R.
(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 : 264, 302, 2 (nrow, ncol, nlyr)
## resolution : 1848.502, 1848.502 (x, y)
## extent : 4846116, 5404364, 1088497, 1576501 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## names : slope, aspect
## min values : 0.0008076037, 6.205885e-03
## max values : 1.9861943743, 3.599911e+02
Para este bloque el numero 1 indica la primera capa (pendiente) para atribuirla a (slope)
(slope = subset(slp_asp, 1))
## class : SpatRaster
## size : 264, 302, 1 (nrow, ncol, nlyr)
## resolution : 1848.502, 1848.502 (x, y)
## extent : 4846116, 5404364, 1088497, 1576501 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.0008076037
## max value : 1.9861943743
La función “hist()” de la libreria terra, va a generar un histograma con la distribución de valores de pendiente en el área del Amazonas.Donde el eje X va a contener la pendiente en grados:
terra::hist(slope,
main = "Pendientes de Amazonas",
xlab = "Pendiente (en grados)")
El eje horizontal (X) se representan los grados de inclinación del terreno, mientras que en el eje vertical (Y) se muestra la frecuencia, es decir, el número de celdas o áreas que presentan cada rango de pendiente.Interpretando el grafico es correcto decir y afirmar que las pendientes del territorio del AMamzoans son pedominantemente bajas.
Para este siguiente bloque el 2 indica la capa de exposicion y se asigna a una variable llamada “aspect”
(aspect =subset(slp_asp, 2))
## class : SpatRaster
## size : 264, 302, 1 (nrow, ncol, nlyr)
## resolution : 1848.502, 1848.502 (x, y)
## extent : 4846116, 5404364, 1088497, 1576501 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : aspect
## min value : 6.205885e-03
## max value : 3.599911e+02
Ahora visualizaremos la distribucion de exposion en una tabla, con la funcion hist()
terra::hist(aspect,
main = "Exposición de Amazonas",
xlab = "Exposición (en grados)")
En este grafico las concentraciones de elevacion se ubican entre el sureste y suroeste del departamento.
Adicionalmente, convirtamos los grados de pendiente a porcentaje de pendiente, por ello con la función “tan(slope(pi/180))100” Calcula la tangente del ángulo de pendiente en radianes. Matemáticamente, la tangente de un ángulo (en este caso, la pendiente) representa la razón entre la altura vertical y la distancia horizontal.
(slope_perc = tan(slope*(pi/180))*100)
## class : SpatRaster
## size : 264, 302, 1 (nrow, ncol, nlyr)
## resolution : 1848.502, 1848.502 (x, y)
## extent : 4846116, 5404364, 1088497, 1576501 (xmin, xmax, ymin, ymax)
## coord. ref. : MAGNA-SIRGAS 2018 / Origen-Nacional (EPSG:9377)
## source(s) : memory
## name : slope
## min value : 0.001409534
## max value : 3.467952406
Una vez a porcentaje lo podemos transformar en un grafico:
terra::hist(slope_perc,
main = "Pendientes de Amazonas",
xlab = "Pendiente (en porcentaje)")
Esta grafica indica que el reporte de pendiente corresponte a un porcentaje minimo.
Ahora tenemos que calcular el promedio de los valores de pendiente por municipio. Para ello, veamos la clasificación de pendientes del IGAC para fines agronómicos:
La tabla muestra la relación entre el código (alfabetico), la clase de pendiente y el porcentaje de inclinación del terreno (%), junto con los valores de color empleados para su representación. Cada código, identificado por una letra de la a a la g, corresponde a un rango específico de pendiente y a una descripción cualitativa del relieve.
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)
La matriz tiene como objetivo clasificar un modelo de pendientes expresadas en porcentaje en distintas categorías o clases, según la tabla de clasificación para usos agricolas. En primer lugar, se crea un vector denominado “m” que contiene los límites de cada rango estos son inferiones o superiores de la perndiente, junto con un valor numérico que representa el código asignado a cada clase. Luego este vector se transforma en una matriz mediante la función “matrix(m, ncol=3, byrow = TRUE”
En el siguiente bloque de codigo se utiliza una nueva variable a la que se introduce el corte de esta matriz con el raster inicial.
(munic$mean_slope <- exactextractr::exact_extract(slope_perc, munic, 'mean'))
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
## | | | 0% | |========= | 12% | |================== | 25% | |========================== | 38% | |=================================== | 50% | |============================================ | 62% | |==================================================== | 75% | |============================================================= | 88% | |======================================================================| 100%
## [1] 0.2329995 0.2542693 0.2813751 0.3035096 0.3104131 0.2927065 0.3867155
## [8] 0.2565996
Este ultimo dato ahora es una variable de munic y replesenta la moda de pendiente en los municipios del departamento con esto se va a generar otro histograma con la representacion media del relieve
hist(munic$mean_slope,
main = "Amazonas pendiente promedio",
xlab = "Pendiente (en grados)")
El resultado de esta proyeccion refuerza los resultados anteriores la presencia de inclinaciones fuertes en el departamento y los diferentes municipios es muy bajom, las pendiente promedio estan entre 0.25 y 0.30.
(munic$class <- exactextractr::exact_extract(rc, munic, 'mode'))
## Warning in .local(x, y, ...): Polygons transformed to raster CRS (EPSG:9377)
## | | | 0% | |========= | 12% | |================== | 25% | |========================== | 38% | |=================================== | 50% | |============================================ | 62% | |==================================================== | 75% | |============================================================= | 88% | |======================================================================| 100%
## [1] 1 1 1 1 1 1 1 1
Ahora generamos el histograma que muestra las pendientes por categorias, categorais que generamos con el codigo anterior realizando la extraccion de los valores raster como como lineas y poligonos.
hist(munic$class,
main = "Pendiente reclasificada de Amazonas",
xlab = "Pendiente (como categoría)")
Transformaremos la pendiente a coordenadas geograficas. La primera instrucción crea un nuevo ráster llamado slope.geo, que contiene los valores de pendiente en porcentaje (slope_perc) pero ahora expresados dentro del sistema de coordenadas geográficas, la linea rc.geo corresponde a la version reproyectada.
(rc.geo = project(rc, "EPSG:4326"))
## class : SpatRaster
## size : 265, 302, 1 (nrow, ncol, nlyr)
## resolution : 0.01666665, 0.01666665 (x, y)
## extent : -74.38712, -69.35379, -4.249657, 0.1670042 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 1.000000
## max value : 1.873985
(slope.geo = project(slope_perc, "EPSG:4326"))
## class : SpatRaster
## size : 265, 302, 1 (nrow, ncol, nlyr)
## resolution : 0.01666665, 0.01666665 (x, y)
## extent : -74.38712, -69.35379, -4.249657, 0.1670042 (xmin, xmax, ymin, ymax)
## coord. ref. : lon/lat WGS 84 (EPSG:4326)
## source(s) : memory
## name : slope
## min value : 0.008331007
## max value : 3.198564053
Para dibujar la pendiente del terreno en un mapa, primero se necesita
una paleta de colores. La función
colorNumeric() del paquete leaflet crea
una escala continua de colores para los valores del ráster
slope.geo, que muestra la pendiente en grados o
porcentaje.
Los colores van del verde (zonas planas o suaves) al rojo (pendientes
fuertes o zonas escarpadas). El argumento
na.color = "transparent" hace que las áraes sin valores no
se reflejen en la proyeccion del mapa.
palredgreen <- colorNumeric(c("darkseagreen3","yellow2", "orange", "brown2", "darkred"), values(slope.geo),
na.color = "transparent")
El siguiente fragmento de código en R utiliza la librería Leaflet para crear un mapa interactivo:
leaflet(munic) %>% addTiles() %>% setView(-74.0, 4.7, 9) %>%
addPolygons(color = "gray", weight = 1.0, smoothFactor = 0.5,
opacity = 0.4, fillOpacity = 0.10,
popup = paste("Municipio: ", munic$NAME_2, "<br>",
"Slope class: ", munic$class, "<br>")) %>%
addRasterImage(slope.geo, colors = palredgreen, opacity = 0.8) %>%
addLegend(pal = palredgreen, values = values(slope.geo),
title = "Pendientes en el depatamento Amazonas(%)")
La instrucción leaflet(munic) crea el mapa tomando como
base el objeto munic, que contiene los polígonos de los municipios de
Cundinamarca. Luego, addTiles() añade una capa base de
OpenStreetMap, que sirve como referencia geográfica.
El comando setView(-74.0, 4.7, 9) centra el mapa cerca
del punto medio del departamento y establece un nivel de zoom general
(9).
Después, addPolygons() dibuja los límites municipales
con bordes grises y ajusta aspectos visuales como el grosor
(weight = 1.0), el suavizado
(smoothFactor = 0.5) y la transparencia
(opacity y fillOpacity).
Finalmente, se agrega unpopup interactivo que muestra información sobre cada municipio cuando se hace clic en él.
ggplot() +
geom_spatraster(data = slope) +
scale_fill_whitebox_c(
palette = "muted",
labels = scales::label_number(suffix = "°"),
n.breaks = 12,
guide = guide_legend(reverse = TRUE)
) +
geom_sf(data = munic_plane, fill = NA, color = "black", linewidth = 0.3) +
labs(
fill = "Pendiente (°)",
title = "Pendientes en el departamento de Amazonas"
) +
theme_bw()
El siguiente código genera un mapa de pendientes del departamento del Amazonas mediante la librería ggplot2.
La función geom_spatraster() representa los valores del
ráster slope, que contiene la pendiente del terreno en
grados. Para facilitar la interpretación visual, se aplica la escala de
color scale_fill_whitebox_c() con la paleta muted, que
muestra un gradiente de tonos suaves donde los colores más claros
representan pendientes bajas y los más oscuros, pendientes más
pronunciadas.
La capa geom_sf() superpone los límites municipales
contenidos en el objeto munic_plane, sin relleno y con
bordes negros finos (linewidth = 0.3), delimitando
claramente cada municipio dentro del mapa.
Finalmente, se añaden etiquetas y título con labs(),
especificando la variable representada (“Pendiente (°)”) y el título del
mapa. El tema theme_bw() otorga un fondo limpio y uniforme,
mejorando la visualización general del ploteo.
Ahora se calcula el visual del terreno a partir del modelo digital de
elevación dem3.El resultado, guardado en
aspect_AMAZONAS, muestra la dirección hacia la que se
orienta el relieve en la zona.
aspect_AMAZONAS <- terra::terrain(dem3)
rgb.palette <- colorRampPalette(
c("blue", "cyan", "green", "yellow", "orange", "red", "magenta", "blue")
)
spplot(
aspect_AMAZONAS,
main = "Exposición del terreno en grados - Departamento de Amazonas",
col.regions = rgb.palette(100),
sp.layout = list(
list("sp.polygons", as_Spatial(munic), col = "black", lwd = 1.2)
),
xlim = c(ext(munic)[1], ext(munic)[2]),
ylim = c(ext(munic)[3], ext(munic)[4])
)
El código crea un mapa del aspecto del terreno en el Departamento de
Amazonas. Primero, se define una paleta de colores
rgb.palette que va desde azul hasta magenta para
representar diferentes valores de orientación de la pendiente. Luego,
con spplot() se grafica aspect_AMAZONAS,
aplicando esta paleta de colores, añadiendo los límites de los
municipios (munic) y ajustando el mapa al área de interés
mediante xlim y ylim. El resultado es un mapa
que muestra la dirección de las pendientes del terreno de manera visual
y clara.
En este caso la orientacion de la pendiente esta hacia norte del departamento.
Libro guia:
Lizarazo, I., 2025. Geomorphometric terrain attributes in R. Available at https://rpubs.com/ials2un/geomorphometric
Librerias:
Baston, D. (2023). exactextractr: Fast extraction from raster datasets using polygons. R package version 0.10.1. Disponible en: https://CRAN.R-project.org/package=exactextractr Bivand, R. S., Pebesma, E., & Gómez-Rubio, V. (2013). Applied spatial data analysis with R (2nd ed.). Springer. Cheng, J., Karambelkar, B., & Xie, Y. (2023). leaflet: Create interactive web maps with the JavaScript Leaflet library. R package version 2.2.2. Disponible en: https://CRAN.R-project.org/package=leaflet Hijmans, R. J. (2024). terra: Spatial data analysis. R package version 1.7-78. Disponible en: https://CRAN.R-project.org/package=terra Pebesma, E. (2018). Simple features for R: Standardized support for spatial vector data. The R Journal, 10(1), 439–446. Waga, K., Drăguţ, L., Eisank, C., & Blaschke, T. (2022). MultiscaleDTM: Multiscale analysis of digital terrain models. R package version 1.0. Disponible en: https://CRAN.R-project.org/package=MultiscaleDTM Zia, M. (2023). Digital Terrain Analysis. En Digital Soil Mapping with R. Recuperado de https://zia207.quarto.pub/digital-terrain-analysis.html
sessionInfo()
## R version 4.5.1 (2025-06-13 ucrt)
## Platform: x86_64-w64-mingw32/x64
## Running under: Windows 10 x64 (build 19045)
##
## Matrix products: default
## LAPACK version 3.12.1
##
## 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] tidyterra_0.7.2 ggplot2_4.0.0 exactextractr_0.10.0
## [4] MultiscaleDTM_1.0 terra_1.8-70 leaflet_2.2.3
## [7] sf_1.0-21 sp_2.2-0
##
## loaded via a namespace (and not attached):
## [1] tidyr_1.3.1 sass_0.4.10 generics_0.1.4 class_7.3-23
## [5] KernSmooth_2.23-26 lattice_0.22-7 digest_0.6.37 magrittr_2.0.4
## [9] rgl_1.3.24 RColorBrewer_1.1-3 evaluate_1.0.5 grid_4.5.1
## [13] fastmap_1.2.0 jsonlite_2.0.0 e1071_1.7-16 DBI_1.2.3
## [17] promises_1.5.0 purrr_1.1.0 scales_1.4.0 crosstalk_1.2.2
## [21] codetools_0.2-20 jquerylib_0.1.4 cli_3.6.5 shiny_1.11.1
## [25] rlang_1.1.6 units_1.0-0 withr_3.0.2 base64enc_0.1-3
## [29] cachem_1.1.0 yaml_2.3.10 otel_0.2.0 raster_3.6-32
## [33] tools_4.5.1 dplyr_1.1.4 httpuv_1.6.16 png_0.1-8
## [37] vctrs_0.6.5 R6_2.6.1 mime_0.13 proxy_0.4-27
## [41] lifecycle_1.0.4 classInt_0.4-11 htmlwidgets_1.6.4 pkgconfig_2.0.3
## [45] gtable_0.3.6 bslib_0.9.0 pillar_1.11.1 later_1.4.4
## [49] data.table_1.17.8 glue_1.8.0 Rcpp_1.1.0 xfun_0.53
## [53] tibble_3.3.0 tidyselect_1.2.1 rstudioapi_0.17.1 knitr_1.50
## [57] farver_2.1.2 xtable_1.8-4 htmltools_0.5.8.1 labeling_0.4.3
## [61] rmarkdown_2.30 compiler_4.5.1 S7_0.2.0
Realizado por: SAM