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
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