6. Càrrega de ràster
Aquesta secció ofereix una visió general de com funciona la gestió de ràsters a Giswater i descriu els principals elements implicats en l’administració de dades ràster, així com els requisits i components necessaris per a la seva correcta integració i ús en diferents entorns de servidor, ja sigui Linux o Windows.
Les dues taules que actuen sobre el sistema són:
ext_raster_dem
ext_cat_raster
Aquestes ja estan creades, però ext_raster_dem ve sense restriccions. En el cas d’un esquema utils existent, s’emmagatzemen allà, però amb noms diferents:
raster_dem
cat_raster
La taula raster_dem es omple externament segons el procés explicat al punt 1. Si es tracta d’un esquema utils corporatiu, la taula de catàleg s’omple automàticament amb un trigger AFTER INSERT durant l’adquisició del ràster:
nom de fitxer (rastercat_id).
cur_user.
tstamp.
D’altra banda, per usar aquesta funcionalitat hi ha dues variables:
Sistema: admin_raster_dem (ha de ser TRUE).
Usuari:
edit_insert_elevation_from_dem (must be TRUE).
edit_update_elevation_from_dem (must be TRUE).
Nota
Els triggers de node/connec, tant en Insert com en Update, capturen automàticament el valor d’elevació. D’altra banda, la funció gw_fct_update_elevation_from_dem de la toolbox activa automàticament la captura de totes les cotes de la capa seleccionada.
1. Carregar ràster a la BD
Els conceptes clau a tenir en compte són:
1.1. Nom de fitxer:
Es recomana que el nom inclogui tanta informació com sigui possible sobre el ràster, ja que aportarà informació a la metataula ext_cat_raster sobre el seu tipus:
dg_dem_2019_u48 (proveïdor, tipus de ràster, any de les dades, full de mapa)
D’aquesta manera, en inserir el ràster també s’omple el catàleg de ràsters i conté informació detallada sobre ell.
1.2. Tipus de fitxer:
Si tots els ràsters DEM s’insereixen a la mateixa taula, han de ser iguals pel que fa al format per no trencar les restriccions de les columnes de la taula. En aquest sentit, en carregar el primer ràster cal crear les restriccions tal com es defineix al punt dos d’aquest document.
1.3. Ràster emmagatzemat dins o fora de la BD:
Atès que hi ha dos entorns de SO per a la màquina que allotja PostgreSQL, aquest procés es detalla per a cadascun dels dos entorns.
Una opció molt interessant per evitar carregar la base de dades i recarregar fitxers automàticament (només cal canviar el fitxer).
Avís
El procés es pot executar des del postgres local o des del postgres del servidor on volem inserir el ràster, sempre que hi tinguem accés mitjançant VPN o un altre mètode. És més fàcil en local.
Entorn Windows
Comprovar que hi ha un executable raster2pgsql a 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
Entorn Linux
El procediment pot variar segons la distribució utilitzada. No obstant això, com a regla general, la configuració de l’entorn ha de complir les condicions següents.
Atès que PostgreSQL sol estar instal·lat al path del sistema, l’execució per línia d’ordres es pot fer fàcilment:
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 per alguna raó les variables d’entorn estan deshabilitades, cal habilitar-les:
Opció A: fitxer d’entorn (amb un servei de recàrrega de PostgreSQL)
POSTGIS_ENABLE_OUTDB_RASTERS=1
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
Opció B: a través de la consola (molt més fàcil)
SET postgis.enable_outdb_rasters TO True;
SET postgis.enabled_drivers TO enable_all;
Avís
Si es fa amb un usuari de PostgreSQL, aquest usuari ha de tenir permisos de lectura sobre el fitxer. Si es fa amb un altre usuari (p. ex., root), aquest usuari ha d’estar registrat a pg_hba.conf i al SGBD.
Notes sobre la sentència
[-R] -s 25831 -C -x raster.txt -t 1500x1500 -a utils.raster_dem -F -n rastercat_id | psql -d giswater -U postgres -p 5432
On:
[-R]
Pot ser opcional. El ràster s’emmagatzema fora de la base de dades. En cas contrari, s’emmagatzema dins. El problema és que no és fàcil treballar-hi. L’usuari del sistema i l’usuari de Postgres han de ser el mateix i tenir permisos de lectura/escriptura de fitxers. Aquesta opció és opcional, però pot ser essencial segons l’estratègia d’emmagatzematge triada.
Nota
Per usar aquesta opció, cal definir les variables d’entorn següents:
POSTGIS_ENABLE_OUTDB_RASTERS
POSTGIS_GDAL_ENABLED_DRIVERS=ENABLE_ALL
[-s 25831]
L’SRID és obligatori.
[-C]
Afegeix restriccions, necessàries només en carregar el primer ràster. Les restriccions que es creen són:
Alçada del ràster (nombre de files): enforce_height_rast
Amplada del ràster (nombre de columnes): enforce_width_rast
Valor no-data: enforce_nodata_values_rast
Nombre de bandes (per a DEM, 1): enforce_num_bands_rast
Tipus 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 (manteniment de la informació fora de la base de dades)
Extensió màxima: enforce_max_extent_rast
Avís
Tot i que és possible definir restriccions, no se’n recomana l’ús, ja que poden afectar el rendiment i la flexibilitat en carregar dades ràster.
[-x]
Exclou la restricció de dimensió espacial. És obligatori usar-la si l’objectiu és posar més d’un ràster a la mateixa taula (la qual cosa serà habitual).
Extensió màxima: enforce_max_extent_rast
[raster.txt]
Nom de fitxer. Sense espais, però amb metadades.
[-t 1500x1500]
Mida de cel·la a la base de dades.
Límits: 5000x5000. Superar aquesta mida provoca un error de memòria (Failed to allocate memory).
La mida recomanada no ha de superar 2000x2000 per fila.
Es crearà una taula nova a la base de dades (no es permeten actualitzacions) amb l’estructura definida. El procés divideix el ràster en parts segons la mida especificada; cada fila de la taula representa una part del ràster.
El punt clau és que la mida d’entrada (per exemple, 1500x1500) sigui un divisor de la mida del ràster. El divisor ideal és 1 a 1, però si el ràster supera 2000x2000, sempre s’ha de dividir usant divisors exactes.
Exemples:
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]
Afegeix el ràster a la taula, obligatori; altrament, en crearia una de nova, provocant un conflicte.
[-F]
Afegeix el nom del fitxer, obligatori i important per conèixer el nom del fitxer.
[-n rastercat_id]
Per al nom de la columna on s’inserirà el nom del fitxer. Obligatori.
[-d giswater -U postgres -p 5432]
Paràmetres de connexió: si es fa amb un usuari de PostgreSQL, és directe. Si es fa amb un altre usuari, demanarà la contrasenya, que també es pot proporcionar.
Consultes d’exemple per carregar ràsters directament des de la línia d’ordres a localhost:
Inserim a l’host 000.000.00:5432 amb l’usuari ‘admin’ i inserim directament en una taula existent ‘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
Inserim a l’host 000.000.00:5432 amb l’usuari ‘admin’ i inserim en una taula nova que s’anomenarà ‘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