4 Almacenar información desde R

En primer lugar debemos definir una conexión con la BD en el SGBD PostGIS. Después, almacenar las capas. Por último, debemos cerrar la conexión.

4.1 Definir la conexión con la BD

Para definir la conexión usamos la función dbConnect del paquete DBI, también incluida en el paquete RPostgres que es el que usamos. Indicamos el nombre de la BD (en mi caso lanjaron_jsamos, que tenemos que haberla creado previamente), y los datos de nuestra instalación.

Si queremos comprobar que se ha establecido bien la conexión, mediante la función dbListTables obtenemos una lista de las tablas de la BD.

con <- RPostgres::dbConnect(
  RPostgres::Postgres(),
  dbname = 'lanjaron_jsamos',
  host = 'localhost',
  port = '5432',
  user = 'postgres',
  password = 'xxxxxxxx'
)

RPostgres::dbListTables(con)
# [1] "geography_columns" "geometry_columns"  "spatial_ref_sys"   "raster_columns"    "raster_overviews" 

4.2 Almacenar una capa vectorial

Para almacenar una capa vectorial en PostGIS desde R también usaremos la función st_write del paquete sf, tal y como se ha hecho para los otros SGBD. La diferencia es que ahora indicamos la conexión (con) en lugar del archivo.

sf::st_write(obj = lanjaron_jsamos,
             dsn = con,
             layer = "lanjaron_jsamos")

4.2.1 Copiar estilos de CORINE Land Cover

Una vez tengamos las capas de CORINE Land Cover almacenadas en la BD y tenemos la conexión (con), podemos copiar los estilos desde el GeoPackage mediante la función siguiente:

from <- "clc-lanjaron-jsamos.gpkg"
layers <- c("clc_lanjaron_bbox_jsamos", "clc_lanjaron_jsamos")
database <- "lanjaron_jsamos"

sigugr::copy_styles(from=from, to=con, database = database, to_layers = layers)

Como en la BD hay más capas, debemos indicar el nombre de las capas a las que aplicar los estilos.

4.3 Almacenar un ráster

Para almacenar las capas ráster, usaremos las funciones del paquete rpostgis para escribir en la BD y las funciones del paquete raster para leer las capas.

En la función pgWriteRast indicamos mediante un vector el esquema de la BD donde se almacena (las almacenaremos en el esquema public) y la tabla. Esta función no permite usar el carácter ‘-’ en el nombre de las tablas.

r <- terra::rast("mdt-lanjaron-bbox-jsamos.tif")
layer <- "mdt_lanjaron_bbox_jsamos"

rpostgis::pgWriteRast(con, c("public", layer), raster = r)

Esta función almacena todas las bandas del ráster en la misma tabla. Para la ortofotografía es adecuado almacenar todas las bandas en la misma tabla, pero no para las bandas de satélite.

4.3.1 Bandas de satélite

Para las bandas de satélite, vamos a almacenar cada banda en una tabla distinta. Podemos usar el código siguiente para acceder a las bandas almacenadas en un archivo.

file <- "sat-r30m-lanjaron-bbox-jsamos.tif"
sr <- terra::rast(file)
for (b in names(sr)) {
  rb <- sr[[b]]
  # ...
}

El nombre de la banda está en b, el ráster con la banda a almacenar en rb.

4.4 Finalizar la conexión con la BD

Una vez hemos acabado de operar con la BD, nos desconectamos de ella mediante la función dbDisconnect.

 RPostgres::dbDisconnect(con)

4.5 Funciones de ayuda

En los GeoPackage y los archivos GeoTIFF, en el criterio de nombres que usamos, el separador era el carácter “-”. Para los nombres de tablas en la BD usamos como separador el carácter “_” (en algún caso no hay opción, no puede ser “-”). Mediante la función siguiente se sustituye un carácter por otro en una cadena de caracteres.

layer <- gsub("-", "_", layer)

Para reconocer obtener el nombre de un archivo, sin considerar el path y la extensión, podemos usar la combinación de funciones siguiente.

name <- tools::file_path_sans_ext(basename(file_name))

Para obtener una subcadena a partir de una cadena, desde el principio y hasta el final, respectivamente.

prefix <- substr(name, 1, 9)

sufix <- substr(name, 9, nchar(name))