Este cuaderno ilustra varias funcionalidades para obtener, procesar y visualizar modelos digitales de elevación (DEM) en R. Su objetivo es ayudar a nosotors, estudiantes de Geomática Básica de la Universidad Nacional, a familiarizarse con los DEM y las variables geomorfométricas.
Algunos consejos para escribir tu propio cuaderno:
Los paquetes requeridos deben instalarse previamente desde la Consola.
## CONFIGURACIÓN
# INSTALE LOS PAQUETES DESDE LA CONSOLA, NO DESDE ACÁ.
# paquetes = c("rgdal","raster", "rgeos", "terra","elevatr","rasterVis", "rgl", "mapview")
# install.packages(paquetes)
library(raster)
## Loading required package: sp
## The legacy packages maptools, rgdal, and rgeos, underpinning the sp package,
## which was just loaded, were retired in October 2023.
## Please refer to R-spatial evolution reports for details, especially
## https://r-spatial.org/r/2023/05/15/evolution4.html.
## It may be desirable to make the sf package available;
## package maintainers should consider adding sf to Suggests:.
library(terra)
## terra 1.7.55
library(elevatr)
## elevatr v0.99.0 NOTE: Version 0.99.0 of 'elevatr' uses 'sf' and 'terra'. Use
## of the 'sp', 'raster', and underlying 'rgdal' packages by 'elevatr' is being
## deprecated; however, get_elev_raster continues to return a RasterLayer. This
## will be dropped in future versions, so please plan accordingly.
library(rasterVis)
## Loading required package: lattice
library(rgl)
library(mapview)
library(sf)
library(dplyr)
library(readr)
Es recomendable empezar a limpiar la memoria:
rm(list=ls())
Ahora, carguemos las bibliotecas:
Al ejecutar un fragmento, preste atención a cualquier mensaje que indique error o advierta posibles conflictos.
Los conflictos pueden ser causados por funciones, de diferentes paquetes, que tienen los mismos nombres (por ejemplo, raster::extract y tidyr::extract). Para evitar problemas, necesitamos llamar a dichas funciones usando el modo largo, es decir, nombre_paquete::función.
Después de ejecutar un fragmento por primera vez, es una buena práctica ocultar mensajes y advertencias usando: {r mensaje=FALSE, advertencia=FALSE}.
Los datos de elevación se utilizan para una amplia gama de aplicaciones, por ejemplo, visualización, hidrología y modelización ecológica. Obtener acceso a estos datos en R no ha tenido una única interfaz, está disponible a través de funciones en muchos paquetes o requiere acceso local a los datos. Esto ya no es necesario porque ahora existe una variedad de API que brindan acceso programático a los datos de elevación. El paquete elevatr se escribió para estandarizar el acceso a los datos de elevación desde las API web.
Para acceder a datos de elevación ráster (por ejemplo, un DEM), el paquete elevatr utiliza Terrain Tiles de Amazon Web Services. Exploraremos esta funcionalidad en este cuaderno.
Existen varias fuentes de modelos de elevación digitales, como Shuttle Radar Topography Mission (SRTM), el conjunto de datos de elevación nacional (NED) del USGS, Global DEM (GDEM) y otros. Cada uno de estos DEM tiene ventajas y desventajas en su uso. Antes de su cierre en enero de 2018, Mapzen combinó varias de estas fuentes para crear un producto de elevación de síntesis que utiliza los mejores datos de elevación disponibles para una región determinada en un nivel de zoom determinado. Aunque cerrados, estos datos compilados por Mapzen son actualmente accesibles a través de Terrain Tiles en Amazon Web Services (AWS).
La entrada para get_elev_raster() puede ser un data.frame con ubicaciones x (longitud) e y (latitud) como las dos primeras columnas, cualquier objeto sp o cualquier objeto ráster y devuelve un RasterLayer de los mosaicos que se superponen al cuadro delimitador de la entrada. Si se recuperan varios mosaicos, el resultado resultante es una capa ráster fusionada.
** Usando get_elev_raster() para acceder a Terrain Tiles en AWS**.
Como se mencionó, un marco de datos con columnas x e y, un objeto sp o un objeto ráster debe ser la entrada y el src debe configurarse en “mapzen” (este es el valor predeterminado).
No hay diferencia en el uso de los tipos de datos de entrada sp y ráster.
El marco de datos requiere un CRS (es decir, un sistema de referencia de coordenadas). El nivel de zoom (z) está predeterminado en 9 (una compensación entre resolución y tiempo de descarga). Podrías empezar a probar con un nivel de zoom más alto (por ejemplo: 10,12,15,etc).
Primero, necesitamos cargar un shapefile o un geopaquete que represente a los municipios de nuestro departamento. En este cuaderno utilizaré un shapefile descargado del geoportal del DANE.
Leamos el archivo de forma usando una función proporcionada por el paquete sf:
list.files()
## [1] "huila_slope.png" "Modelo de Elevacion Digital.nb.html"
## [3] "Modelo de Elevacion Digital.Rmd" "Modelo_de_Elevacion_Digital.html"
## [5] "Modelo_de_Elevacion_Digital.nb.html" "Modelo_de_Elevacion_Digital.Rmd"
## [7] "NUEVOHUILA.qgz" "NUEVOS_HUILA.cpg"
## [9] "NUEVOS_HUILA.dbf" "NUEVOS_HUILA.prj"
## [11] "NUEVOS_HUILA.qmd" "NUEVOS_HUILA.shp"
## [13] "NUEVOS_HUILA.shx" "rep_huila_dem.tif"
## [15] "rsconnect"
# SpatialPolygonsDataFrame example
munic <- st_read('NUEVOS_HUILA.shp')
## Reading layer `NUEVOS_HUILA' from data source
## `D:\Sexta Matricula\Geomatica\mapa DEM\NUEVOS_HUILA.shp' using driver `ESRI Shapefile'
## Simple feature collection with 37 features and 7 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: -76.62466 ymin: 1.552125 xmax: -74.41303 ymax: 3.843208
## Geodetic CRS: MAGNA-SIRGAS
Revisemos la geometría, el cuadro delimitador, el CRS y los atributos del objeto munic:
head(munic)
Creemos un nuevo objeto con centroides de municipios, pero primero configuramos los datos:
munic$km2 = munic$AREA / 1000000
munic$km2
## [1] 1269.82717 503.70310 249.60734 194.23340 356.51548 370.65657
## [7] 356.42110 814.65092 131.94003 155.81261 278.31076 884.26636
## [13] 178.21746 193.66005 630.66594 251.23017 466.64491 1390.43219
## [19] 339.37959 429.66717 362.81184 367.02539 530.39939 471.73435
## [25] 185.72709 543.92692 332.91538 606.52117 80.44174 1584.96992
## [31] 462.79934 786.00202 180.97556 589.68899 795.63062 273.73165
## [37] 540.51687
munic$geometry
## Geometry set for 37 features
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: -76.62466 ymin: 1.552125 xmax: -74.41303 ymax: 3.843208
## Geodetic CRS: MAGNA-SIRGAS
## First 5 geometries:
## POLYGON ((-75.35274 3.282034, -75.35222 3.28198...
## POLYGON ((-75.52383 2.512427, -75.52346 2.51242...
## POLYGON ((-75.70495 2.08465, -75.70472 2.084607...
## POLYGON ((-75.44193 2.677073, -75.44132 2.67665...
## POLYGON ((-75.67548 2.797141, -75.6749 2.796984...
Cambiamos a usar centers\(x y centers\)y en lugar de centers$geometry en el código de la visualización con Leaflet por varias razones: La principal es por la compativilidad con ciertos paquetes o funciones que requieren coordenadas numéricas en lugar de objetos geométricos completos a demas de que proporciona una forma más simple y clara de acceder a las coordenadas de los centroides de las regiones. Esto hace que el código sea más legible y fácil de entender, especialmente para quienes puedan no estar familiarizados con la estructura de datos de geometría de sf
(centers <- st_centroid(munic))
## Warning: st_centroid assumes attributes are constant over geometries
centers$x = st_coordinates(centers)[,1]
centers$x
## [1] -75.27233 -75.51700 -75.69694 -75.44781 -75.67383 -76.25636 -76.11782
## [8] -76.00118 -75.78694 -76.04110 -75.72803 -75.44066 -76.14786 -75.83195
## [15] -76.11920 -75.23554 -76.22897 -76.41656 -75.63360 -75.80798 -75.87535
## [22] -75.68260 -75.08536 -75.71434 -75.91758 -75.13839 -75.51593 -75.57131
## [29] -75.95092 -74.67833 -75.32944 -74.95797 -75.76858 -75.29136 -75.35263
## [36] -75.71632 -75.99665
centers$y = st_coordinates(centers)[,2]
centers$y
## [1] 2.993357 2.371780 1.984393 2.541653 2.691515 2.006780 2.181456 2.328075
## [9] 2.576064 2.061191 2.406899 2.914488 1.684580 2.259601 1.827902 2.782224
## [17] 2.100383 1.924161 2.926266 1.870991 2.130281 2.526854 3.030613 2.824119
## [25] 1.950715 3.287054 2.646561 2.172440 2.006248 3.451956 2.658666 3.135422
## [33] 2.079228 2.497847 3.262372 2.269749 1.709113
munic$Long <- centers$x
munic$Lat <- centers$y
library(leaflet)
# Crear el mapa
map <- leaflet(munic) %>%
addTiles() %>%
# Agregar un rectángulo
addRectangles(
lng1 = 73.90, lat1 = 4.9,
lng2 = 72.7, lat2 = 5.9,
fillColor = "transparent"
) %>%
# Agregar polígonos
addPolygons(
color = "#444444", weight = 1, smoothFactor = 0.5,
opacity = 1.0, fillOpacity = 0.4,
fillColor = colorQuantile("YlOrRd", munic$km2)(munic$km2),
highlightOptions = highlightOptions(
color = "white", weight = 2,
bringToFront = TRUE
)
) %>%
# Agregar marcadores (puntos)
addMarkers(
lng = munic$Long, lat = munic$Lat,
popup = ~munic$NAME_2
)
## 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'
# Mostrar el mapa
map
library(sf)
# Convertir las características simples (munic) a objetos sf
sp.munic <- st_as_sf(munic)
# Encontrar los centroides de las regiones
centers <- st_centroid(sp.munic)
## Warning: st_centroid assumes attributes are constant over geometries
# Agregar el nombre de la región y el nombre del municipio a los centroides
centers$region <- row.names(sp.munic)
centers$munic <- munic$MPIO_CNMBR
centers
library(elevatr)
library(raster)
Ahora, descarguemos los datos de elevación de nuestro departamento:
# z denota el nivel de zoom de los datos
# cuanto mayor sea el zoom, mayor será la resolución espacial
elevation <- get_elev_raster(munic, z = 10)
## Mosaicing & Projecting
## Note: Elevation units are in meters.
¿Qué es el objeto de elevación?
elevation
## class : RasterLayer
## dimensions : 3582, 3586, 12845052 (nrow, ncol, ncell)
## resolution : 0.0006862561, 0.0006862561 (x, y)
## extent : -76.64062, -74.17971, 1.406085, 3.864255 (xmin, xmax, ymin, ymax)
## crs : +proj=longlat +ellps=GRS80 +towgs84=0,0,0,0,0,0,0 +no_defs
## source : file278069ef559.tif
## names : file278069ef559
library(sf)
# Crear un objeto sf a partir de munic
sf_munic <- st_as_sf(munic, coords = c("Long", "Lat"))
# Obtener los centroides de las regiones
centers <- st_centroid(sf_munic)
## Warning: st_centroid assumes attributes are constant over geometries
# Agregar el nombre de la región y el nombre del municipio a los centroides
centers$region <- row.names(sf_munic)
centers$munic <- munic$MPIO_CNMBR
# Imprimir el resultado
print(centers)
## Simple feature collection with 37 features and 12 fields
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -76.41656 ymin: 1.68458 xmax: -74.67833 ymax: 3.451956
## Geodetic CRS: MAGNA-SIRGAS
## First 10 features:
## DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR MPIO_CDPMP AREA LATITUD LONGITUD
## 1 41 001 NEIVA 41001 1269827167 2.993360 -75.27236
## 2 41 306 GIGANTE 41306 503703102 2.371782 -75.51700
## 3 41 319 GUADALUPE 41319 249607339 1.984394 -75.69694
## 4 41 349 HOBO 41349 194233398 2.541654 -75.44781
## 5 41 357 ÍQUIRA 41357 356515480 2.691518 -75.67383
## 6 41 359 ISNOS 41359 370656566 2.006784 -76.25636
## 7 41 378 LA ARGENTINA 41378 356421101 2.181453 -76.11782
## 8 41 396 LA PLATA 41396 814650921 2.328077 -76.00117
## 9 41 483 NÁTAGA 41483 131940031 2.576066 -75.78694
## 10 41 503 OPORAPA 41503 155812607 2.061191 -76.04110
## geometry km2 Long Lat region munic
## 1 POINT (-75.27233 2.993357) 1269.8272 -75.27233 2.993357 1 NEIVA
## 2 POINT (-75.517 2.37178) 503.7031 -75.51700 2.371780 2 GIGANTE
## 3 POINT (-75.69694 1.984393) 249.6073 -75.69694 1.984393 3 GUADALUPE
## 4 POINT (-75.44781 2.541653) 194.2334 -75.44781 2.541653 4 HOBO
## 5 POINT (-75.67383 2.691515) 356.5155 -75.67383 2.691515 5 ÍQUIRA
## 6 POINT (-76.25636 2.00678) 370.6566 -76.25636 2.006780 6 ISNOS
## 7 POINT (-76.11782 2.181456) 356.4211 -76.11782 2.181456 7 LA ARGENTINA
## 8 POINT (-76.00118 2.328075) 814.6509 -76.00118 2.328075 8 LA PLATA
## 9 POINT (-75.78694 2.576064) 131.9400 -75.78694 2.576064 9 NÁTAGA
## 10 POINT (-76.0411 2.061191) 155.8126 -76.04110 2.061191 10 OPORAPA
A efectos de visualización, una resolución más baja acelera la tarea:
# Mosaico de los datos de elevación a una resolución más baja (opcional)
elevation2 <- aggregate(elevation, fact = 4, fun = mean)
sf_munic <- st_transform(sf_munic, crs = 4326)
Una buena paleta es clave para una visualización adecuada. Probemos este:
pal <- colorNumeric(c("forestgreen","yellow","tan","brown"), values(elevation2),
na.color = "transparent")
# Supongamos que deseas proyectar tus datos a EPSG:4326
sf_munic <- st_transform(sf_munic, crs = 4326)
centers <- st_transform(centers, crs = 4326)
Ahora usaremos la biblioteca de folletos para ver los datos de elevación:
leaflet(munic) %>%
addTiles() %>%
addPolygons(
color = "white", weight = 1.0, smoothFactor = 0.5,
opacity = 0.25, fillOpacity = 0.15,
popup = ~paste("Region: ", MPIO_CNMBR, "<br>Km2: ", km2, "<br>")
) %>%
addLabelOnlyMarkers(
data = centers,
lng = ~LONGITUD, lat = ~LATITUD, # Ajusta las variables 'LONGITUD' y 'LATITUD' según tus datos
label = ~region,
labelOptions = labelOptions(noHide = TRUE, direction = 'top', textOnly = TRUE)
) %>%
addRasterImage(
elevation2, colors = pal, opacity = 0.9
) %>%
addLegend(
pal = pal, values = values(elevation2),
title = "Elevation data for Huila (mts)"
)
## 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'
Haga clic en el ID de cada región para obtener el nombre y la extensión del municipio en Km^2
Cuando se trabaja con DEM, siempre es una buena idea utilizar coordenadas de mapa en lugar de coordenadas geográficas. Esto se debe al hecho de que, en las coordenadas geográficas, las unidades de dimensiones horizontales son grados decimales, PERO la unidad de dimensión vertical son metros.
Para reproyectar los datos de elevación, realizamos dos pasos.
Primero, definimos el CRS objetivo:
#library(sp)
# WGS 84 / UTM zone 18N
spatialref <- CRS(SRS_string="EPSG:32618")
Luego reproyectamos el DEM usando la función projectRaster del paquete raster:
# Project Raster
# First, we create one raster object
# using projectExtent (no values are transferred)
pr3 <- projectExtent(elevation, crs=spatialref)
# Adjust the cell size to your cell size
res(pr3) <- 80
# now project
rep_elev <- projectRaster(elevation, pr3)
Que resulta ?
rep_elev
## class : RasterLayer
## dimensions : 3399, 3422, 11631378 (nrow, ncol, ncell)
## resolution : 80, 80 (x, y)
## extent : 317469, 591229, 155378.5, 427298.5 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs
## source : memory
## names : file278069ef559
## values : -666.9117, 5367.665 (min, max)
Ahora reproyectamos el SpatialPolygonsDataFrame que representa los municipios de nuestro departamento.
library(sf)
# Transformar el objeto sf utilizando st_transform
rep_munic <- st_transform(sp.munic, crs = spatialref)
rep_munic
To avoid a headache, let’s save our DEM. Make sure to indicate a pathname and a filename which suits your needs (i.e. appropriate for your platform, and your department).
library(raster)
# Ruta de destino para guardar el DEM reproyectado
filename <- "./rep_huila_dem.tif"
# Especifica el tipo de dato (datatype) según tus necesidades
datatype <- 'INT4S' # Ajusta esto según el tipo de datos que desees
# Escribe el DEM reproyectado en el archivo
writeRaster(rep_elev, filename = filename, datatype = datatype, overwrite = TRUE)
# Una vez que hayas ejecutado este código, puedes comentarlo nuevamente
Una exploración rápida de las estadísticas de DEM.
Este fragmento “limpia” la elevación inferior a 0,0:
rep_elev[rep_elev < 0.0] <- 0.0
Ahora, creemos el histograma de valores de elevación:
hist(rep_elev)
Podemos calcular un resumen de las estadísticas de DEM:
# works for large files
promedio <- cellStats(rep_elev, 'mean')
minimo <- cellStats(rep_elev, 'min')
maximo <- cellStats(rep_elev, 'max')
desviacion <- cellStats(rep_elev, 'sd')
Creemos un vector de estadísticas unidimensional:
metricas <- c('mean', 'min', 'max', 'std')
valores <- c(promedio, minimo, maximo, desviacion)
El resultado:
(df_estadisticas <- data.frame(metricas, valores))
Antes de continuar, asegúrese de haber comprendido los conceptos básicos sobre: DEM, pendiente y orientación.
Primero, calcule la pendiente, la orientación y el sombreado:
slope = terrain(rep_elev,opt='slope', unit='degrees')
aspect = terrain(rep_elev,opt='aspect',unit='degrees')
hill = hillShade(slope,aspect,40,315)
Comprobemos el primer resultado:
slope
## class : RasterLayer
## dimensions : 3399, 3422, 11631378 (nrow, ncol, ncell)
## resolution : 80, 80 (x, y)
## extent : 317469, 591229, 155378.5, 427298.5 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs
## source : memory
## names : slope
## values : 0, 87.43722 (min, max)
Ahora, el segundo resultado:
aspect
## class : RasterLayer
## dimensions : 3399, 3422, 11631378 (nrow, ncol, ncell)
## resolution : 80, 80 (x, y)
## extent : 317469, 591229, 155378.5, 427298.5 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs
## source : memory
## names : aspect
## values : 0, 360 (min, max)
Para trazar la pendiente, es una buena idea reducir el tamaño de RasterLayer:
#Este trozo es opcional
#Úselo solo cuando los datos de zoom sean muy altos
slope2 <- aggregate(slope, fact=4, fun=mean)
Puede resultar conveniente proyectar el conjunto de datos de elevación:
slope3 <- projectRasterForLeaflet(slope2, "ngb")
Creemos una paleta de colores:
pal2 <- colorNumeric(c("#00FF00", "#FF0000"), values(slope3),na.color = "transparent")
Esta paleta va desde verde (#00FF00), que puede representar pendientes más suaves, hasta rojo (#FF0000), que puede representar pendientes más empinadas
Ahora el codigo para el grafico:
leaflet(munic) %>% addTiles() %>%
addPolygons(color = "white", weight = 1.0, smoothFactor = 0.5,
opacity = 0.25, fillOpacity = 0.15,
popup = paste("Region: ", munic$MPIO_CNMBR, "<br>",
"Km2: ", munic$km2, "<br>")) %>%
addLabelOnlyMarkers(data = centers,
lng = ~LONGITUD, lat = ~LATITUD, label = ~region,
labelOptions = labelOptions(noHide = TRUE, direction = 'top', textOnly = TRUE)) %>%
addRasterImage(slope3, colors = pal2, opacity = 1.0) %>%
addLegend(pal = pal2, values = values(slope3),
title = "Pendiente de Huila (%)")
## Warning in colors(.): Some values were outside the color scale and will be
## treated as NA
## 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'
Recordemos qué es el objeto pendiente2:
slope2
## class : RasterLayer
## dimensions : 850, 856, 727600 (nrow, ncol, ncell)
## resolution : 320, 320 (x, y)
## extent : 317469, 591389, 155298.5, 427298.5 (xmin, xmax, ymin, ymax)
## crs : +proj=utm +zone=18 +datum=WGS84 +units=m +no_defs
## source : memory
## names : slope
## values : 1.849426e-14, 84.72774 (min, max)
Tenga en cuenta que existen dos bibliotecas para administrar datos ráster en R: - raster y - terra.
La biblioteca ráster es bien conocida (pero, en algunas tareas, bastante lenta). La biblioteca Terra es más reciente (pero más rápida).
Convertiremos un RasterLayer (es decir, un objeto ráster) en un SpatRaster (es decir, un objeto terra):
(nslope2 <- as(slope2, "SpatRaster"))
## class : SpatRaster
## dimensions : 850, 856, 1 (nrow, ncol, nlyr)
## resolution : 320, 320 (x, y)
## extent : 317469, 591389, 155298.5, 427298.5 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 18N (EPSG:32618)
## source(s) : memory
## name : slope
## min value : 1.849426e-14
## max value : 8.472774e+01
La clasificación de pendientes es una forma común de entender la variabilidad del relieve. Es necesario incluir aquí una tabla con intervalos de pendientes, nombres de clases y descripción, según lo define el Instituto Geográfico Colombiano (IGAC).
Realicemos una clasificación de pendientes basada en rangos comunes. Primero, creamos una matriz de reclasificación.
m <- c(0, 3, 1, 3, 7, 2, 7,12,3, 12,
25, 4, 25, 50, 5, 50, 75, 6)
(rclmat <- matrix(m, ncol=3, byrow = TRUE))
## [,1] [,2] [,3]
## [1,] 0 3 1
## [2,] 3 7 2
## [3,] 7 12 3
## [4,] 12 25 4
## [5,] 25 50 5
## [6,] 50 75 6
En tu cuaderno, explica el significado de la matriz anterior.
Ahora, la tarea de reclasificación:
# para valores >= 0 (en lugar de > 0)
slope_rec <- terra::classify(nslope2, rclmat, right=TRUE)
Veamos los resultados:
slope_rec
## class : SpatRaster
## dimensions : 850, 856, 1 (nrow, ncol, nlyr)
## resolution : 320, 320 (x, y)
## extent : 317469, 591389, 155298.5, 427298.5 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 18N (EPSG:32618)
## source(s) : memory
## name : slope
## min value : 1.00000
## max value : 84.72774
Usaremos tmap para crear y guardar un mapa de clasificación de pendientes estático.
Rectificamos la libreria necesaria
library(tmap)
## Breaking News: tmap 3.x is retiring. Please test v4, e.g. with
## remotes::install_github('r-tmap/tmap')
# Crear intervalos de clase personalizados
intervals <- c(0, 10, 20, 30, 40, 50, 60, 70, 80, 90, 100, 110, 120, 130)
# Definir colores para los intervalos de clase
colors <- c("#f7f7f7", "#d9f0a3", "#addd8e", "#78c679", "#41ab5d",
"#238443", "#006837", "#005a32", "#00441b", "#00341a",
"#002d19", "#002616", "#002014")
# Crear un mapa de pendiente con intervalos de clase y colores personalizados
slope.map <- tm_shape(slope_rec) +
tm_raster(style = "cat", title = "Pendiente", breaks = intervals,
palette = colors, legend.show = TRUE) +
tm_shape(munic) + tm_borders(col = "darkgray", lwd = 0.5, alpha = 0.8) +
tm_text(text = "MPIO_CNMBR", size = 0.3, alpha = 0.7) +
tm_scale_bar(text.size = 0.5) +
tm_compass(position = c("right", "top"), size = 2) +
tm_graticules(alpha = 0.2) +
tm_layout(outer.margins = 0.01, legend.position = c("left", "top"),
title = 'Clases de pendiente', title.position = c('right', 'top')) +
tm_credits("Data source: Mapzen & DANE", size = 0.3)
Veamos el resultado:
slope.map
Esta guía contiene más consejos para trazar objetos raster y vectoriales. Asegúrate de probar opciones adicionales a las incluidas en este cuaderno.
Creemos un respaldo:
## Tenga en cuenta que estamos utilizando papel de tamaño carta.
tmap_save(slope.map, "./huila_slope.png", width = 8.5, height =11, dpi=600)
## Map saved to D:\Sexta Matricula\Geomatica\mapa DEM\huila_slope.png
## Resolution: 5100 by 6600 pixels
## Size: 8.5 by 11 inches (600 dpi)
Asegúrese de verificar la salida en su directorio de trabajo
Ahora queremos crear un mapa de pendientes interactivo.
Convirtamos el objeto sf en un objeto SpatVector:
(nmunic <- as(rep_munic, "SpatVector"))
## class : SpatVector
## geometry : polygons
## dimensions : 37, 10 (geometries, attributes)
## extent : 319297.7, 565179, 171589.9, 424810.4 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 18N (EPSG:32618)
## names : DPTO_CCDGO MPIO_CCDGO MPIO_CNMBR MPIO_CDPMP AREA LATITUD
## type : <chr> <chr> <chr> <chr> <num> <num>
## values : 41 001 NEIVA 41001 1.27e+09 2.993
## 41 306 GIGANTE 41306 5.037e+08 2.372
## 41 319 GUADALUPE 41319 2.496e+08 1.984
## LONGITUD km2 Long Lat
## <num> <num> <num> <num>
## -75.27 1270 -75.27 2.993
## -75.52 503.7 -75.52 2.372
## -75.7 249.6 -75.7 1.984
Convirtamos el objeto ráster en un objeto terra:
(nslope <- as(slope, "SpatRaster"))
## class : SpatRaster
## dimensions : 3399, 3422, 1 (nrow, ncol, nlyr)
## resolution : 80, 80 (x, y)
## extent : 317469, 591229, 155378.5, 427298.5 (xmin, xmax, ymin, ymax)
## coord. ref. : WGS 84 / UTM zone 18N (EPSG:32618)
## source(s) : memory
## name : slope
## min value : 0.00000
## max value : 87.43722
Ahora, calculemos las categorías de pendientes agregadas por municipio:
## Método S4 para la firma 'SpatRaster,SpatVector'
munic.slope <- zonal(nslope, nmunic, fun=mean, as.raster=TRUE)
Ahora, veamos el mapa:
tmap_mode("view")
## tmap mode set to interactive viewing
tm_shape(munic) + tm_borders(col = "darkgray", lwd = 0.5, alpha=0.8) +
tm_text(text = "MPIO_CNMBR", size = 0.5, alpha=0.7) +
tm_shape(munic.slope) +
tm_raster(style="cont", n=7, alpha=0.6, title="Pendiente media")+
tm_layout(legend.outside = TRUE)
## stars object downsampled to 1004 by 997 cells. See tm_shape manual (argument raster.downsample)
Lizarazo, I., 2023. Procesamiento y análisis de datos de elevación en R. Disponible en https://rpubs.com/ials2un/dem_analysis Puede encontrar este cuaderno en el siguiente link <http://rpubs.com/alejandrotrian/DEM #Reproducibilidad
sessionInfo()
## R version 4.3.1 (2023-06-16 ucrt)
## Platform: x86_64-w64-mingw32/x64 (64-bit)
## Running under: Windows 10 x64 (build 19045)
##
## 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] tmap_3.3-4 leaflet_2.2.0 readr_2.1.4 dplyr_1.1.3
## [5] sf_1.0-14 mapview_2.11.2 rgl_1.2.1 rasterVis_0.51.5
## [9] lattice_0.21-8 elevatr_0.99.0 terra_1.7-55 raster_3.6-26
## [13] sp_2.1-0
##
## loaded via a namespace (and not attached):
## [1] tidyselect_1.2.0 viridisLite_0.4.2 farver_2.1.1
## [4] fastmap_1.1.1 XML_3.99-0.14 digest_0.6.33
## [7] mime_0.12 lifecycle_1.0.3 ellipsis_0.3.2
## [10] magrittr_2.0.3 compiler_4.3.1 rlang_1.1.1
## [13] sass_0.4.7 progress_1.2.2 tools_4.3.1
## [16] utf8_1.2.3 yaml_2.3.7 knitr_1.44
## [19] prettyunits_1.1.1 htmlwidgets_1.6.2 interp_1.1-4
## [22] classInt_0.4-10 curl_5.0.2 RColorBrewer_1.1-3
## [25] abind_1.4-5 KernSmooth_2.23-21 purrr_1.0.2
## [28] leafsync_0.1.0 grid_4.3.1 stats4_4.3.1
## [31] fansi_1.0.4 latticeExtra_0.6-30 e1071_1.7-13
## [34] leafem_0.2.3 colorspace_2.1-0 progressr_0.14.0
## [37] scales_1.2.1 dichromat_2.0-0.1 cli_3.6.1
## [40] rmarkdown_2.25 crayon_1.5.2 generics_0.1.3
## [43] rstudioapi_0.15.0 httr_1.4.7 tzdb_0.4.0
## [46] tmaptools_3.1-1 DBI_1.1.3 cachem_1.0.8
## [49] proxy_0.4-27 stars_0.6-4 slippymath_0.3.1
## [52] parallel_4.3.1 s2_1.1.4 base64enc_0.1-3
## [55] vctrs_0.6.3 jsonlite_1.8.7 hms_1.1.3
## [58] jpeg_0.1-10 crosstalk_1.2.0 jquerylib_0.1.4
## [61] hexbin_1.28.3 units_0.8-4 lwgeom_0.2-13
## [64] glue_1.6.2 leaflet.providers_1.13.0 codetools_0.2-19
## [67] deldir_1.0-9 munsell_0.5.0 tibble_3.2.1
## [70] pillar_1.9.0 htmltools_0.5.6 satellite_1.0.4
## [73] R6_2.5.1 wk_0.8.0 evaluate_0.21
## [76] png_0.1-8 bslib_0.5.1 class_7.3-22
## [79] Rcpp_1.0.11 xfun_0.40 zoo_1.8-12
## [82] pkgconfig_2.0.3