Este es un R Notebook donde se aplicará la ecuación de balance hídrico a largo plazo partiendo de información de sensores remotos. La entrada de precipitación corresponde al producto MSWEP y la de evapotranspiración potencial al producto GLEAM. El periodo seleccionado corresponde al comprendido entre 1980 y 2016.
La precipitación mensual se descargó siguiendo los pasos publicados en la página oficial http://www.gloh2o.org/mswep/ Este conjunto de datos tiene una resolución espacial de 0.1°X 0.1°
La evapotranspiración se descargó siguiendo los pasos publicados en la página oficial https://www.gleam.eu/ Este conjunto de datos tiene una resolución espacial de 0.25°X 0.25°
Desarrolle este ejercicio en un R Script
Los datos de entrada se encuentran en el siguiente link https://drive.google.com/file/d/1j7C2usHWJ1dXxAUdQ_0bmwvEpFQssBsG/view?usp=sharing
Se cargan los paquetes que se van a utilizar para desarrollar el ejercicio y la ruta en la cual se encuentran los archivos.
rm(list = ls())
library(rgdal) #para manejar datos espaciales
library(raster) #para manejar datos espaciales
library(knitr) #para hacer tablas
library(ggplot2) #para hacer mapas
# actualizar la ruta según su caso personal
ruta_info <- "Z:/My Drive/PERSONALES/TRABAJOS/2022 CURSO HIDROLOGIA UNAL/3. CLASES/BALANCE HÍDRICO/EJERCICIO PRACTICO BH LARGO PLAZO"
Se carga el polígono de la cuenca que se va a evaluar, en este caso la cuenca del río Magdalena hasta la estación Pto Berrio Automática. Tenga en cuenta que la mayoría de productos satelitales y de reanálisis provienen en coordenadas geográficas, utilice todo en un mismo sistema coordenado para evitar problemas.
cuenca <- readOGR(dsn = paste0(ruta_info,"/SHP"), layer = "CUENCA[23097030]_EPSG4326")
## OGR data source with driver: ESRI Shapefile
## Source: "Z:\My Drive\PERSONALES\TRABAJOS\2022 CURSO HIDROLOGIA UNAL\3. CLASES\BALANCE HÍDRICO\EJERCICIO PRACTICO BH LARGO PLAZO\SHP", layer: "CUENCA[23097030]_EPSG4326"
## with 1 features
## It has 18 fields
## Integer64 fields read as strings: CODIGO_CAT
Al trabajar con datos espaciales es preferible utilizar un mismo sistema de coordenadas. Se procede a verificar que el sistema de la cuenca sea WGS84.
print(crs(cuenca)) #coordenadas geográficas
## Coordinate Reference System:
## Deprecated Proj.4 representation: +proj=longlat +datum=WGS84 +no_defs
## WKT2 2019 representation:
## GEOGCRS["WGS 84",
## DATUM["World Geodetic System 1984",
## ELLIPSOID["WGS 84",6378137,298.257223563,
## LENGTHUNIT["metre",1]]],
## PRIMEM["Greenwich",0,
## ANGLEUNIT["degree",0.0174532925199433]],
## CS[ellipsoidal,2],
## AXIS["latitude",north,
## ORDER[1],
## ANGLEUNIT["degree",0.0174532925199433]],
## AXIS["longitude",east,
## ORDER[2],
## ANGLEUNIT["degree",0.0174532925199433]],
## ID["EPSG",4326]]
Se calcula el área de la cuenca ya que será usada para calculos posteriores.
area_cuenca <- area(cuenca)/1000000 #unidades km2
print(paste0("El area de la cuenca es: ", round(area_cuenca,2), " km2"))
## [1] "El area de la cuenca es: 74402.1 km2"
plot(cuenca)
La información se encuentra disponible en formato .ncdf a nivel mensual. Por tanto, se debe agregar a escala anual para después calcular el valor total anual multianual.
ruta_p <- paste0(ruta_info,"/RASTER/P/MENSUAL/")
files_p <- list.files(ruta_p)
#discretizo cuales archivos corresponden a cada año
anos <- substring(files_p, 0,4)
anos_unicos <- unique(anos)
#En este ciclo se calcula la precipitación de cada año como la suma de cada uno de los meses
anual_p <- list()
for(a in 1:length(anos_unicos)){
mensual_tmp <- list()
#en este ciclo leo el archivo correspondiente a cada mes y lo recorto con la forma de la cuenca
for(m in 1:12){
#cargar el raster del año a y mes m
mensual_tmp[[m]] <- raster(paste0(ruta_info,"/RASTER/P/MENSUAL/", anos_unicos[a],
sprintf("%02d", m),".nc"))
#Cortar y enmascarar el raster con la forma de la cuenca
mensual_tmp[[m]] <- crop(mensual_tmp[[m]], cuenca)
mensual_tmp[[m]] <- mask(mensual_tmp[[m]], cuenca)
}
#sumo todos los recortes mensuales de cada año
anual_p[[a]] <- sum(stack(mensual_tmp))
}
#promedio los campos anuales
anual_p <- mean(stack(anual_p))
plot(anual_p)
La información se encuentra disponible en formato .ncdf a nivel anual. Por tanto, se debe calcular el valor total anual multianual.
ruta_et <-paste0(ruta_info,"/RASTER/ET/ANUAL/")
#cargar achivo que contiene la evapotranspiración anual 1980-2018
anual_et <- brick(paste0(ruta_info,"/RASTER/ET/ANUAL/E_1980_2018_GLEAM_v3.3a_YR.nc"))
#verificar la cantidad de capas contenidas en el ncdf (en este caso cada capa corresponde a un año)
anos_anual_et <- dim(anual_et)[3]
plot(anual_et[[1]])
Esta fuente de información se encuentra rotada, por tanto debo corregir esto.
#Necesito rotar los raster
anual_et <- t(flip(anual_et, direction='y' ))
plot(anual_et[[1]])
Necesito solo tomar los años entre 1980 y 2016.
anos_et_gleam <- 1980:2018
anos_et_requeridos <- 1980:2016
#obtengo las posiciones de los años que se requieren
anos_et_match <- unlist(lapply(anos_et_requeridos, function(x){which(x==anos_et_gleam)}))
anual_et <- anual_et[[anos_et_match]]
#calculo el valor medio de los rasters anuales y los recorto con el polígono de la cuenca
anual_et <- mean(anual_et)
anual_et <- crop(anual_et, cuenca)
anual_et <- mask(anual_et, cuenca)
plot(anual_et)
Se aplica la ecuación de balance hídrico
#Con los ejercicios anteriores obtuvimos campos de precipitación y evapotranspiración así que calculo el valor
#medio de la cuenca
p_cuenca <- cellStats(anual_p, "mean")
et_cuenca <- cellStats(anual_et, "mean")
q_bh<- (p_cuenca - et_cuenca)*area_cuenca*0.001*(1/(365*24*60*60))*1000000
print(paste0("El caudal calculado a partir del balance a largo plazo es: " , round(q_bh,0), " m3/s"))
## [1] "El caudal calculado a partir del balance a largo plazo es: 1693 m3/s"
Utilizo la serie de caudales medios registrados en la estación.
q_estacion <- read.csv(paste0(ruta_info,"/Q_MED_M_23097030-PTO_BERRIO_AUTOMATICA.csv"),skip = 1)
q_estacion <- mean(q_estacion$Valor..Cubic.Metres.Per.Second.)
print(paste0("El caudal calculado con los registros de la estación es: " , round(q_estacion,0), " m3/s"))
## [1] "El caudal calculado con los registros de la estación es: 2299 m3/s"
tabla <- c("Fuente", "Caudal m3/s",
"Estación", round(q_estacion,0),
"BH Largo plazo",round(q_bh,0))
tabla <- matrix(tabla, nrow = 3, byrow = T)
colnames(tabla) <- tabla[1,]
tabla <- tabla[-1,]
kable(tabla, caption="Resultados")
| Fuente | Caudal m3/s |
|---|---|
| Estación | 2299 |
| BH Largo plazo | 1693 |