6. Carga de ráster

Esta sección ofrece una visión general de cómo funciona la gestión de rásteres en Giswater y describe los principales elementos implicados en la administración de datos ráster, así como los requisitos y componentes necesarios para su correcta integración y uso en distintos entornos de servidor, ya sea Linux o Windows.

Las dos tablas que actúan sobre el sistema son:

  • ext_raster_dem

  • ext_cat_raster

Estas ya están creadas, pero ext_raster_dem viene sin restricciones. En el caso de un esquema utils existente, se almacenan allí, pero con nombres distintos:

  • raster_dem

  • cat_raster

La tabla raster_dem se rellena externamente según el proceso explicado en el punto 1. Si se trata de un esquema utils corporativo, la tabla de catálogo se rellena automáticamente con un trigger AFTER INSERT durante la adquisición del ráster:

nombre de fichero (rastercat_id).

cur_user.

tstamp.

Por otro lado, para usar esta funcionalidad hay dos variables:

  • Sistema: admin_raster_dem (debe ser TRUE).

  • Usuario:

    edit_insert_elevation_from_dem (must be TRUE).

    edit_update_elevation_from_dem (must be TRUE).

Nota

Los triggers de node/connec, tanto en Insert como en Update, capturan automáticamente el valor de elevación. Por otro lado, la función gw_fct_update_elevation_from_dem de la toolbox activa automáticamente la captura de todas las cotas de la capa seleccionada.

1. Cargar ráster en la BD

Los conceptos clave a tener en cuenta son:

1.1. Nombre de fichero:

Se recomienda que el nombre incluya tanta información como sea posible sobre el ráster, ya que aportará información en la metatabla ext_cat_raster sobre su tipo:

dg_dem_2019_u48 (proveedor, tipo de ráster, año de los datos, hoja de mapa)

De este modo, al insertar el ráster también se rellena el catálogo de rásteres y contiene información detallada sobre él.

1.2. Tipo de fichero:

Si todos los rásteres DEM se insertan en la misma tabla, deben ser iguales en cuanto a formato para no romper las restricciones de las columnas de la tabla. En este sentido, al cargar el primer ráster deben crearse las restricciones tal como se define en el punto dos de este documento.

1.3. Ráster almacenado dentro o fuera de la BD:

Dado que hay dos entornos de SO para la máquina que aloja PostgreSQL, este proceso se detalla para cada uno de los dos entornos.

Una opción muy interesante para evitar cargar la base de datos y recargar ficheros automáticamente (solo hay que cambiar el fichero).

Advertencia

El proceso puede ejecutarse desde el postgres local o desde el postgres del servidor donde queremos insertar el ráster, siempre que tengamos acceso a él mediante VPN u otro método. Es más fácil en local.

Entorno Windows

  1. Comprobar que existe un ejecutable raster2pgsql en la carpeta bin de PostgreSQL.

2. Open the command prompt (cmd), go to the PostgreSQL bin folder (cd C:Program FilesPostgreSQL11bin).

3. Execute the process using a statement similar to the example shown below, specifying the SRID, the file path, the tile size, the name of the table to which the raster is imported, and the database connection:

raster2pgsql.exe -R -s 25831 -C -x raster.txt -t 1500x1500 -a utils.raster_dem -F -n rastercat_id |
psql -d giswater -U postgres -p 5432

Entorno Linux

El procedimiento puede variar según la distribución utilizada. No obstante, como regla general, la configuración del entorno debe cumplir las siguientes condiciones.

Dado que PostgreSQL suele estar instalado en el path del sistema, la ejecución por línea de comandos puede hacerse fácilmente:

raster2pgsql -s 25831 -C -x raster.txt -t 1500x1500 -a utils.raster_dem -F -n rastercat_id | psql -d giswater -U postgres -p 5432

Si por alguna razón las variables de entorno están deshabilitadas, deben habilitarse:

Opción A: fichero de entorno (con un servicio de recarga de PostgreSQL)

POSTGIS_ENABLE_OUTDB_RASTERS=1

POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL

Opción B: a través de la consola (mucho más fácil)

SET postgis.enable_outdb_rasters TO True;

SET postgis.enabled_drivers TO enable_all;

Advertencia

Si se hace con un usuario de PostgreSQL, este usuario debe tener permisos de lectura sobre el fichero. Si se hace con otro usuario (p. ej., root), este usuario debe estar registrado en pg_hba.conf y en el SGBD.

Notas sobre la sentencia

[-R] -s 25831 -C -x raster.txt -t 1500x1500 -a utils.raster_dem -F -n rastercat_id | psql -d giswater -U postgres -p 5432

Donde:

[-R]

Puede ser opcional. El ráster se almacena fuera de la base de datos. En caso contrario, se almacena dentro. El problema es que no es fácil trabajar con él. El usuario del sistema y el usuario de Postgres deben ser el mismo y tener permisos de lectura/escritura de ficheros. Esta opción es opcional, pero puede ser esencial según la estrategia de almacenamiento elegida.

Nota

Para usar esta opción, deben definirse las siguientes variables de entorno:

  • POSTGIS_ENABLE_OUTDB_RASTERS

  • POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL

[-s 25831]

El SRID es obligatorio.

[-C]

Añade restricciones, necesarias solo al cargar el primer ráster. Las restricciones que se crean son:

  • Altura del ráster (número de filas): enforce_height_rast

  • Ancho del ráster (número de columnas): enforce_width_rast

  • Valor no-data: enforce_nodata_values_rast

  • Número de bandas (para DEM, 1): enforce_num_bands_rast

  • Tipo de píxel (1bit, 2bit, 4bit…): enforce_pixel_types_rast

  • Escala X: enforce_scalex_rast

  • Escala Y: enforce_scaley_rast

  • SRID: enforce_srid_rast

  • out_db (mantenimiento de la información fuera de la base de datos)

  • Extensión máxima: enforce_max_extent_rast

Advertencia

Aunque es posible definir restricciones, no se recomienda su uso, ya que pueden afectar al rendimiento y a la flexibilidad al cargar datos ráster.

[-x]

Excluye la restricción de dimensión espacial. Es obligatorio usarla si el objetivo es poner más de un ráster en la misma tabla (lo cual será habitual).

Extensión máxima: enforce_max_extent_rast

[raster.txt]

Nombre de fichero. Sin espacios, pero con metadatos.

[-t 1500x1500]

Tamaño de celda en la base de datos.

Límites: 5000x5000. Superar este tamaño provoca un error de memoria (Failed to allocate memory).

El tamaño recomendado no debe superar 2000x2000 por fila.

Se creará una nueva tabla en la base de datos (no se permiten actualizaciones) con la estructura definida. El proceso divide el ráster en partes según el tamaño especificado; cada fila de la tabla representa una parte del ráster.

El punto clave es que el tamaño de entrada (por ejemplo, 1500x1500) sea un divisor del tamaño del ráster. El divisor ideal es 1 a 1, pero si el ráster supera 2000x2000, siempre debe dividirse usando divisores exactos.

Ejemplos:

Raster 1000x1000 → -t 1001x1001 → 1 row

Raster 1000x1000 → -t 1000x1000 → 4 rows

Raster 2000x2000 → -t 2001x2001 → 1 rows

Raster 2200x2200 → -t 1100x1100 → 4 rows

Raster 5555x5555 → -t 1111x1111 → 16 rows

[-a utils.raster_dem]

Añade el ráster a la tabla, obligatorio; de lo contrario, crearía una nueva, provocando un conflicto.

[-F]

Añade el nombre del fichero, obligatorio e importante para conocer el nombre del fichero.

[-n rastercat_id]

Para el nombre de la columna donde se insertará el nombre del fichero. Obligatorio.

[-d giswater -U postgres -p 5432]

Parámetros de conexión: si se hace con un usuario de PostgreSQL, es directo. Si se hace con otro usuario, pedirá la contraseña, que también puede proporcionarse.

Consultas de ejemplo para cargar rásteres directamente desde la línea de comandos en localhost:

  • Insertamos en el host 000.000.00:5432 con el usuario ‘admin’ e insertamos directamente en una tabla existente ‘utils.raster_dem’ (variable -a):

"C:\Program Files\PostgreSQL\9.6\bin\raster2pgsql.exe" "C:\Users\usuari\Desktop\
raster.tif" -I -C -x -a -s 25831 -t 1500x1500 -F -n rastercat_id utils.raster_dem | "C:\
Program Files\PostgreSQL\9.6\bin\psql.exe" -h 000.000.00 -p 5432 -d gis -U admin
  • Insertamos en el host 000.000.00:5432 con el usuario ‘admin’ e insertamos en una tabla nueva que se llamará ‘ws.raster’ (variable -c):

"C:\Program Files\PostgreSQL\11\bin\raster2pgsql.exe" "C:\Users\usuari\Desktop\mde\
mde.tif" -I -C -x -c -s 25831 -t 1500x1500 -F -n rastercat_id ws.raster | "C:\Program Files\
PostgreSQL\11\bin\psql.exe" -h 000.000.00 -p 5432 -d gis -U admin