En primer lugar, se inactiva la notación científica.
options(scipen = 999)
Para la extracción de las variables naturales que serán evaluadas, es necesario contar con los siguientes ficheros:
library(sf)
## Warning: package 'sf' was built under R version 4.3.3
## Linking to GEOS 3.11.2, GDAL 3.8.2, PROJ 9.3.1; sf_use_s2() is TRUE
sf_region <- st_read("D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/sf_region.geojson")
## Reading layer `sf_region' from data source
## `D:\G171_Procesos_Geomorfologicos_2022\2_Procesos_Ladera\Practica_Laderas\sf_region.geojson'
## using driver `GeoJSON'
## Simple feature collection with 93 features and 1 field
## Geometry type: POINT
## Dimension: XY
## Bounding box: xmin: -126163 ymin: 5366748 xmax: 938906 ymax: 6173275
## Projected CRS: WGS 84 / UTM zone 10N
bbox_new <- st_read("D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/bbox_new.geojson")
## Reading layer `bbox_new' from data source
## `D:\G171_Procesos_Geomorfologicos_2022\2_Procesos_Ladera\Practica_Laderas\bbox_new.geojson'
## using driver `GeoJSON'
## Simple feature collection with 1 feature and 0 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: -864334 ymin: 5062152 xmax: 1616492 ymax: 6703487
## Projected CRS: WGS 84 / UTM zone 10N
plot(st_geometry(sf_region))
plot(st_geometry(bbox_new), add = TRUE)
Para analizar las condiciones topográficas favorables a la génesis de
los movimientos de ladera, se utilizará la información contenida en un
modelo digital del terreno. Para ello se utilizará el paquete
elevatr
, a través del que se puede
descargar directamente un mdt con diferentes niveles de resolución.
Este paquete puede descargarse directamente desde desde el repositorio CRAN.
library(terra)
## Warning: package 'terra' was built under R version 4.3.3
## terra 1.8.21
#install.packages("elevatr")
library(elevatr)
## Warning: package 'elevatr' was built under R version 4.3.3
## 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.
La función elevatr::get_elev_raster()
descarga un mdt en
formato ráster desde el sitio web “AWS Open Data Terrain Tiles”. Para
hacerlo necesitamos varios argumentos:
locations es el marco espacial del ámbito analizado.
z el nivel de resolución del mdt veáse
`
clip objeto espacial para recortar
mdt <- elevatr::get_elev_raster(locations = bbox_new, # El área espacial que nos interesa
z = 7, # La resolución del mdt
clip = "locations") # El ámbito espacial que nos interesa
## Mosaicing & Projecting
## Clipping DEM to locations
## Note: Elevation units are in meters.
Como el modelo digital del terreno es suministrado en un formato
diferente al SpatRaster
de terra()
, se
transforma con el siguiente código.
mdt <- as(mdt, "SpatRaster")
Si existen valores inferiores a 0 (topografía submarina) deben eliminarse.
mdt <- app(mdt,
function(x){x[x < 0] <- NA;return(x)})
names(mdt) <- "altitud"
A continuación, se procede a reproyectar el objeto raster
mdt
, que originalmente fue descargado en forma de
coordenadas geográficas, a coordenadas proyectadas correspondientes a la
zona 10N UTM.
mdt <- project(mdt,
"EPSG:32610")
crs(mdt, describe = TRUE)
## name authority code
## 1 WGS 84 / UTM zone 10N EPSG 32610
## area
## 1 Between 126°W and 120°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - British Columbia (BC); Northwest Territories (NWT); Nunavut; Yukon. United States (USA) - Alaska (AK)
## extent
## 1 -126, -120, 0, 84
Para elaborar un mapa que muestre los movimientos de ladera
superpuestos a un mdt, usando ggplot()
, es necesario
convertir el objeto ráster mdt
en un dataframe, mediante la
función as.data.frame()
, especificando las dimensiones x e
y. En este dataframe, el nombre de la variable será
altitud
.
mdt_df <- as.data.frame(mdt,
xy = TRUE)
colnames(mdt_df)[3] <- "altitud"
Además, las filas con valores ausentes (“NA”) serán eliminadas,
usando la función complete.cases()
.
mdt_df <- mdt_df[complete.cases(mdt_df), ]
mdt_df <- subset(mdt_df,
altitud >= 0)
A continuación ya se pueden representar gráficamente los movimientos de ladera con un mapa topográfico de fondo.
library(ggplot2)
## Warning: package 'ggplot2' was built under R version 4.3.3
ggplot() +
geom_raster(data = mdt_df, aes(x = x, y = y, fill = altitud)) +
geom_sf(data = sf_region, color = "red", fill = NA) +
coord_sf() +
scale_fill_viridis_c(limits = c(0, 4000)) +
labs(title = "Mapa topográfico de Columbia Britanica", x = "Longitud", y = "Latitud", fill = "Altitud (metros)")
Tras la elaboración del mapa, el dataframe mdt_df
puede
ser eliminado del Global Environment.
rm(mdt_df)
Con el DEM listo, se pueden derivar otras variables relacionadas con
la altitud, como la pendiente, la rugosidad etc… Para ello se recurre a
la función terrain()
, que facilita su cálculo. Los
argumentos que acompañan a la función son muy sencillos:
mdt nombre del objeto ráster sobre el que se aplica la función.
opt nombre del parámetro topográfico a calcular (slope -pendiente-, aspect -orientación-, TPI, TRI, roughness, flowdir).
unit unidad en la que se mide ese parámetro (sólo importante para el cálculo de la pendiente y de la orientación).
Las variables a obtener son:
mdt_pendiente <- terrain(mdt, v="slope", unit = "degrees")
plot(mdt_pendiente,
col = rainbow(20), main= "Pendiente (º)")
mdt_orientacion <- terrain(mdt, v = "aspect", unit = "degrees")
plot(mdt_orientacion,
col = rainbow(20),
main= "Orientación (º)")
mdt_tri <- terrain(mdt, v = "TRI")
plot(mdt_tri,
main= "Índice de rugosidad del terreno (TRI)",
col=rainbow(50))
mdt_tpi <- terrain(mdt, v = "TPI")
plot(mdt_tpi,
main= "Índice de Posición Topográfica (TPI)",
col=rainbow(50))
#install.package(spatialEco)
library(spatialEco) #Para el cálculo de la curvatura
## Warning: package 'spatialEco' was built under R version 4.3.2
##
## Attaching package: 'spatialEco'
## The following objects are masked from 'package:terra':
##
## is.empty, shift, sieve
La curvatura se puede calcular siguiendo varios métodos; el elegido
en este caso es el método de McNab en el argumento
type = "mcnab"
de la función
spatialEco::curvature
.
mdt_crv <- curvature(mdt, type="mcnab")
## |---------|---------|---------|---------|=========================================
plot(mdt_crv,
main= "Curvatura",
col=rainbow(50))
A continuación, se agruparán todos los ficheros ráster relacionados con la topografía en un único objeto ráster que contendrá 7 capas, una por cada variable.
topografia <- c(mdt, mdt_pendiente, mdt_orientacion, mdt_tpi, mdt_tri, mdt_crv)
names(topografia) <- c("altitud", "pendiente", "orientacion", "TPI", "TRI", "curvatura")
Este objeto ráster deberá ser guardado
writeRaster(topografia, "D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/topografia.tif", overwrite = TRUE)
## |---------|---------|---------|---------|=========================================
Como ya no son necesarios los objetos ráster originales, serán eliminados del Global environment.
rm(mdt, mdt_pendiente, mdt_orientacion, mdt_tpi, mdt_tri, mdt_crv)
A continuaciónes se obtendrán los valores de esos parámetros en los puntos de muestreo (la localización de los movimientos de ladera), creándose un dataframe para análisis posteriores. Una forma de hacerlo es crear un búfer alrededor de los puntos de muestreo y resumir los valores en el búfer, usando la media, la moda, el máximo, etc.
buffer <- st_buffer(sf_region,
500) # Tamaño del buffer: 500m
class(buffer) # Tipo de dato devuelto
## [1] "sf" "data.frame"
Podemos verificar que se ha realizado correctamente superponiendo al MDT la localización de los movimientos y los buffer circundantes.
plot(topografia[[1]],col = terrain.colors(100))
plot(st_geometry(sf_region), add = TRUE)
plot(st_geometry(buffer), add = TRUE)
Por último, se creará un dataframe con los valores medios de las
variables topográficas dentro del área de buffer, mediante la función
terra::extract()
.
df_topografia <- extract(topografia,
buffer,
fun = mean)
Como la orientación es una variable circular, el valor 0º es igual al de 360º. Por esta razón, es conveniente transformar los valores en grados en cuadrantes, que se convierten en categorías que resumen toda la gama de orientaciones en sólo 4 direcciones principales, siguiendo el siguiente cuadro:
Orientación en grados | Dirección |
---|---|
0 a 45 y 315 a 360 | Norte |
45 a 135 | Este |
135 a 225 | Sur |
225 a 315 | Oeste |
Para ello podemos utilizar la siguiente función:
cuadrantes_4 <- function(grados) {
categorias <- c("N", "E", "S", "W") # "N" se repite para incluir 360°
cortes <- seq(-45, 360, by = 90) # Definir los rangos para cada dirección
# Convertir los grados en categorías
factor_categorico <- cut(grados, breaks = cortes, labels = categorias, include.lowest = TRUE)
return(factor_categorico)
}
names(df_topografia)[4] <- "borrame"
df_topografia$orientacion <- cuadrantes_4(df_topografia$borrame)
df_topografia <- subset(df_topografia, select =-borrame)
La base de datos WorldClim proporciona datos de diferentes variables climáticas con varias resoluciones espaciales. Se puede extraer directamente desde internet con el paquete **geodata*. A continuación se extraerá la precipitación media anual.
library(geodata)
## Warning: package 'geodata' was built under R version 4.3.3
precipitacion <- worldclim_global(var="prec",
res = 5,
path=tempdir())
precipitacion <- project(precipitacion,
"EPSG:32610")
## |---------|---------|---------|---------|=========================================
crs(precipitacion, describe = TRUE)
## name authority code
## 1 WGS 84 / UTM zone 10N EPSG 32610
## area
## 1 Between 126°W and 120°W, northern hemisphere between equator and 84°N, onshore and offshore. Canada - British Columbia (BC); Northwest Territories (NWT); Nunavut; Yukon. United States (USA) - Alaska (AK)
## extent
## 1 -126, -120, 0, 84
Recorte y enmascaramiento:
precipitacion_recortado <- crop(precipitacion,
bbox_new)
precipitacion_enmascarado <- mask(precipitacion_recortado,
bbox_new)
precipitacion_mensual <- project(precipitacion_enmascarado,
topografia)
## |---------|---------|---------|---------|=========================================
El fichero original contiene varias capas, cada una de ellas
correspondiente a un mes del año. Para calcular el total anual de
precipitaciones debe aplicarse la función app()
del paquete
terra, a través de la cual se puede obtener la
precipitación anual.
precipitacion_anual <- terra::app(precipitacion_mensual, sum)
## |---------|---------|---------|---------|=========================================
A continuación se representa el mapa de la precipitación anual.
plot(precipitacion_anual,
main= "Precipitación anual",
col=rainbow(50))
Este objeto ráster podrá ser guardado
writeRaster(precipitacion_anual, "D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/precipitacion_anual.tif", overwrite = TRUE)
Se utiliza terra::extract()
para extraer los datos de
lluvia anual correspondientes a la zona en la que ocurrión cada
movimiento de ladera.
df_precipitacion <- extract(precipitacion_anual, sf_region)
names(df_precipitacion) <- c("ID", "Precipitacion")
Por último, todos los datos extraidos de la topografía y de la
precipitación se unirán en un único dataframe que llamaremos
df_naturales
.
library(plyr)
## Warning: package 'plyr' was built under R version 4.3.2
df_naturales <- join_all(list(df_topografia, df_precipitacion),
by='ID',
type='left')
View(df_naturales)
A continuación se grabará este dataframe como fichero
.csv
.
write.csv2(df_naturales,
"D:/G171_Procesos_Geomorfologicos_2022/2_Procesos_Ladera/Practica_Laderas/df_naturales.csv",
row.names = FALSE)
Finalmente, se elimina todo el conjunto de ficheros innecesarios.
rm(list = ls())