Scarse prestazioni con la memorizzazione di raster di grandi dimensioni in PostGIS e la visualizzazione in QGIS


23

la mia domanda riguarda l'uso e le prestazioni di numerosi strumenti software insieme, vale a dire PostgreSQL, PostGIS, QGIS e GDAL.

Sono un utente ArcGIS, Python e R di vecchia data interessato a diversificarsi nell'ecosistema GIS open source gratuito e anche in Linux. Recentemente sono stato molto interessato all'utilizzo di QGIS (versione 2.8) insieme a PostgreSQL (versione 9.4) e PostGIS (versione 2.1) e ho installato il software su un computer con Windows 8.1 x64 (le specifiche del computer in breve: ThinkPad X200s con un Core 2 da 2,1 GHz, 8 GB di RAM e un SSD da 240 GB). Una volta che ho imparato a gestire i miei dati spaziali (~ 100 GB), vorrei eseguire Ubuntu su questa macchina.

Al momento, sto semplicemente cercando di archiviare e recuperare in modo affidabile shapefile e raster. Finora ho avuto successo nel caricare file di forma in PostGIS, ma i raster si stanno dimostrando più problematici. Ho completato con successo le importazioni singole e batch di piccoli file geoTIFF e GRID, ma i raster più grandi (diciamo, un file IMG o TIFF da 15619x14655 celle di dimensioni 870 MB su disco) impiegano un'eternità a caricarsi in PostGIS. Ho letto e configurato lo strumento raster2pgsql per creare indici spaziali e caricare raster per tessere usando questi parametri:

raster2pgsql -s 3161 -C -I D:\PostGIS_data\dem.img -t auto raster.dem | psql -h localhost -U postgres -p 5432 -d postgres

Le prestazioni nell'importazione sono ancora molto scarse e l'hardware non è il problema. La visualizzazione dei raster PostGIS in QGIS è ancora peggio, caricando lentamente al meglio piccoli raster o congelando del tutto. Raster di grandi dimensioni come quello che ho citato sono impossibili da visualizzare in QGIS. Dalla documentazione e dalle discussioni del forum, questa mancanza sembra essere dovuta al driver raster PostGIS di GDAL e non allo stesso QGIS. Le discussioni del forum menzionano brevemente questo problema e alcuni suggeriscono addirittura che i raster non debbano essere archiviati in PostGIS (qual è il punto in un database spaziale che non gestisce i raster senza problemi?). Eppure uso regolarmente il geodatabase di file ESRI per archiviare, visualizzare e analizzare raster abbastanza grandi (~ 70 GB) in modo rapido e semplice e ArcGIS 10.1 non si blocca o rallenta mai a causa di tali operazioni di routine.

C'è qualcosa che mi manca qui, un collo di bottiglia che non ho affrontato? PostgreSQL deve essere ottimizzato per realizzare i vantaggi prestazionali di PostGIS? Mi sto perdendo una versione di GDAL che devo cercare e compilare? Come posso migliorare in particolare le prestazioni e la visualizzazione di PostGIS in QGIS di shapefile e raster? Come posso godere della gloria di una gestione dei dati spaziali completa e rapida tramite un terminale Linux? Qualsiasi aiuto su questo problema sarebbe il benvenuto!


Ho seguito questa guida di Duncan Golicher: https://duncanjg.wordpress.com/2012/11/20/the-basics-of-postgis-raster/

In origine stavo usando le tessere con un'impostazione automatica, ma ho ripristinato la piastrellatura su 100x100 celle per riga e quindi ho incluso le piramidi come mostrato nella guida in questo modo:

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

Sono stato in grado di importare correttamente il raster IMG da 870 MB in tempo utile e di visualizzarlo in QGIS senza rallentare o arrestare in modo anomalo l'applicazione. Il tempo di rendering non è veloce come mi aspetterei, ma è accettabile. Leggerò ulteriormente sul parametro -l per usarlo correttamente.

Per inciso, nell'importazione del file dem.img come tabella dem100 è stata creata un'altra tabella raster chiamata "o_4_dem100". Quando lo importa come layer in QGIS, ha un intervallo di valori compreso tra 201 e 524, mentre il layer dem100 ha un intervallo compreso tra 36 e 524. Ho ragione nel ritenere che questa tabella aggiuntiva sia la tabella piramidale che ha un campo più stretto intervallo di valori come risultato dell'aggregazione a una risoluzione inferiore?


Non penso che il problema sia l'hardware inadeguato. Ecco un breve riassunto di ciò che ho trovato finora.

Il driver raster PostGIS di GDAL ha avuto problemi di prestazioni precedenti ( vedi anche qui ). Sebbene questi problemi siano stati rilevati nel 2012, mi chiedo se GDAL 1.11.2 trovato in QGIS 2.8 abbia ancora questo problema. Sicuramente ce ne sono altri che utilizzano QGIS e PostGIS per la visualizzazione e l'archiviazione raster?

Su una possibile nota correlata, ho anche avuto problemi di prestazioni con l'apertura delle tabelle degli attributi PostGIS in QGIS con tabelle di ~ 4.7m record . Dopo alcuni suggerimenti in quella discussione e senza risolvere il problema, alla fine ho presentato una segnalazione di bug a QGIS che alla fine è stata chiusa e collegata alla seguente segnalazione di bug simile . Sebbene la segnalazione di bug sia chiusa, non sembra essere stata risolta ...

Per riassumere i miei sforzi finora:

  • Ho ottimizzato il server PostgreSQL per i dati spaziali.
  • Ho costruito indici spaziali per tabelle di geometria ed eseguito un VUOTO.
  • Il comportamento di QGIS per l'apertura di tabelle di attributi di grandi dimensioni (~ 4,7 m di record) sembra provare a leggere tutti i record anziché restituire un sottoinsieme per la visualizzazione istantanea. Questo porta a scarse prestazioni.
  • Le prestazioni nel rendering di grandi tabelle geometriche PostGIS non sembrano essere un problema.

  • Con raster2pgsql, i raster sono stati indicizzati, piastrellati e importati come tabelle raster con piramidi in PostGIS.

  • I raster di qualsiasi dimensione ragionevole sono ancora incredibilmente lenti da importare in PostGIS, per non parlare dell'apertura e della panoramica in QGIS.

Vale anche la pena notare che quando si importano raster di grandi dimensioni o si aprono tabelle di attributi di grandi dimensioni con PostGIS, il consumo di memoria per raster2pgsql e qgis-bin supera 1 GB. Come hanno menzionato @Michael e @Paul in risposta alla mia domanda iniziale, sembra che PostGIS non sia destinato a portare molti benefici se conservi i raster. Tuttavia, a quel punto mi chiedo perché dovrei eseguire QGIS + PostGIS per le mie esigenze GIS, specialmente quando i file GDB ESRI abilitano attributi raster, set di dati a mosaico e altre operazioni raster facilitate dal geodatabase. Quindi forse o mi manca davvero qualcosa o QGIS e PostGIS non soddisfano le mie esigenze GIS. Trovo difficile credere a quest'ultimo.


I raster devono essere in PostGIS? Quali vantaggi / funzionalità extra speri di ottenere da questo? Ho scoperto che il vettore PostGis era accettabile e offriva l'editing multiutente ma PostGis raster non aveva reali vantaggi rispetto al raster basato su file (server memorizzato). Buona domanda però; è del tutto possibile che ci siano alcuni benefici che ho perso nella mia valutazione ...
Michael Stimson,

Ho pensato che i raster PostGIS consentissero calcoli raster più veloci e prestazioni migliori con operazioni raster / vettoriali. Ciò si aggiunge ai vantaggi di un DB spaziale: affidabilità, accessibilità, funzionalità di backup, archiviazione più compatta, ecc. In ogni caso, un approccio file / tile non consente funzioni di ricerca, piramidi pre-costruite, piastrellatura e altre funzionalità che migliorano l'utilizzo e la visualizzazione del raster.
mbcaradima,

Non ho visto alcuna metrica che dice che i raster PostGIS sono più veloci nei calcoli raster .. in entrambi i casi con un SSD da 240 GB (buona scelta BTW, più veloce del RAID a una frazione del costo / sforzo) lo riempirai molto rapidamente con i raster ... ECW / JP2 per 8 bit o GeoTIFF con compressione LZW / Deflate spuntano la maggior parte di quelle caselle, piramidi pre-costruite, piastrellatura (tramite VRT), backup come file, ecc ... l'unico vantaggio è la funzione di ricerca. Mi rendo conto che sto diventando leggermente fuori tema, ma se PostGIS raster non sta facendo ciò che ti aspetti, perché non rimanere con il file raster per la visualizzazione?
Michael Stimson,

3
Chi ha mai detto che i raster PostGIS fossero più veloci di ogni altra cosa? Possono essere più convenienti (utile API di accesso SQL) e possono essere utili per l'analisi (raster e vettoriale nello stesso bucket) ma più velocemente ? Mai.
Paul Ramsey,

1
Sto lavorando a un libro su PostGIS (PostGIS in Action, 2a edizione) e mi è sembrato naturale supporre che i vantaggi della memorizzazione di shapefile in un DB spaziale si estendessero anche a un raster. Naturalmente, dati i loro diversi modelli di dati, vedo che questa ipotesi era puramente intuitiva. Tuttavia, i raster sono comunemente archiviati in geodatabase con ArcGIS e consentono la costruzione di piramidi, una più rapida geolocalizzazione e la costruzione di mosaici. In un flusso di lavoro con software open source, come può un utente GIS lavorare con i raster? A proposito, mi prenderò a pugni in faccia.
mbcaradima,

Risposte:


9

Se vuoi mostrare raster di grandi dimensioni in QGIS, devi costruire piramidi, sia per un'immagine tif sul file system o per un'immagine registrata in Postgis.

La differenza di prestazioni nel rendering QGIS tra un grande raster nel file system o in Postgis è minima. Gli utenti non noteranno la differenza. Ma - se e solo se - costruisci le piramidi con l'opzione -l.

Se si importa semplicemente l'immagine senza l'opzione -l, o semplicemente -l 4 non funzionerà .

Se usi, ad esempio, -l 2,4,8,16verranno creati quattro livelli di piramidi, come nel livello seguente:

Piramidi generate con -l 2,4,8,16

Se vuoi avere un'esperienza utente migliore, dovresti aggiungere più livelli di piramidi, come -l 2,4,8,16,32,64,128,256. Ciò creerà otto livelli di piramidi.

inserisci qui la descrizione dell'immagine

Per riassumere, la risposta a questa domanda è: importa il raster con l'opzione -le usa lo stesso numero di livelli piramidali che usi per lo stesso raster sul file system.

Per esempio:

raster2pgsql -s 3161 -d -C -I -M -l 2,4,8,16,32,64,128,256 D:\PostGIS_data\dem.img -t 100x100 raster.dem100 | psql -h localhost -U postgres -p 5432 -d postgres

5

Sto riscontrando gli stessi identici problemi con il rendering dei raster in QGIS da PostGIS (vedi la mia domanda recente ) Ho trovato utile questo post e aumentando leggermente il seguente rendering raster migliorato:

shared_buffers = 5000MB work_mem = 100MB maintenance_work_mem = 100MB

Tuttavia, detto ciò, concordo pienamente sul fatto che le prestazioni dei raster PostGIS in QGIS non sono eccezionali. Ho a che fare con 608 geotiff compressi che caricano alla grande come un VRT ma sono essenzialmente inutilizzabili in PostGIS. Prova ad aumentare le prestazioni del server dbase, ma oltre a ciò non posso essere troppo utile. Anch'io potrei fare affidamento sul file system per servire i raster all'interno della mia organizzazione.


Grazie per il tuo commento, Cliff. Ho applicato alcune delle tue modifiche e segnalerò eventuali miglioramenti delle prestazioni. Nel complesso, devo dire che le prestazioni di QGIS sono deludenti per la visualizzazione dei raster PostGIS e il caricamento / interrogazione delle tabelle degli attributi. Anche le prestazioni raster in PostGIS sono deludenti. Non ho nessuno di questi problemi con i file geodatabase, quindi mi chiedo cosa c'è che non va?
mbcaradima,

1
I miei sentimenti esattamente. Ho trascorso la settimana cercando di farlo funzionare e semplicemente non sono riuscito a farlo funzionare. Ora sto testando la mia VM (Ubuntu Server) con 10 processori e 10 GB di RAM. Se è ancora lento, devo fare qualcos'altro di sbagliato. Sono anche perplesso sul perché i layer WMS in QGIS siano sostanzialmente inutilizzabili a causa della loro bassa velocità di rendering. Dovremmo collegarci di più su questo dato che siamo entrambi nella stessa barca.
Cliff,

Se si caricano alla grande come un VRT, perché non ti sei fermato qui? Che guadagno ti aspetti da questo fantastico viaggio raster?
Paul Ramsey,

Immagino che la mia risposta a questa domanda, Paul, sia esattamente ciò che OP ha detto nel prossimo post: "Tuttavia, a quel punto mi chiedo perché dovrei eseguire QGIS + PostGIS per le mie esigenze GIS, specialmente quando i file ESRI file GDB abilitano attributi raster, set di dati mosaico e altre operazioni raster facilitate dal geodatabase. Quindi forse mi manca davvero qualcosa o QGIS e PostGIS non soddisfano le mie esigenze GIS. Trovo difficile credere a quest'ultimo. "
Cliff,

1
Inoltre, direi che circa il 70% dell'analisi che faccio è su raster e che circa il 40% dei dati che desidero fornire alla mia organizzazione tramite QGIS sono dati raster. Ha senso avere tutti i dati raster e vettoriali in un unico database in modo che gli utenti possano impostare una connessione e avere accesso al database dell'intera organizzazione. Invece, dovrei creare i crediti per il dbase e i crediti per la condivisione dei file. In alternativa, sto seriamente pensando di demolire QGIS e di creare un'applicazione web con Geoserver (ps: sempre disposto a collaborare con chiunque sia interessato).
Cliff,

4

Non sono sicuro che fosse il tuo caso, ma ho scoperto che -Inon dovrebbe essere usato insieme ai dati aggiunti -a.

Stavo importando molti file TIF in un DB, e in -Irealtà crea nuovamente l'indice ed esegue analysesul tavolo per ogni file, il che richiede 10 volte più tempo.

-Idovrebbe essere usato solo durante la creazione della tabella, con -popzione.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.