Sollte GDAL so eingestellt sein, dass GeoTIFF-Dateien mit Komprimierung erstellt werden? Welcher Algorithmus soll verwendet werden?

51

Ich habe einen Ordner mit GIS-Daten, der hauptsächlich aus GeoTIFF-Dateien besteht. Das ganze Set wiegt etwa 1.2 GB. Mir ist aufgefallen, dass wenn ich den Inhalt in einen Tarball packe, er auf ungefähr zerschmettert 82 MB. Ich möchte das Set in ein Revisionskontrollsystem einchecken, an dem andere arbeiten können, und es sieht so aus, als gäbe es etwas Platz, der herausgedrückt werden könnte.

Auf der GDAL GeoTIFF- Treiberseite sind zahlreiche Optionen aufgeführt, die zum Erstellen komprimierter GeoTIFF-Dateien verwendet werden können. Es gibt auch viele Optionen, die sich auf die Funktionsweise der einzelnen Algorithmen auswirken.

Auf der Hilfeseite werden die Optionen gut beschrieben, es wird jedoch nicht näher erläutert, wie ein Algorithmus oder die mit der unterschiedlichen Komprimierungsstufe verbundenen Kompromisse ausgewählt werden. Dies führt zu folgenden Fragen:

  • Die Vorteile der Komprimierung sind dramatische Platzersparnisse. Was sind die Nachteile? Gehen Informationen verloren, wenn das Bild komprimiert wird?

  • Wie soll man bei der Auswahl eines Algorithmus und einer Komprimierungsstufe vorgehen? Bieten sich einige Bildtypen für einen bestimmten Algorithmus an?

Sharpie
quelle

Antworten:

85

Um die Komprimierungsmethode auszuwählen, müssen Sie einen Befehl wie den folgenden verwenden:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Wenn Sie die Komprimierung verwenden, ist der größte Nachteil die zusätzliche Verarbeitungszeit, die erforderlich ist, um das Bild zu dekomprimieren, und nach dem Dekomprimieren würde das Bild immer noch dieselbe Menge an Speicher belegen. Über Informationsverlust gibt es zwei grundlegende Arten der Komprimierung :

  • verlustfrei - wodurch die ursprünglichen Datenwerte erhalten bleiben
  • lossy (verlustbehaftet) - Verschlechtert die Daten, um noch mehr Platz zu sparen

Sie würden verlustfreie Algorithmen verwenden, wenn die ursprünglichen Datenwerte beibehalten werden müssen, z. B. DEMs oder Rasterfunktionen. Algorithmen wie PACKBITS , DEFLATE und LZW sind verlustfrei und können nach Kompressionsverhältnis bestellt werden:

  1. LZW - höchste Komprimierungsrate, höchste Rechenleistung
  2. DEFLATIEREN
  3. PACKBITS - niedrigstes Kompressionsverhältnis, niedrigste Rechenleistung

Das Komprimierungsverhältnis hängt immer noch von den Daten ab, wenn die Daten viele ähnliche Werte aufweisen. PACKBITS liefern gute Ergebnisse.

Im Gegensatz zu Lossless würden Sie verlustbehaftete Algorithmen wie JPEG verwenden , um Raster zu komprimieren, die keine genauen Werte zurückgeben müssen. Beispielsweise können Orthofotos oder Satellitenbilder mit verlustbehafteten Algorithmen komprimiert werden.

Dodobas
quelle
5
+1 für die nette Antwort. PACKBITS ist eine Form der Lauflängencodierung ( en.wikipedia.org/wiki/Run-length_encoding ), die sich gut für Daten mit vielen benachbarten gleichen Werten eignet (wenn Sie beispielsweise viele NULL-Werte oder ein klassifiziertes Raster haben) LZW ist ein robusterer Algorithmus, der für mehr Arten von Daten wirksam ist. Der allgemeine Kompromiss liegt, wie bereits erwähnt, zwischen Speicherplatz und Geschwindigkeit. Was also angemessen ist, hängt von Ihrer Verwendung und Ihren Daten ab. Außerdem unterstützt einige Software bestimmte Arten der GeoTiff-Komprimierung nicht.
scw
3
Dies ist ein guter, relevanter Beitrag linfiniti.com/2011/05/…
oeon
1
Gute Antwort, es fasst Ihre Möglichkeiten gut zusammen. Denken Sie auch daran, dass für jede dieser Komprimierungsmethoden Parameter festgelegt werden können, die das Ergebnis erheblich beeinflussen. @ j03lar50n, ich bin froh, dass du meinen Blog-Artikel nützlich fandest ...
R Thiede
schöne antwort! so einfach und auf den Punkt gebracht.
sys49152
@scw Können Sie mehr darüber sagen, welche Software bestimmte Komprimierungsarten nicht unterstützt? Gibt es eine Software, die LZW oder Packbits nicht unterstützt? Oder beziehen Sie sich hauptsächlich auf weniger gebräuchliche Algorithmen?
David LeBauer
29

Die Verwendung von lzwund deflateKomprimierung -co predictor=2kann bei Bildern hilfreich sein, die sich gleichmäßig ändern, da die Unterschiede von Pixel zu Pixel anstelle der absoluten Werte komprimiert werden. Diese sind in der Regel klein und weisen mehr Muster auf ( ref ). Predictor ist nur mit lzwund deflateKomprimierung nützlich , die Option hat bei anderen Methoden keine Auswirkung.

gdal_translate -co compress=lzw -co predictor=2 ...

Die Einsparungen beim Prädiktor können dramatisch sein. Ich habe gerade ein Verzeichnis von 16-Bit-Geotiff-Höhenmodellen mit bis zu 17 GB mit den Standard-LZW-Einstellungen in nur 5 GB mit Predictor = 2 neu komprimiert.

Es gibt widersprüchliche Informationen zu den Unterschieden zwischen den Prädiktoren 2 und 3 und zu den Zeitpunkten, zu denen sie am besten angewendet werden ( ref1 , ref2 ). Vielleicht Treibstoff für eine andere Frage.

Eine weitere einfache Möglichkeit zum Sparen ist -co tiled=yes. Es gibt einige Programme, die gekachelte Bilder nicht lesen können, aber diese werden seltener und meistens außerhalb von GIS (ich kenne derzeit keine GIS-Hauptsoftware, die sie nicht liest).

So bauen Sie auf der Antwort von @alfonx auf , komprimierte Übersichten zu verwenden : Auf diese Weise können Sie das Basis-Image aus Gründen der Datenintegrität verlustfrei und die Pyramiden aus Gründen der Geschwindigkeit und der Platzersparnis verlustfrei speichern. Es ist fast das Beste aus beiden Welten. Für die kleinstmöglichen Übersichten mit gdaladdoRGB-Bildern: Verwenden Sie JPEG-Komprimierung, gemitteltes oder Gauß-Resampling anstelle des nächstgelegenen Standardnachbarn (glättet die Übersichten) und photometrische YCBCR-Übersicht. Weitere Informationen zu diesen Optionen finden Sie auf der gdaladdo-Referenzseite (obwohl nicht viel darüber ausgesagt wird, worum es bei der Fotometrie geht).

Dies ist Teil einer Windows-Batchdatei, mit der ich externe JPEG-Übersichten auf alle Tiffs in einem Verzeichnis anwende:

set _opts= -r gauss --config PHOTOMETRIC_OVERVIEW YCBCR ^
--config COMPRESS_OVERVIEW JPEG --config JPEG_QUALITY_OVERVIEW 85

for %%a in (*.tif) do gdaladdo -ro %_opts% %%a 2 4 8 16 32 64

Anmerkungen

Mit GDAL 1.6.0 wurde ein gaussResampling eingeführt, das averagebei scharfen Kanten mit hohem Kontrast oder verrauschten Mustern zu besseren Ergebnissen führen kann . Potenzen von 2 Stufen (2 4 8 ...) sollten verwendet werden, damit ein 3x3-Resampling-Gauß-Kernel ausgewählt wird.

JPEG_QUALITY_OVERVIEW 85 - Wenn nicht angegeben, wird der Standardwert von 75% verwendet, wodurch sich eine kleinere Datei ergibt. 85% sind jedoch ein besserer Kompromiss zwischen Größe und Qualität.

Update, 2015: GDAL 1.8 und 2.0 haben viele neue Optionen eingeführt, die hier nicht behandelt werden und für die ich keine Zeit hatte, sie zu verdauen. Lesen Sie die offizielle Seite zum Gtiff-Format . Ich bin sicher, dass dort weitere nützliche Einstellungen aufgeführt sind.

Matt Wilkie
quelle
10

Für große Raster bietet GeoTiff die Möglichkeit, (vor-) verkleinerte Übersichten als zusätzliche Bilder in der GeoTiff-Datei zu speichern. Dies kann mit gdaladdo (= GDAL ADD Overview) erfolgen. Wenn Sie diese Übersichten erstellen, können Sie gdal manuell anweisen, sie auch zu komprimieren:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Beschleunigt das Anzeigen Ihrer Daten, ohne zu viel Größe hinzuzufügen. Hinweis: Geotool-Anwendungen wie Geoserver, uDig, AtlasStyler und Geopublisher können diese Funktion nutzen und von Übersichten profitieren.

Alfonx
quelle
6

Verwenden Sie zum Aktivieren der teilweisen Bilddekomprimierung einfach TILED = YES.

Peter

Peter Hopfgartner
quelle
4

Letztendlich müssen Sie wahrscheinlich mit den verschiedenen Optionen experimentieren und herausfinden, was Ihren Anforderungen entspricht.

Ich habe verstärkt JPEG-komprimierte GeoTIFFs über Wavelet-basierte Formate verwendet. Meine Ergebnisse waren ziemlich gut. Die Verwendung von GDAL zu diesem Zweck hat zu Komprimierungsverhältnissen geführt, die mit Wavelet-basierten Formaten ohne zu großen Datenverlust vergleichbar sind. Der mit der Dekomprimierung einhergehende Leistungseinbruch war akzeptabel.

Was mir an diesem Ansatz am besten gefällt, ist, dass die GeoTIFF-Unterstützung fast universell ist, während die Unterstützung von Wavelet-basierten Formaten nicht immer gewährleistet ist und manchmal heiklen Lizenzproblemen unterliegt.

Roger D.
quelle
3

Meine Erfahrung beim Vergleich der ECW- Komprimierung ( Enhanced Compressed Wavelet ) von GeoTIFF mit der Earth Resource Mapping- Komprimierung zeigt, dass die ECW-Komprimierung bei hochauflösenden Luftbildern um Größenordnungen besser ist. Ein weiterer wichtiger Vorteil der Wavelet-basierten Komprimierung ist, dass im Gegensatz zu älteren Formaten wie GeoTIFF, JPEG - und nicht JPEG 2000 - nur ein Teil des Bildes dekomprimiert werden kann [Ref. 1]. Die Wichtigkeit dieses Vorteils darf nicht unterschätzt werden, insbesondere wenn mit "mehr als etwa der Hälfte des Computerspeichers" gearbeitet wird.

Es scheint - ich hatte nie die Gelegenheit, es zu testen -, dass MrSID , ein anderes proprietäres, Wavelet-basiertes Dateiformat, auch höhere Komprimierungsraten als "ältere" Formate und selektive Dekomprimierung aufweist.

ref. 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf

Dariapra
quelle
1
Dariapra, denken Sie daran, dass GeoTIFF-Packbits oder GeoTIFF-LZW verlustfreie Komprimierungen sind, während ECW und JPEG verlustbehaftet sind. Verlustfreie oder verlustbehaftete Komprimierung muss abhängig von der zukünftigen Datennutzung sorgfältig ausgewählt werden.
markusN
1
Ich behaupte nicht, dass ein lockeres Komprimierungsformat immer ein gültiges Speicherformat ist. Was ich damit meinen wollte, ist, dass die Verwendung eines Formats wie ECW in einigen Produktionsumgebungen geeignet ist. Zum Beispiel ist ECW ein besser geeignetes Format als GeoTIFF, wenn wir eine MapServer-Instanz haben, die Ortophoto-Ebenen über WMS bedient. Nichts verbietet, dass Sie das Ortophoto auch mit verlustfreier Komprimierung speichern.
Dariapra
3

Die Antworten von @dodobas und @ matt-wilkie decken fast alles ab, was mit dem Komprimieren und Verwischen mit GDAL zur Reduzierung der Bildgröße zu tun hat .

Ich möchte zwei Dinge hinzufügen:

  • die Datei-Format-Dokumentation von GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Siehe die Erstellungsoptionen ( -co), insbesondere:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • und dass es wichtig ist, zu überprüfen, ob die Software, die die GeoTIFFs verwendet,
    • unterstützt die gewünschte Komprimierungsmethode;
    • empfiehlt die Verwendung von Komprimierung.

GeoServer empfiehlt beispielsweise nicht , GeoTIFFs zu komprimieren :

Schließlich unterstützt Geotiff verschiedene Arten der Komprimierung. Wir empfehlen jedoch, diese nicht zu verwenden. Es sind zwar viel kleinere Dateien möglich, der Dekomprimierungsprozess ist jedoch teuer und wird bei jedem Datenzugriff ausgeführt, wodurch das Rendern erheblich verlangsamt wird. Nach unserer Erfahrung ist die Dekomprimierungszeit höher als das reine Lesen von Plattendaten.

Dies gilt insbesondere dann, wenn Sie bereits Übersichten, Kacheln und Hochleistungsspeichermedien (Enterprise-Grade-Festplatten oder SSDs) verwenden.

Kevin
quelle
Ich muss auch mein JPEG-Bild kopieren, da ich mein Raster mit Gdalin Python nicht in ein Array konvertieren kann. Es zeigt Speicherfehler und manchmal auch zu wenig Speicher. Könnte jemand eine Idee haben, wie ich diese Zeile (gdal_translate -co "COMPRESS = Methode" src_dataset dst_dataset) in Python implementieren kann. Ich bin neu in der Verwendung von GDAL. Daher fällt es mir manchmal schwer, die Struktur zu verstehen.
Shiuli Pervin
1
@ ShiuliPervin, Erstens ist JPEG bereits ein komprimiertes (verlustbehaftetes) Format. Zweitens klingt es so, als hätten Sie ein Problem mit dem Block, nicht mit der Komprimierung. Lesen Sie die Datei in Kacheln, Streifen oder Stücken, anstatt auf einmal. Auch wenn die Datei komprimiert ist, muss sie bei der Verwendung dekomprimiert werden (Beispiel: Wenn eine 4-GB-Datei bei der Komprimierung 2 GB auf der Festplatte belegt, belegt sie nach dem Laden für die Verarbeitung immer noch 4 GB RAM Als platzsparende Alternative sollten Sie sich mit der spärlichen Formatierung von GeoTIFFs befassen .
Kevin,
1
@ ShiuliPervin, aber ich kann Ihre Frage falsch verstehen. Die Komprimierung selbst beansprucht häufig viel Speicher, sollte jedoch Ihr System nicht überlaufen lassen, es sei denn, die Bibliothek enthält einen Fehler oder Sie erhalten ein ungültiges Argument. Wenn Sie Probleme mit JPEG als Komprimierungstyp für ein GeoTIFF haben, versuchen Sie es mit LZMA oder DEFLATE.
Kevin
0

Für diejenigen neueren GDAL Versionen verwenden, gibt es auch die lossless ZStandard ( ZSTD ) Kompression (GDAL> = 2.3) und verlustbehaftete begrenzte Fehler Raster Compression ( LERC ) Kompression (GDAL> = 2.4) Möglichkeiten zur Verfügung.

Im Allgemeinen ZSTDbietet es jedoch schnellere Datenlesegeschwindigkeiten als beide LZWund DEFLATEähnliche Komprimierungsraten, obwohl es beim Schreiben der Datei etwas langsamer sein kann (abhängig von den von Ihnen verwendeten Einstellungen).

Wenn Sie nicht so viel Wert auf Datenpräzision legen (z. B. nur Visualisierung statt Analyse), ist dies LERCmöglicherweise eine gute Option. Es gibt eine MAX_Z_ERROREinstellung, mit der Sie festlegen können, wie viel Präzision Sie opfern möchten. ZB ein MAX_Z_ERROR=0.001oder gab 1mm einen Raum von 50% in einer Benchmark - Speichern (siehe ref ).

Das Beste daran ist, dass Sie auch LERCmit dem ZSTDVerwenden kombinieren können COMPRESS=LERC_ZSTD! Oder wenn Sie es vorziehen DEFLATE, können Sie tun COMPRESS=LERC_DEFLATE. Siehe auch die vollständige Liste der Kombinationen / Einstellungen in den offiziellen GDAL GeoTIFF-Dokumenten https://gdal.org/drivers/raster/gtiff.html#creation-options

Weitere Details und vollständige Benchmark-Vergleiche finden Sie unter dieser wertvollen Referenz:

weiji14
quelle