Mi pregunta se refiere al uso y rendimiento de varias herramientas de software en conjunto, a saber, PostgreSQL, PostGIS, QGIS y GDAL.
Soy un usuario de ArcGIS, Python y R desde hace mucho tiempo y estoy interesado en diversificar en el ecosistema de SIG de código abierto y en Linux también. Recientemente he estado muy interesado en el uso de QGIS (ver 2.8) junto con PostgreSQL (ver 9.4) y PostGIS (ver 2.1), y he instalado el software en un equipo con Windows 8.1 x64 (las especificaciones del equipo en resumen: ThinkPad X200s con un Core 2 a 2,1GHz, 8GB de RAM y un SSD de 240GB). Una vez que aprenda a gestionar mis datos espaciales (~100GB), me gustaría ejecutar Ubuntu en esta máquina.
Por el momento, simplemente estoy tratando de almacenar y recuperar de forma fiable shapefiles y rasters. Hasta ahora he tenido éxito en la carga de shapefiles en PostGIS, pero los rasters están resultando más problemáticos. He completado con éxito las importaciones individuales y por lotes de pequeños archivos geoTIFF y GRID, pero los rásteres más grandes (digamos, un archivo IMG o TIFF de 15619x14655 celdas y 870MB de tamaño en disco) tardan una eternidad en cargarse en PostGIS. He leído y configurado la herramienta raster2pgsql para construir índices espaciales y cargar rásters por mosaicos utilizando estos parámetros:
raster2pgsql -s 3161 -C -I D:\PostGIS_data\dem.img -t auto raster.dem | psql -h localhost -U postgres -p 5432 -d postgres
El rendimiento de la importación sigue siendo muy pobre, y el hardware no es el problema. La visualización de los rásteres de PostGIS en QGIS es aún peor, cargando lentamente los rásteres pequeños en el mejor de los casos o congelándose por completo. Los rásteres grandes como el que he mencionado son imposibles de visualizar en QGIS. De la documentación y las discusiones en el foro, este defecto parece ser debido al controlador PostGIS de GDAL y no a QGIS en sí mismo. Las discusiones del foro mencionan este problema brevemente y algunos incluso sugieren que los rásteres no deberían ser almacenados en PostGIS (¿qué sentido tiene una base de datos espacial que no maneja los rásteres sin problemas?) Sin embargo, yo utilizo habitualmente la base de datos geográficos de archivos de ESRI para almacenar, visualizar y analizar rásteres bastante grandes (~70 GB) de forma rápida y sencilla, y ArcGIS 10.1 nunca se congela ni se ralentiza debido a estas operaciones rutinarias. Estos bloqueos de rendimiento son decepcionantes y no me dejan impresionado con los SIG de software libre.
¿Hay algo que se me escapa, un cuello de botella que no he abordado? ¿Necesita PostgreSQL ser ajustado para obtener los beneficios de rendimiento de PostGIS? ¿Me falta una versión de GDAL que tengo que buscar y compilar? ¿Cómo puedo mejorar el rendimiento de PostGIS y la visualización en QGIS de shapefiles y rasters especialmente? ¿Cómo puedo disfrutar de la gloria de una gestión de datos espaciales completa y rápida a través de un terminal Linux? ¡Cualquier ayuda sobre este tema será bienvenida!
He seguido esta guía de un tal Duncan Golicher: https://duncanjg.wordpress.com/2012/11/20/the-basics-of-postgis-raster/
Yo estaba usando azulejos con una configuración automática originalmente, pero he restablecido el mosaico a 100x100 celdas por fila y luego incluyó las pirámides como se muestra en la guía así:
raster2pgsql -s 3161 -d -C -I -M -l 4 D:\PostGIS_data\dem.img -t 100x100 raster.dem100 | psql -h localhost -U postgres -p 5432 -d postgres
He podido importar con éxito la trama IMG de 870MB en un buen tiempo y mostrarla en QGIS sin que se ralentice o se cuelgue la aplicación. El tiempo de renderizado no es tan rápido como esperaba, pero es aceptable. Voy a leer más sobre el parámetro -l para utilizarlo correctamente.
Por cierto, al importar el archivo dem.img como tabla dem100 se creó otra tabla rasterizada llamada "o_4_dem100". Cuando la importo como capa en QGIS, tiene un rango de valores entre 201 y 524, mientras que la capa dem100 tiene un rango de 36 a 524. ¿Estoy en lo cierto al suponer que esta tabla adicional es la tabla de la pirámide que tiene un rango de valores más estrecho como resultado de haber sido agregada a una resolución más baja?
No creo que un hardware inadecuado sea el problema. He aquí un breve resumen de lo que he encontrado hasta ahora.
El controlador PostGIS de GDAL ha tenido en el pasado problemas de rendimiento ( ver también aquí ). Aunque estos problemas se observaron en 2012, me pregunto si GDAL 1.11.2 que se encuentra en QGIS 2.8 todavía tiene este problema. Seguramente hay otros que utilizan QGIS y PostGIS para la visualización y el almacenamiento de raster.
En una posible nota relacionada, también he tenido problemas de rendimiento al abrir tablas de atributos de PostGIS en QGIS con tablas de ~4,7 millones de registros . Después de unas cuantas sugerencias en ese hilo y sin arreglar el problema, finalmente presenté un informe de errores con QGIS que finalmente se cerró y se vinculó a la siguiente informe de error similar . Aunque el informe de errores está cerrado, no parece que se haya solucionado...
Para resumir mis esfuerzos hasta ahora:
-
He optimizado el servidor PostgreSQL para los datos espaciales.
-
He construido índices espaciales para las tablas de geometría y he realizado un VACUUM.
-
El comportamiento de QGIS al abrir tablas de atributos grandes (~4.7m registros) parece intentar leer todo registros en lugar de devolver un subconjunto para su visualización instantánea. Esto provoca un bajo rendimiento.
-
El rendimiento en la representación de grandes tablas geométricas de PostGIS no no parece ser un problema.
-
Con raster2pgsql, los rásteres se han indexado, se han embaldosado y se han importado como tablas ráster con pirámides en PostGIS.
-
Los rastreos de cualquier tamaño razonable siguen siendo increíblemente lentos para importar en PostGIS, por no hablar de abrir y desplazarse en QGIS.
También cabe destacar que cuando se importan grandes rásters o se abren grandes tablas de atributos con PostGIS, el consumo de memoria para raster2pgsql y qgis-bin es superior a 1GB. Como han mencionado @Michael y @Paul en respuesta a mi pregunta inicial, parece que PostGIS no pretende aportar muchas ventajas, si es que las aporta, al almacenamiento de rásters. Sin embargo, en ese punto me pregunto por qué iba a ejecutar QGIS + PostGIS en absoluto para mis necesidades de SIG, especialmente cuando ESRI fileGDBs permitir atributos raster, conjuntos de datos de mosaico, y otras operaciones raster facilitado por la geodatabase. Así que tal vez o estoy realmente falta algo o QGIS y PostGIS no satisfacen mis necesidades de SIG. Esto último me resulta difícil de creer.