Este cuaderno es una guía para facilitar el desarrollo de la actividades en clase de los cursos: Hidroclimatológia (pregrado y posgrado) y Modelación de procesos hidrológicos de la FEAR-PUJ, y fue consolidado con la ayuda de Jhon Pulgarin (estudiante de Maestría en Hidrosistemas en la PUJ).
El presente cuaderno inicia con el preprocesamiento del Modelos de Elevación Digital (DEM) y termina con la delimitación de la cuenca.
Antes de iniciar, es recomendable iniciar limpiando el espacio de trabajo y llamando de una vez todos las librerías que se vayan a necesitar. Si no se tiene instalada alguna de las librerías es necesario hacerlo con el comando “install.packages”. Así mismo, se selecciona el directorio de trabajo donde se tiene el archivo con la información a procesar.
Para poder desarrollar las actividades que aquí se proponen es necesario que en su equipo de cómputo tenga descargados e instalados de manera correcta los siguientes programas:
R The R Project for Statistical Computing. Página web en principal del proyecto. CRAN Mirrors (haga click sobre la palabra, es un hipervínculo), aquí encontrará diferentes versiones desarrolladas por universidades, institutos, centros de investigación, entre otros, de diferentes países.
El IDE RStudio para que la manipulación sea más amigable y cómoda con el usuario RStudio Desktop (haga click sobre la palabra, es un hipervínculo).
Y, cualquier versión estable de GRASS-GIS (haga click sobre la palabra, es un hipervínculo).
Los procesos que se desarrollarán a continuación están realizados con información que podrá descargar AQUÍ (haga click sobre la palabra, es un hipervínculo). Note que únicamente requieren como entradas un DEM y la referencia del punto de cierre (para el caso es una estación de monitoreo limnimétrica).
Para iniciar, es importante que ninguna variable de procesos anteriores o alojada en el ambiente interfiera en los procesos a desarrollar, así que, para empezar se realiza una limpieza del ambiente de trabajo con el uso de la siguiente línea de comando:
rm(list=ls(all=TRUE))
Luego, se debe definir la carpeta de trabajo, para el caso, esta será la que almacenará tanto las entradas (DEM y punto de cierre) para llevar a cabo el proceso, como la que recibirá las salidas. Es por ello que, se aconseja que cree una carpeta para esta actividad.
Conforme con lo mencionado, en las siguientes líneas se expresa cómo se direccionar la carpeta al entorno de trabajo:
Ahora, se recomienda guardar el Script en el que se está trabajando (sí hasta ahora no se ha hecho) y, dado que ya se definió la carpeta de trabajo, por defecto al salvar el progreso será direccionado por defecto a esta, lo único que se debe hacer es colocar un nombre.
Recuerde, antes de iniciar cualquier proceso en un medio de programación (para el caso es R), siempre tendrá que cargar las respectivas librerías, paquetes o subseries que contienen los códigos de soporte de cada uno de los comandos, para ello, inicialmente deberá instalarlas (en caso de no tenerlas aún, se recomienda instalarlas una única vez, a menos de que R lo solicite, por ejemplo, para ser actualizada); para ello, cuenta con varias opciones para hacerlo, a continuación se muestra la más cómoda. Para realizarlo, simplemente tendrá que quitar el comentario (eliminar el signo #) y correr cada una de las líneas. Al terminar, se aconseja volver a colocar en comentario.
# install.packages("rgrass")
# install.packages("RSAGA")
# install.packages("raster")
# install.packages("rgdal")
# install.packages("sf")
# install.packages("sp")
# install.packages("prettymapr")
# install.packages("ggplot2")
# install.packages("ggspatial")
# install.packages("shapefiles")
Una vez se logró instalar las librerías con éxito, se procede a habilitarlas de la siguiente manera:
library("rgrass")
library("RSAGA")
library("raster")
library("rgdal")
library("sf")
library("sp")
library("prettymapr")
library("ggplot2") # Para las gráficas
library("ggspatial") #Para los datos espaciales en las gráficas
library("shapefiles")
Como ya se mencionó, este proceso se realiza con los datos que puede descargar AQUÍ (haga click sobre la palabra, es un hipervínculo). Recuerde, en lo posible, debe organizarlos dentro de la carpeta de trabajo. Asimismo, tenga en cuenta que el DEM ha tenido un pre-procesamiento, en este lo que se realizó fue recortar el ráster al tamaño del área de estudio o zona de influencia.
Estacion_cierre=shapefile("Est_Paicol.shp")
## Warning: [vect] Z coordinates ignored
DEM=raster("mascara4.tif")
# Note que antes del archivo se encuentran dos (2) carpetas, a esto hace referencia
# lo descrito anteriormente en el direccionamiento de la carpeta de trabajo, los
# archivos se están llamando desde carpetas internas dentro de la carpeta de trabajo
Inicialmente, explore el sistema de coordenadas en el que se encuentran los archivos espaciales. Por medio de las siguientes líneas podrá ver la estructura PROJ4 del sistema de coordenadas en el que se encuentra.
Estacion_cierre@proj4string@projargs
# projection(Estacion_cierre) # Es similar al anterior
DEM@crs@projargs
# projection(DEM)
A continuación, se asegura y/o se llevan los archivos a una misma proyección cartográfica para realizar los procesos sin algún tipo de interferencia/error por esto. Para el caso, se trabajá todo con el sistema de coordenadas plano MAGNA-SIRGAS / Origen-Nacional (EPSG: 9377), oficial para Colombia. para mayor información dirijase a https://origen.igac.gov.co/docs/ABC_Nueva_Proyeccion_Cartografica_Colombia.pdf. Sin embargo, tenga en cuenta que para este ejercicio, la reproyección no es tan representativa, ya que los archivos ya se encuentran proyectados a dicho sistema de coordenadas.
Estacion_cierre=spTransform(Estacion_cierre,crs("+init=epsg:9377"))
# projection(Estacion_cierre) = crs("+init=epsg:9377") # Otra forma de reproyectar shape
DEM=projectRaster(DEM,crs=crs("+init=epsg:9377"))
# projection(DEM) = crs("+init=epsg:9377") # Otra forma de reproyectar raster
Sí desea verificar lo hecho hasta ahora construya una gráfica rápida de la siguiente manera:
plot(DEM)+
plot(Estacion_cierre, add = TRUE)
Finalmente, los archivos reproyectados se exportan a las carpetas de trabajo, esto para ser usados como insumo dentro de los procesos.
# Exportar vector
writeOGR(Estacion_cierre, dsn = "C:/Users/ASUS/Downloads/prueba3", layer = "Estacion_cierre_paicol1",
driver = "ESRI Shapefile",overwrite_layer=T)
## Warning: OGR support is provided by the sf and terra packages among others
## Warning: OGR support is provided by the sf and terra packages among others
# Exportar Ráster
writeRaster(DEM,"DEM_EPSG9377.tif",overwrite = T)
Para realizar el modelado de cuencas hidrográficas se usa el paquete rgrass (consultar en el CRAN: https://cran.r-project.org/web/packages/rgrass/rgrass.pdf). Este se encuentra actualizado y aparentemente no genera conflicto con las versiones recientes o anteriores, como sí lo hacía rgrass7. Grass se debe descargar desde este link https://grass.osgeo.org/news/2022_01_30_grass_gis_8_0_0_released/ e instalar en archivos de programa.
A continuación, se detalla uno a uno los pasos para llevar a cabo procesos dentro de GRASS-GIS con el objeto de delimitar una cuenca hidrográfica que, para el caso, será de ejemplo la Subzona hidrográfica (SZH) del Río Güejar ubicada en el departamento del Meta, de Colombia.
Location ="Loc_EPSG9377"
Mapset="Delimitacion_cuenca"
\[\begin{equation} Threshold = \frac{1 Km^2}{(0.09^2) Km^2} = 123.46 \end{equation}\]
Aproximando por encima, el Threshold a usar será de 124 unidades.
Threshold=124
initGRASS(# Direccionar al ejecutable de GRASS-GIS, para el caso se trabajará con la
# versión 8.0
gisBase = "C:/Program Files/GRASS GIS 8.0", # Puede ponerse como NULL
# Direccionar la carpeta GRASSDATA, allí se guarda todo el trabajo realizado
gisDbase = "C:/Users/ASUS/OneDrive - Pontificia Universidad Javeriana/Javeriana/Hidroclimatologia - Ecologia/grassdata",
# Acá se crea una nueva Location, por ese se definió el nombre anterior
location =Location,
# El mapset creado por defecto es PERMANENT, pero por sí acaso se establece
mapset="PERMANENT", # Se recomienda no modificar
# Para que sobreescriba y no genere conflicto
override=T)
## Warning in system(syscmd, intern = intern, ignore.stderr = ignore.stderr, :
## comando ejecutado 'g.proj.exe -w' tiene estatus 884
## gisdbase C:/Users/ASUS/OneDrive - Pontificia Universidad Javeriana/Javeriana/Hidroclimatologia - Ecologia/grassdata
## location Loc_EPSG9377
## mapset PERMANENT
## rows 1
## columns 1
## north 1
## south 0
## west 0
## east 1
## nsres 1
## ewres 1
## projection +proj=tmerc +lat_0=4 +lon_0=-73 +k=0.9992 +x_0=5000000 +y_0=2000000
## +ellps=GRS80 +units=m +no_defs +type=crs
execGRASS("g.proj", epsg=9377, flag=c("c"))
# Imprimir las propiedades de la location para comprobar que se proyectó al sistema de
# coordenadas
execGRASS("g.proj", flag=c("p"))
execGRASS("g.mapset", mapset=Mapset, flag=c("c","overwrite"))
# Verifique dónde se encuentra parado
execGRASS("g.gisenv", flag="n")
# Sí se tuviera que cambiar de mapset
# execGRASS("g.mapset", mapset=Mapset, location =Location)
# Información de la region de trabajo hasta ahora (note los valores)
execGRASS("g.region", flag=c("p"))
# Cargar DEM al Mapset
execGRASS("r.in.gdal", input="DEM_EPSG9377.tif",output="DEM",
flag=c("overwrite"))
# Definir region de trabajo a partir del DEM
execGRASS("g.region", raster="DEM", flag=c("p"))
execGRASS("g.gisenv", flag="n")
execGRASS("g.region", flag=c("p"))
execGRASS("g.proj", flag=c("p"))
Logrado lo anterior, se procede a los siguientes pasos:
execGRASS("r.fillnulls", input="DEM",output="DEM_fill", method="bilinear",
flag=c("overwrite"))
execGRASS("r.watershed", elevation="DEM_fill", threshold=Threshold, accumulation="accum",
drainage="drainage_dir", stream="stream", slope_steepness="slope_steepness",
flag=c("s", "overwrite"))
execGRASS("v.in.ogr", input="Estacion_cierre_paicol1.shp",
output="Estacion_cierre", flag=c("overwrite"))
# Exportar los flujos de las acumulaciones
execGRASS("r.out.gdal", input="accum", format="GTiff",
output="f_accum.tif",
flag=c("overwrite"))
# Esta sería la coordenada de la estación es sólo para ver la diferencia
Coord_Estacion_cierre=Estacion_cierre@coords
# Aquí se pega la coordenada tomada. En este punto verifique que la estación esta sobre la red de drenaje usando el F_accum generado en unos pasos anteriores y use esa coordenada.
#Coord_Estacion_cierre=c(4924940.005874055, 1886190.791635942)
Coord_Estacion_cierre=c(4692843.59, 1830194.005)
execGRASS("r.water.outlet", input="drainage_dir", output="Cuenca_9377",
coordinates=Coord_Estacion_cierre,flag=c("overwrite"))
execGRASS("r.to.vect", input="Cuenca_9377", output="Cuenca_9377", type="area",
flag=c("s", "overwrite"))
execGRASS("v.out.ogr", input="Cuenca_9377", type="area", format="ESRI_Shapefile",
output="Cuenca_9377_GRASS.shp",
flag=c("c", "overwrite"))
Aquí se exponen dos maneras de generar los mapas (a cada una de las opciones le podrá agregar más cosas):
# Cargar el archivo vector generado de la cuenca como shp
Cuenca_GRASS=shapefile("Cuenca_9377_GRASS.shp")
plot(Cuenca_GRASS,axes = TRUE,main = "Cuenca hidrográfica modelada",
xlab = "Este (m.)",
ylab = "Norte (m.)",
las = 2, cex.axis=0.6, col="blue")
plot(Estacion_cierre, add = TRUE, col="red")
grid(col = "gray")
addnortharrow("topleft",scale = 0.4)
addscalebar(plotunit = "km",pos = "bottomright", unitcategory = "metric")
# Cargar el archivo vector generado de la cuenca como sf
Cuenca_GRASS=st_read("Cuenca_9377_GRASS.shp")
## Reading layer `Cuenca_9377_GRASS' from data source
## `C:\Users\ASUS\Downloads\prueba3\Cuenca_9377_GRASS.shp' using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 3 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 4632052 ymin: 1789379 xmax: 4701492 ymax: 1881418
## Projected CRS: MAGNA-SIRGAS / Origen-Nacional
ggplot(data = Cuenca_GRASS) +
geom_sf(fill = "greenyellow",color="black") +
# coord_sf(crs = sf::st_crs(9377)) + xlab("Este") + ylab("Norte") +
theme (axis.text.x = element_text(size=rel(0.7),vjust=0.5),
axis.text.y = element_text(size=rel(0.7), angle=90, hjust=0.5))+
xlab("Este") + ylab("Norte") +
theme(axis.title.x = element_text(face="bold", vjust=-0.5, size=rel(1))) +
theme(axis.title.y = element_text(face="bold", vjust=1.5, size=rel(1))) +
ggtitle("Cuenca hidrográfica modelada",
subtitle = "Delimitación de cuencas hidrográficas") +
annotation_scale() +
annotation_north_arrow(location='tr')
Y con el fin de exportar cada uno de los mapas en diferentes formatos:
pdf("Mapa_plot.pdf", onefile=TRUE , height=12 , width=8 , paper="a4")
Cuenca_GRASS=shapefile("Cuenca_9377_GRASS.shp")
# Margen del mapa abajo, izquierda, arriba y derecha
par(mar = c(4, 4, 2.5, 2), xpd = FALSE)
plot(Cuenca_GRASS,axes = TRUE,main = "Cuenca hidrográfica modelada",
xlab = "Este (m.)",
ylab = "Norte (m.)",
las = 2, cex.axis=0.6, col="blue")
plot(Estacion_cierre, add = TRUE, col="red")
grid(col = "gray")
addnortharrow("topleft",scale = 0.4)
addscalebar(plotunit = "km",pos = "bottomright", unitcategory = "metric")
dev.off()
## png
## 2
jpeg("Mapa_ggplot.jpeg", quality = 500)
Cuenca_GRASS=st_read("Cuenca_9377_GRASS.shp")
## Reading layer `Cuenca_9377_GRASS' from data source
## `C:\Users\ASUS\Downloads\prueba3\Cuenca_9377_GRASS.shp' using driver `ESRI Shapefile'
## Simple feature collection with 1 feature and 3 fields
## Geometry type: POLYGON
## Dimension: XY
## Bounding box: xmin: 4632052 ymin: 1789379 xmax: 4701492 ymax: 1881418
## Projected CRS: MAGNA-SIRGAS / Origen-Nacional
par(mar=c(4,4,.5,.5))
ggplot(data = Cuenca_GRASS) +
geom_sf(fill = "greenyellow",color="black") +
# coord_sf(crs = sf::st_crs(9377)) + xlab("Este") + ylab("Norte") +
theme (axis.text.x = element_text(size=rel(0.7),vjust=0.5),
axis.text.y = element_text(size=rel(0.7), angle=90, hjust=0.5))+
xlab("Este") + ylab("Norte") +
theme(axis.title.x = element_text(face="bold", vjust=-0.5, size=rel(1))) +
theme(axis.title.y = element_text(face="bold", vjust=1.5, size=rel(1))) +
ggtitle("Cuenca hidrográfica modelada",
subtitle = "Delimitación de cuencas hidrográficas") +
annotation_scale() +
annotation_north_arrow(location='tr')
dev.off()
## png
## 2