Anzeigen riesiger Geotiffs (oder vrts) mit QGIS?


10

Ich manipuliere und verarbeite globale Raster mit einer Auflösung von 30 m. Die Gesamtgröße der Raster beträgt normalerweise [1.440.000 560.000]. Ich habe Zugriff auf einen Supercomputer, daher habe ich Code geschrieben, mit dem ich globale Raster in überschaubare Teile aufteilen, einige Berechnungen parallel durchführen und sie recht schnell auf die Festplatte schreiben kann.

Ich bin jedoch an eine Wand gestoßen, wenn es darum geht, Ergebnisse anzuzeigen. Normalerweise baue ich ein virtuelles Raster von Kacheln, die den Globus bedecken, und ziehe es in QGIS. Aber es ist unglaublich langsam (Minuten zum Laden, wenn ja). Und wenn ich versuche zu schwenken oder zu zoomen, sind es noch viele Minuten. Mein erster Ansatz zur Lösung dieses Problems bestand darin, mit gdaladdo Übersichten zu erstellen. Es dauert jedoch ewig, bis diese erstellt sind (wie in Tagen), was der Entwicklung von Algorithmen nicht förderlich ist. Hier ist eine Liste der Dinge, die ich versucht habe und warum / wie sie fehlgeschlagen sind.

  1. Erstellen Sie Übersichten auf dem vrt. Wie oben erwähnt, dauert dies für 8 Level 2+ Tage. Das ist für meine Zwecke nicht akzeptabel.

  2. Erstellen Sie Übersichten auf den einzelnen Kacheln und verschmelzen Sie dann irgendwie zu einem vrt, das die Übersichten enthält. Ich kann ziemlich schnell Übersichten auf den Kacheln erstellen (Supercomputer), aber ich konnte sie nicht neu zusammenführen. Ich habe es versucht:

    2a. gdal_merge auf den Kacheln mit Übersichten, aber die Übersichten wurden im Ausgabetiff nicht beibehalten (oder zumindest von QGIS nicht erkannt).

    2b. gdalbuildvrt auf den Kacheln mit Übersichten, aber wie oben wurden die Übersichten nicht beibehalten. [Dies ist nicht korrekt, siehe Bearbeiten.]

    2c. Ich habe auch eine Mischung aus Gebäudeübersichten für die Kacheln für die Ebenen 1-6 und Gebäudeebenen 7-8 direkt auf dem vrt ausprobiert (im Grunde Option 2b), aber nur für diese beiden Ebenen dauert es immer noch ewig. Ich habe einige Tests und sehen , dass die Fliesenübersichten sind tatsächlich vrt Übersichten zu bauen verwendet, aber es ist immer noch in der Größenordnung eines Tages die Übersichten auf der vrt abzuschließen.

Ich hoffe also, dass jemand hier einige Vorschläge hat, wohin ich als nächstes gehen soll. Hier sind einige Optionen, die ich in Betracht ziehe:

  1. Erstellen Sie die globalen Pyramiden manuell. Ich bin vorsichtig, sie in eine .ovr-Datei zu rekombinieren, da ich davon ausgehe, dass dies schwierig sein wird.

  2. Verwenden Sie einen Kartenserver (Geoserver). Ich weiß sehr wenig darüber und bin besorgt, dass es die Zeithürden nicht überwinden wird, während mein Prozess komplexer wird.

  3. Teilen Sie die Domain nach Kontinenten oder einer anderen Region auf. Ich möchte diese Option wirklich vermeiden.

Sie könnten fragen: "Warum müssen Sie den gesamten Globus mit einer Auflösung von 30 m anzeigen?" Ein Beispiel: Ich nehme eine Maske aus Wasserpixeln (global) und skelettiere sie, um Flüsse zu finden und Messungen durchzuführen. Mein Skelettierungsalgorithmus erfordert ein wenig Abstimmung (zum Beschneiden von Zweigen, Entfernen von Schleifen, allgemeine Reinigung usw.), und die Ausgabe liegt notwendigerweise bei 30 m. Da Flüsse und Landschaften auf der ganzen Welt unterschiedlich sind, muss ich in der Lage sein, mich zu bewegen, um die Auswirkungen von Änderungen zu sehen, die ich implementiert habe.

Ich habe auch QGIS durchgesehen, um sicherzustellen, dass es keine Einstellungen gibt, mit denen ich spielen kann, um große Raster schneller zu rendern, aber ich habe nichts gesehen. Ohne SSD-Laufwerke zu kaufen, geht es meiner Meinung nach so schnell wie möglich. (Meine Festplatten haben eine E / A von ~ 250 MB / s).


Ich habe festgestellt, dass beim Erstellen von Übersichten auf einzelnen Kacheln und beim Erstellen eines VRT anscheinend die Übersichten beibehalten werden. Der Abschnitt "Pyramide" von QGIS in den Metadaten für die Datei ist leer, aber im Abschnitt "Dimensionen" gibt es einen Eintrag für jede Übersichtsebene (zB X 720000, Y 140; X 360000, Y 70 usw.). Also habe ich mich bei 2b geirrt.

Ich finde auch, dass wenn ich nur alle Kacheln in QGIS ziehe, es in weniger als einer Minute gerendert wird, während es> 5 Minuten dauert, wenn ich das vrt ziehe, das auf die Kacheln verweist (ich weiß nicht, wie lange genau ich das getötet habe Prozess).


Ich habe einige Tests auf einem Computer mit einer SSD durchgeführt und festgestellt, dass ich die globalen vrts (ohne Übersichten) erfolgreich und mit einer akzeptablen Geschwindigkeit laden, anzeigen und rendern kann. Ich habe eine 1-TB-PCIe-SSD bestellt, in der Hoffnung, dass ich dies auch auf meinem Computer tun kann. Wird mit den Ergebnissen aktualisiert.


Erstellen Sie Übersichten für VRT-Dateien oder einzelne Bilder aus VRT-Dateien? Mit GDAL können Sie die VRT-Übersicht bei niedriger Auflösung (dh für 64 x 64, 128 x 128) und die Übersichten einzelner Raster bei mittlerer Auflösung verwenden. Um Übersichten für einzelne Raster aus VRT zu erstellen, verwenden Sie gdaladdo on script, um Ihre Dateien zu schleifen. Erstellen Sie zunächst individuelle Übersichten. Dann erstellen Sie Übersichten für die gesamte VRT. Überlappen Sie keine Übersichten!
Dmitry Baryshnikov

Die Option 2c oben und 2+ Tage zum Erstellen der Übersichten für die gesamte VRT wurden als inakzeptabel angesehen.
user30184

Weil individuelle Übersichten vorher erstellt werden müssen. Und es scheint mir auch, dass die Übersichtsebene falsch gewählt wurde. Müssen gdaladdo tmp.vrt 2 4 8 16 und gdaladdo individual.tif 2 4 8 16 32 64 ... Topicstarter muss die vrt max-Übersichtsebene wie folgt berechnen: vrt-Größe in Pixel / Bildanzahl * 64 pix = maximale Übersicht für vrt. Wir haben solche Übersichten für Nordamerika für Landsat 30 m auf einem Desktop-PC erstellt. Das Ergebnis wurde in wenigen Tagen erstellt. Das Rendern von VRT in QGIS war schneller als das Mosaik-Geotiff in ArcGIS.
Dmitry Baryshnikov

1
Mal sehen, sie haben geschrieben, I also tried a hybrid of building overviews for the tiles for levels 1-6 and building levels 7-8 directly on the vrtwas sich genauso anfühlt wie die Reihenfolge, die Sie empfehlen, und das ist natürlich die richtige. Ich selbst würde keine 2 4 8 ... Übersichten für die VRT berechnen, wenn einzelne Kacheln diese haben, um Zeit und Speicherplatz zu sparen. Ein kleiner ROI würde dann Übersichten von ein paar Kacheln finden und das sollte schnell genug sein.
user30184

Dies gilt nicht, da 2 4 8 der einzelnen Datei (nicht Kachel!) Nicht mit 2 4 8 der vrt identisch ist. Zum Beispiel haben wir Einzelbilder mit einer Größe von 8000 x 8000 und 1000 x 1000 Bildern in vrt. Die Bildgröße mit einer Übersicht von 64 x 64 Pixel liegt für einzelne Dateien auf 8 Ebenen und für die gesamte vrt auf 18 Ebenen! Und die Mindeststufe für die gesamte vrt ist 8. Für die gesamte vrt müssen also Stufen von 9 bis 18 und für einzelne Dateien von 2 bis 8 verwendet werden.
Dmitry Baryshnikov

Antworten:


6

Sie scheinen zwei Hauptprobleme zu haben: Die VRT-ID ist beim Surfen langsam und das Erstellen globaler Übersichten ist langsam.


Ich bin mir zwar sicher, dass GDAL VRT vor vielen Jahren für mich und meinen MapServer langsam war, aber möglicherweise hat sich die Situation geändert. Ich habe eine Testebene mit 10000 Luftbildern (Bild- / Kachelgröße von 10000 x 10000 bis 12000 x 12000 Pixel) erstellt. Jetzt ist GDAL VRT tatsächlich schneller als der native MapServer-Shapefile-Index und liefert mit dem Testcomputer 6 Kacheln (256 x 256) pro Sekunde in einem einfachen Test mit 1 Thread, in dem GetMaps immer die erste Übersichtsebene erreicht. Mosaic mit 10000 Bildern ist immer noch recht klein und ich denke, dass Linux in meinem Test die gesamte VRT-Datei im Cache-Speicher hatte. Wie viele Bilder haben Sie in Ihrer VRT?

Das folgende Kapitel enthält möglicherweise alte Informationen, die verantwortungsbewusst gelesen werden:

Es gibt Hinweise darauf, dass VRT langsam ist, wenn es eine große Anzahl von Bildern enthält. Dies liegt nicht daran, dass VRT ein Index im XML-Format ist und keinen räumlichen Index unterstützt, der jedes Mal zum vollständigen Scannen der gesamten XML-Datei führt. Es gibt nichts, was Sie tun können, um dies mit einfachem GDAL zu verbessern, selbst wenn über die Implementierung eines räumlichen Index für VRT diskutiert wurde: http://osgeo-org.1560.x6.nabble.com/gdal-dev-Don-t-we- Haben Sie Ideen für GSoC-2017-td5309810.html .

Wenn Sie bereit sind, neue Software zu installieren, können Sie MapServer am einfachsten mit tileindex http://www.mapserver.org/optimization/tileindex.html verwenden . Wenn Sie einen Tileindex mit gdaltindex http://www.gdal.org/gdaltindex.html erstellen und einen Index für den Tileindex sowie mit shptree http://www.mapserver.org/utilities/shptree.html erstellendann sollte MapServer in der Lage sein, sehr schnell auf alle Bilddateien zuzugreifen, die Sie haben. Erstellen Sie Übersichten für einzelne Kacheln und stellen Sie die Ebene über WMS für QGIS bereit. Sie haben den ersten Teil des Problems gelöst, nicht jedoch das Problem mit globalen Übersichten. Selbst wenn Sie Übersichten für die einzelnen Kacheln erstellt haben, werden Tausende von Bilddateien nur langsam geöffnet, um einen großen Bereich abzudecken. Daher müssen Sie die Anzahl der Dateien begrenzen, indem Sie Übersichtsbilder erstellen, die einen größeren Bereich abdecken. Das haben Sie bereits versucht, indem Sie mit gdaladdo Übersichten für das Loch VRT erstellt haben.

Ich kenne kein fertiges Tool in der GDAL / MapServer-Welt, um globale Pyramiden automatisch zu erstellen. Sie können Kacheln aus der globalen VRT in eine Reihe von Bildern mit größerer Pixelgröße konvertieren, indem Sie ein Skript schreiben, das gdal_translate http://www.gdal.org/gdal_translate.html mit einem verschiebbaren -prowjin oder -srswin ausführt. Anschließend können Sie die resultierenden Kacheln mit gdalbuildvrt oder gdaltindex zu einer neuen Übersichtsebene kombinieren.

Da Sie auch die Verwendung von GeoServer in Betracht ziehen, würde ich empfehlen, eine Beute im gdal_retile-Skript http://www.gdal.org/gdal_retile.html zu haben , die für Ihren Fall geschrieben wurde. Es könnte auch möglich sein, die von gdal_retile direkt erstellten Kacheln als Übersichten mit QGIS zu verwenden, indem VRT darüber erstellt wird. Das erste Problem mit langsamen, riesigen VRT-Dateien würde jedoch bestehen bleiben.


1
Ich schätze Abstimmungen, möchte aber auch eine Erklärung oder eine bessere Antwort lesen. Die MapServer-Route war meine Wahl, als VRT zu langsam war, und sie eignet sich gut für einige Terabyte an Bildern.
user30184

Nun, ich konnte ein globales vrt mit Übersichten nicht vollständig vervollständigen, daher weiß ich nicht, wie schnell das rendern würde. Ohne Übersicht haben Sie Recht, dass die Anzeige zu lange dauert. Ich kann so viele oder so wenige Bilder in meinem vrt haben, wie ich möchte. Ich habe nur 60 und 4000 ausprobiert. Niemals 10000. Ich möchte die Komplexität einer Lösung vom Typ Mapserver vermeiden. Ich habe weitere Nachforschungen angestellt und denke, dass die einzelnen Kachelübersichten beim Erstellen eines vrt möglicherweise tatsächlich beibehalten werden. Ich werde dies testen und am Montag ein Update veröffentlichen.
Jon

5

Ok, nun, ich habe beide Probleme gelöst ... hauptsächlich durch den Kauf einer NVMe-SSD. Das Lesen / Schreiben meiner Festplatte ist von 125 MB / s auf 1200 MB / s gestiegen.

Programmatisch gibt es einige Dinge, die Sie tun können, um Ihre Lese- / Schreibgeschwindigkeit zu verbessern. Betrachten Sie zunächst die Blockgröße Ihres Tiffs. Wenn Sie ein gestreiftes TIFF verwenden und auf eine bestimmte Region zoomen, muss die GIS-Software jede vollständige Zeile der Region lesen, einschließlich der Teile des Tiffs, die nicht angezeigt werden, um die Region anzuzeigen. Wenn Sie beispielsweise in einen Bereich von 256 x 256 Pixel zoomen und einen gestreiften TIFF haben, muss die Software mindestens 256 Blöcke lesen (einen pro Zeile). Wenn Sie ein gekacheltes TIFF haben (gekachelt bei 256 x 256), müssen maximal 4 Blöcke gelesen werden (und mindestens 1). Das erste, was Sie tun können, ist sicherzustellen, dass Sie ein gekacheltes TIFF verwenden (TILED = YES-Erstellungsoption in GDAL).

Zweitens scheint ein hybrider Ansatz für Übersichten gut zu funktionieren. Wenn Sie Ihre Vorgänge parallelisieren können, können Sie den einzelnen Kacheln recht schnell Übersichten hinzufügen. Dies kommt Ihnen jedoch nur bei Auflösungen zugute, die kleiner als Ihre Kachelgröße sind. Ich habe interne Übersichten der Ebenen 2 4 8 16 32 und 64 auf den einzelnen Kacheln erstellt. Erstellen Sie dann eine VRT und erstellen Sie eine Übersicht über die Ebenen 128, 256 und 512 auf der VRT (beachten Sie, dass diese für globale Datensätze mit einer Auflösung von 30 m gelten - Ihre Ebenen ändern sich abhängig von der Anzahl der Pixel in Ihrem TIFF). Die Gesamtzeit zum Erstellen einzelner Übersichten liegt in der Größenordnung von Minuten (abhängig davon, wie viele Threads Sie ausführen können und wie viele Kacheln Sie haben), das Erstellen von Übersichten auf dem VRT liegt jedoch immer noch in der Größenordnung von einer Stunde. Die Laufzeitverbesserung gegenüber meinem ersten Beitrag ist auf die SSD zurückzuführen und führt dazu, dass auf der VRT weniger Ebenen erstellt werden.

Drittens können Sie mit der Option GDAL_MAX_DATASET_POOL_SIZE spielen, wenn Sie vrts erstellen, wie am Ende dieser Seite beschrieben . Es legt die maximale Anzahl von Tiffs fest, die gleichzeitig gespeichert werden sollen.

Viertens stellte ich fest, dass das Komprimieren mit PACKBITS die schnellsten Anzeigezeiten bietet. Die Dateien sind nicht so klein wie LZW, aber es ist ein Kompromiss, den Sie möglicherweise eingehen möchten.

Das Ergebnis ist eine VRT, die schnell geladen wird und nahezu nahtlos schwenkt / zoomt.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.