Este cuaderno ilustra varias funcionalidades para obtener, procesar y visualizar modelos digitales de elevación (DEM) en R. Su objetivo es ayudar a nosotros, 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)
## Linking to GEOS 3.11.2, GDAL 3.6.2, PROJ 9.2.0; sf_use_s2() is TRUE
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:terra':
##
## intersect, union
## The following objects are masked from 'package:raster':
##
## intersect, select, union
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
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] "ciudadesco.csv" "cuaderno_eva"
## [3] "cuaderno4 elevación.rmd" "CuadernoEVA.nb.html"
## [5] "CuadernoEVA.Rmd" "Cuadernoeva_cundi.html"
## [7] "Cuadernoeva_cundi.Rmd" "CUN_tuberculos_2022.csv"
## [9] "Cundimarca_papa.csv" "Cundinamarca_Papa.csv"
## [11] "CUNDINARMCA CUADERNO 2.nb.html" "ELEVACIÓN.html"
## [13] "ELEVACIÓN.nb.html" "ELEVACIÓN.Rmd"
## [15] "EVA_19_22.xlsx" "EVA_CUNDI.csv"
## [17] "EVA_CUNDI.csv.csv" "huila_slope.png"
## [19] "Imagen1.png" "imagen2.png"
## [21] "imagen3.png" "imagen4.png"
## [23] "MAPAS-TOLIMA.html" "MAPAS TOLIMA.Rmd"
## [25] "MGN_MPIO_POLITICO.cpg" "MGN_MPIO_POLITICO.dbf"
## [27] "MGN_MPIO_POLITICO.prj" "MGN_MPIO_POLITICO.sbn"
## [29] "MGN_MPIO_POLITICO.sbx" "MGN_MPIO_POLITICO.shp"
## [31] "MGN_MPIO_POLITICO.shp.xml" "MGN_MPIO_POLITICO.shx"
## [33] "MGN2021_MPIO_POLITICO.rar" "PRODUCCIÓN-PAPA.html"
## [35] "PRODUCCIÓN PAPA.Rmd" "rep_tolima_dem.tif"
## [37] "rsconnect" "Tolima_Algodon.csv"
## [39] "Tolima_dep.gpkg" "tolima_mun.gpkg"
## [41] "tolima_slope.png"
# SpatialPolygonsDataFrame example
munic <- st_read('MGN_MPIO_POLITICO.shp')
## Reading layer `MGN_MPIO_POLITICO' from data source
## `C:\Users\camil\OneDrive\Escritorio\Geomatica\CuadernoEVA\MGN_MPIO_POLITICO.shp'
## using driver `ESRI Shapefile'
## Simple feature collection with 1121 features and 12 fields
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS: MAGNA-SIRGAS
Revisemos la geometría, el cuadro delimitador, el CRS y los atributos del objeto munic:
head(munic)
-Filtremos el departamento de Tolima
munic %>% filter(DPTO_CCDGO=="73")%>% select(MPIO_CNMBR,MPIO_CDPMP, MPIO_NAREA)->
munic1
head(munic1)
Creemos un nuevo objeto con centroides de municipios, pero primero configuramos los datos:
munic1$km2 = munic1$MPIO_NAREA/ 1000000
munic1$km2
## [1] 1.377251e-03 5.015113e-04 3.443356e-04 2.380448e-04 4.697113e-04
## [6] 4.406308e-04 1.017631e-03 5.084909e-04 1.908361e-04 1.749306e-04
## [11] 2.102063e-03 3.435981e-04 6.690557e-04 5.075165e-04 6.519504e-04
## [16] 2.164989e-04 1.813222e-04 9.679717e-05 2.196615e-04 5.057438e-04
## [21] 3.227434e-04 2.151819e-04 2.719545e-04 2.823726e-04 2.933432e-04
## [26] 2.022812e-04 4.239322e-04 8.598300e-04 9.538043e-04 6.501113e-05
## [31] 3.544253e-04 1.754130e-03 4.230130e-04 4.022036e-04 2.046219e-03
## [36] 7.758495e-04 7.394762e-04 1.932268e-04 3.834070e-04 4.122262e-04
## [41] 2.701866e-04 1.900782e-04 1.978464e-04 3.346328e-04 2.792155e-04
## [46] 4.304630e-04 3.048869e-04
munic$geometry
## Geometry set for 1121 features
## Geometry type: MULTIPOLYGON
## Dimension: XY
## Bounding box: xmin: -81.73562 ymin: -4.229406 xmax: -66.84722 ymax: 13.39473
## Geodetic CRS: MAGNA-SIRGAS
## First 5 geometries:
## MULTIPOLYGON (((-75.66974 6.373599, -75.66965 6...
## MULTIPOLYGON (((-75.46938 5.94575, -75.46897 5....
## MULTIPOLYGON (((-76.08351 6.750504, -76.08325 6...
## MULTIPOLYGON (((-75.0332 6.415864, -75.03313 6....
## MULTIPOLYGON (((-75.67587 6.085613, -75.6754 6....
Cambiamos a usar centersxycenters 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(munic1))
## Warning: st_centroid assumes attributes are constant over geometries
centers$x = st_coordinates(centers)[,1]
centers$x
## [1] -75.25258 -74.94078 -74.98631 -74.80442 -75.19117 -74.84750 -75.48229
## [8] -75.49746 -74.74700 -75.18906 -75.58985 -74.91148 -75.14854 -74.68937
## [15] -74.80258 -74.89353 -74.95704 -74.83709 -75.05229 -74.97657 -75.24323
## [22] -74.53964 -74.92337 -75.04763 -74.90668 -74.63783 -75.21994 -75.12202
## [29] -75.27824 -75.01845 -74.92091 -75.81685 -74.87248 -74.87451 -75.85482
## [36] -75.59428 -75.34759 -75.01860 -75.49909 -75.11245 -75.20713 -74.81858
## [43] -75.17148 -74.92089 -75.15583 -74.61897 -74.78303
centers$y = st_coordinates(centers)[,2]
centers$y
## [1] 4.451919 3.390013 4.582622 4.824907 4.631786 5.006757 3.428434 4.406966
## [9] 4.123414 5.016691 3.743690 4.354156 3.738624 3.982521 3.597861 4.166477
## [17] 5.079255 4.242813 5.186693 4.076498 5.068553 4.133273 4.866033 4.877932
## [25] 5.235322 4.186067 4.826735 3.540516 3.937790 5.094035 4.485001 3.098974
## [33] 3.729167 3.854282 3.468064 4.097858 4.216730 3.912542 3.955140 4.128605
## [41] 4.729114 4.048927 4.182124 4.709882 4.965859 3.854379 5.179411
munic1$Long <- centers$x
munic1$Lat <- centers$y
library(leaflet)
# Crear el mapa
map <- leaflet(munic1) %>%
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", munic1$km2)(munic1$km2),
highlightOptions = highlightOptions(
color = "white", weight = 2,
bringToFront = TRUE
)
) %>%
# Agregar marcadores (puntos)
addMarkers(
lng = munic1$Long, lat = munic1$Lat,
popup = ~munic1$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