Desde la versión 2.0 de PostGIS, es posible cargar y manipular datos de naturaleza ráster en una base de datos espacial, gracias a PostGIS Raster.
En PostGIS 3 se sigue manteniendo estas capacidad ráster pero en esta ocasión las funcionalidades se encuentran en una extensión independiente denominada postgis_raster que debemos añadir a nuestra base de datos si queremos usarlas.
El almacenamiento de datos ráster en una base de datos relacional como PostgreSQL resulta de utilidad ya que aprovecha todas las características de un sistema de gestión de base de datos, (restricciones de acceso, soporte de consultas SQL, arquitectura cliente-servidor para acceso simultáneo, datos centralizados, mejoras en la actualización…).
Vamos a realizar un par de ejercicios sencillos donde realizar operaciones de análisis combinado datos ráster y vectoriales.
Añadiendo las extensiones postgis y postgis_raster.
Lo primero que debemos hacer es dotar de funcionalidad geográfica a nuestra base de datos añadiendo la extensión postgis si no a tenemos instalada, para pasar depués a repetir el paso pero con la extensión postgis_raster.
Usando la consola de comandos para conectarnos a nuestra base de datos con psql debemos añadir las extensiones de la siguiente manera:
psql -U postgres rasterdb rasterdb>CREATE EXTENSION postgis; rasterdb>CREATE EXTENSION postgis_raster;
Cargando datos con raster2postgis
Para añadir un archivo ráster a nuestra base de datos podemos usar el comando raster2plsql.
Hemos descargado el Modelo Digital del Terreno – MDT200 de la provincia de Córdoba (España) desde la web de descargas del Centro Nacional de Información Geográfica (CNIG).
Completamos la creación del sql con raster2pslql añadiendo parámetros de interés (sistema de referencia, índice, restricciones…).
raster2pgsql -s 25830 -I -C PNOA_MDT200_ETRS89_HU30_Cordoba.asc cordobadem200 > dem-cordoba.sql
Seguimos ahora cargando el sql en nuestra base de datos.
raster2pgsql -s 25830 -I -C dem-cordoba.tif cordobadem200 > dem-cordoba.sql
Para terminar, ejecutamos el archivo SQL creado, añadiendo con ello la nueva tabla raster con el modelo digital de elevación.
psql -U postgres -f dem-cordoba.sql rasterdb
Si usamos QGIS, definimos la conexión a nuestra base de datos y cargamos la nueva tabla ráster.
Asignando valores Z a una capa puntual.
Supongamos que tenemos un conjunto de localizaciones puntuales (ej. antenas, torres eléctricas…) situadas en nuestro ámbito de trabajo a la que queremos añadir un atributo con el valor de la altura.
Podemos usar las funciones de PostGIS junto a los comandos SQL para añadir el valor deseado de la siguiente manera.
ALTER TABLE puntos ADD COLUMN z integer; UPDATE puntos SET z= st_value (rast, 1, st_transform (geom, 25830)) FROM cordobadem WHERE cordobadem.rast && st_transform (puntos.geom, 25830);
Realizamos una consulta a la nueva tabla, esta vez con el cliente gráfico pgAdmin4, y vemos el resultado.
Estadística Zonal
El objetivo de este otro ejemplo es obtener los datos estadísticos (total de celdas, media, máxima, mínima y desviación estándar) relativos a Z de cada uno de los municipios de la provincia de Córdoba.
En esta ocasión hemos creado una nueva tabla vectorial con los resultados.
CREATE TABLE estadistica_municipios as SELECT stats.id, stats.nombre, stats.geom, (ST_SummaryStatsAgg(stats.intersectx,1,true)).* FROM (SELECT id, nombre, geom, ST_Intersection(rast,1,ST_AsRaster(geom, rast),1) as intersectx FROM cordobadem, municipios_cordoba WHERE ST_Intersects(geom, rast)) as stats WHERE stats.intersectx IS NOT NULL;
Si cargamos los datos en QGIS y creamos un mapa categorizado podemos ver el resultado.
El manejo de estas y otras funciones con datos ráster en PostGIS es uno de los tema de nuestro Curso de Bases de Datos Espaciales y Evaluación de la Calidad de los Datos
Referencias:
- M. Montesinos, I. Brodin, V.Agazzi, J. Arévalo (2011): Accediendo a la Base de Datos PostGIS Raster desde gvSIG Desktop. V Jornadas de SIG Libre PDF
¿Quieres comentarnos algo? Adelante!