Mehr

Schlechte Leistung beim Speichern großer Raster in PostGIS und Visualisieren in QGIS


Meine Frage betrifft die Verwendung und Leistung mehrerer Softwaretools in Verbindung, nämlich PostgreSQL, PostGIS, QGIS und GDAL.

Ich bin ein langjähriger ArcGIS-, Python- und R-Benutzer, der daran interessiert ist, in das kostenlose Open-Source-GIS-Ökosystem und auch Linux zu diversifizieren. Vor kurzem war ich sehr daran interessiert, QGIS (Version 2.8) zusammen mit PostgreSQL (Version 9.4) und PostGIS (Version 2.1) zu verwenden, und ich habe die Software auf einem Computer mit Windows 8.1 x64 installiert (die Computerspezifikationen in Kürze: ThinkPad X200s mit 2,1 GHz Core 2, 8 GB RAM und einer 240 GB SSD). Sobald ich gelernt habe, wie ich meine räumlichen Daten (im Wert von ~ 100 GB) verwalte, möchte ich Ubuntu auf diesem Computer ausführen.

Im Moment versuche ich einfach, Shapefiles und Raster zuverlässig zu speichern und abzurufen. Bisher war ich erfolgreich beim Laden von Shapefiles in PostGIS, aber Raster erweisen sich als problematischer. Ich habe Einzel- und Stapelimporte von kleinen geoTIFF- und GRID-Dateien erfolgreich abgeschlossen, aber größere Raster (z. Ich habe das raster2pgsql-Tool gelesen und konfiguriert, um mit diesen Parametern räumliche Indizes zu erstellen und Raster nach Kacheln zu laden:

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

Die Leistung beim Importieren ist immer noch sehr schlecht und die Hardware ist nicht das Problem. Die Visualisierung von PostGIS-Rastern in QGIS ist noch schlimmer, da kleine Raster bestenfalls langsam geladen oder ganz eingefroren werden. Große Raster wie das erwähnte können in QGIS nicht visualisiert werden. Aus der Dokumentation und den Forendiskussionen geht hervor, dass dieser Mangel auf den PostGIS-Rastertreiber von GDAL und nicht auf QGIS selbst zurückzuführen ist. Forumsdiskussionen erwähnen dieses Problem kurz und einige schlagen sogar vor, dass Raster nicht in PostGIS gespeichert werden sollten (was ist der Sinn in einer räumlichen Datenbank, die Raster nicht reibungslos verarbeitet?). Dennoch verwende ich routinemäßig die File-Geodatabase von ESRI, um recht große (~70 GB) Raster schnell und einfach zu speichern, zu visualisieren und zu analysieren, und ArcGIS 10.1 friert oder verlangsamt sich aufgrund solcher Routinevorgänge nie. Diese Leistungshindernisse sind enttäuschend und lassen mich von FOSS GIS unbeeindruckt.

Fehlt mir hier etwas, ein Engpass, den ich nicht angesprochen habe? Benötigt PostgreSQL ein Tuning, um die Leistungsvorteile von PostGIS zu nutzen? Vermisse ich eine Version von GDAL, die ich suchen und kompilieren muss? Wie verbessere ich die PostGIS-Leistung und -Visualisierung in QGIS von Shapefiles und Rastern, insbesondere? Wie kann ich den Ruhm eines umfassenden und schnellen Geodatenmanagements über ein Linux-Terminal genießen? Jede Hilfe zu diesem Thema wäre willkommen!


Ich bin dieser Anleitung von einem Duncan Golicher gefolgt: https://duncanjg.wordpress.com/2012/11/20/the-basics-of-postgis-raster/

Ich habe ursprünglich Kacheln mit einer automatischen Einstellung verwendet, aber ich habe die Kachelung auf 100 x 100 Zellen pro Zeile zurückgesetzt und dann die Pyramiden wie in der Anleitung gezeigt eingefügt:

raster2pgsql -s 3161 -d -C -I -M -l 4 D:PostGIS_datadem.img -t 100x100 raster.dem100 | psql -h localhost -U postgres -p 5432 -d postgres

Ich konnte das 870 MB IMG-Raster erfolgreich importieren und in QGIS anzeigen, ohne die Anwendung zu verlangsamen oder abzustürzen. Die Renderzeit ist nicht so schnell, wie ich es erwarten würde, aber sie ist akzeptabel. Ich werde weiter über den Parameter -l lesen, um ihn richtig zu verwenden.

Übrigens wurde beim Importieren der Datei dem.img als Tabelle dem100 eine weitere Rastertabelle namens "o_4_dem100" erstellt. Wenn ich es als Layer in QGIS importiere, hat es einen Wertebereich zwischen 201 bis 524, während der dem100-Layer einen Bereich von 36 bis 524 hat. Gehe ich richtig in der Annahme, dass diese zusätzliche Tabelle die Pyramidentabelle ist, die eine schmalere hat? Wertebereich durch Aggregation auf eine niedrigere Auflösung?


Ich glaube nicht, dass eine unzureichende Hardware das Problem ist. Hier eine kurze Zusammenfassung dessen, was ich bisher gefunden habe.

Der PostGIS-Rastertreiber von GDAL hatte in der Vergangenheit Leistungsprobleme (siehe auch hier). Obwohl diese Probleme 2012 festgestellt wurden, frage ich mich, ob GDAL 1.11.2 in QGIS 2.8 immer noch dieses Problem hat. Sicherlich gibt es andere, die QGIS und PostGIS für die Rastervisualisierung und -speicherung verwenden?

In einem möglichen Zusammenhang hatte ich auch Leistungsprobleme beim Öffnen von PostGIS-Attributtabellen in QGIS mit Tabellen mit ~4,7 Millionen Datensätzen. Nach einigen Vorschlägen in diesem Thread und ohne das Problem zu beheben, habe ich schließlich einen Fehlerbericht bei QGIS eingereicht, der schließlich geschlossen und mit dem folgenden ähnlichen Fehlerbericht verlinkt wurde. Obwohl der Fehlerbericht geschlossen ist, scheint er nicht behoben zu sein…

Um meine bisherigen Bemühungen zusammenzufassen:

  • Ich habe den PostgreSQL-Server für Geodaten optimiert.
  • Ich habe räumliche Indizes für Geometrietabellen erstellt und ein VACUUM durchgeführt.
  • QGIS-Verhalten beim Öffnen großer Attributtabellen (~4,7 Mio. Datensätze) scheint zu versuchen, zu lesen alle Datensätze, anstatt eine Teilmenge zur sofortigen Anzeige zurückzugeben. Dies führt zu einer schlechten Leistung.
  • Die Leistung beim Rendern großer PostGIS-Geometrietabellen ist nicht scheint ein Problem zu sein.

  • Mit raster2pgsql wurden Raster indiziert, gekachelt und als Rastertabellen mit Pyramiden in PostGIS importiert.

  • Raster jeder vernünftigen Größe sind immer noch unglaublich langsam in PostGIS zu importieren, geschweige denn in QGIS zu öffnen und zu schwenken.

Es ist auch erwähnenswert, dass beim Importieren großer Raster oder beim Öffnen großer Attributtabellen mit PostGIS der Speicherverbrauch für raster2pgsql und qgis-bin über 1 GB beträgt. Wie @Michael und @Paul als Antwort auf meine anfängliche Frage erwähnt haben, scheint PostGIS nicht viel oder gar keine Vorteile beim Speichern von Rastern zu bringen. An diesem Punkt frage ich mich jedoch, warum ich QGIS+PostGIS für meine GIS-Anforderungen überhaupt ausführen sollte, insbesondere wenn ESRI fileGDBs Raster-Attribute, Mosaik-Datasets und andere Raster-Operationen ermöglichen, die von der Geodatabase unterstützt werden. Also vielleicht bin ich es auch Ja wirklich etwas fehlt oder QGIS und PostGIS meine GIS-Anforderungen nicht erfüllen. Letzteres finde ich kaum zu glauben.


Wenn Sie große Raster in QGIS anzeigen möchten, müssen Sie Pyramiden bauen, entweder für ein tif-Bild im Dateisystem oder für ein in Postgis registriertes Bild.

Der Leistungsunterschied beim QGIS-Rendering zwischen einem großen Raster im Dateisystem oder in Postgis ist minimal. Benutzer werden den Unterschied nicht bemerken. Aber - wenn und nur wenn - du die Pyramiden mit der Option baust-l.

Wenn Sie das Bild einfach ohne die Option -l importieren, oder mit nur-l 4es wird nicht funktionieren.

Wenn Sie zum Beispiel verwenden,-l 2,4,8,16, werden vier Pyramidenebenen erstellt, wie in der folgenden Ebene:

Wenn Sie eine bessere Benutzererfahrung haben möchten, sollten Sie weitere Pyramidenebenen hinzufügen, z-l 2,4,8,16,32,64,128,256. Dadurch werden acht Pyramidenebenen erstellt.

Zusammenfassend lautet die Antwort auf diese Frage: Importieren Sie das Raster mit der Option-lund verwenden Sie dieselbe Anzahl von Pyramidenebenen wie für dasselbe Raster im Dateisystem.

Beispielsweise:

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

Ich habe genau die gleichen Probleme mit dem Rendern von Rastern in QGIS von PostGIS (siehe meine letzte Frage). Ich fand diesen Beitrag hilfreich und erhöhte das folgende verbesserte Raster-Rendering leicht:

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

Trotzdem stimme ich voll und ganz zu, dass die Leistung von PostGIS-Rastern in QGIS nicht großartig ist. Ich habe es mit 608 komprimierten Geotiffs zu tun, die als VRT großartig geladen werden, aber in PostGIS im Wesentlichen unbrauchbar sind. Versuchen Sie, die Leistung des Datenbankservers zu erhöhen, aber darüber hinaus kann ich nicht allzu hilfreich sein. Auch ich muss mich möglicherweise auf das Dateisystem verlassen, um Raster in meiner Organisation bereitzustellen.


Ich bin mir nicht sicher, ob es bei Ihnen der Fall war, aber ich habe es herausgefunden-ICHsollte nicht zusammen mit angehängten Daten verwendet werden-ein.

Ich habe viele TIF-Dateien in eine DB importiert, und-ICHerstellt den Index tatsächlich erneut und führtanalysierenauf dem Tisch für jede Datei, was 10x länger dauert.

-ICHsollte nur beim Erstellen der Tabelle verwendet werden, mit-pMöglichkeit.