GDAL dovrebbe essere impostato per produrre file GeoTIFF con compressione? Quale algoritmo dovrebbe essere usato?


51

Ho una cartella di dati GIS che consiste principalmente di file GeoTIFF. L'intero set pesa circa 1.2 GB. Ho notato che se impacco il contenuto in un tarball, si rompe a circa 82 MB. Vorrei controllare il set in un sistema di controllo di revisione, su cui può essere lavorato da altre persone e sembra che ci sia dello spazio che può essere spremuto.

La pagina del driver GDAL GeoTIFF elenca molte opzioni che possono essere utilizzate per creare file GeoTIFF compressi. Ci sono anche molte opzioni che influenzano il modo in cui ciascun algoritmo funziona.

La pagina di aiuto fa un buon lavoro nel descrivere le opzioni ma non spiega come selezionare un algoritmo o i compromessi associati al livello variabile di compressione. Questo porta alle seguenti domande:

  • I vantaggi dell'utilizzo della compressione sono un notevole risparmio nello spazio. Quali sono i contro? Le informazioni vengono perse quando l'immagine viene compressa?

  • Come si dovrebbe scegliere un algoritmo e un livello di compressione. Alcuni tipi di immagini si prestano a un certo algoritmo?

Risposte:


86

Per selezionare il metodo di compressione è necessario utilizzare un comando come:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Quando si utilizza la compressione, il maggiore compromesso è il tempo di elaborazione aggiuntivo necessario per decomprimere l'immagine e, dopo la decompressione, l'immagine consumerebbe comunque la stessa quantità di memoria. Sulla perdita di informazioni ci sono due tipi base di compressione :

  • senza perdita di dati - che conserva i valori dei dati originali
  • con perdita di dati - che degradano i dati per risparmiare ancora più spazio

Saresti algoritmi senza perdita di dati quando i valori di dati originali devono essere preservati, come DEM o funzionalità raster. Algoritmi come PACKBITS , DEFLATE e LZW sono senza perdita e possono essere ordinati in base al rapporto di compressione:

  1. LZW: massimo rapporto di compressione, massima potenza di elaborazione
  2. SGONFIARE
  3. PACKBITS: rapporto di compressione più basso, potenza di elaborazione più bassa

Il rapporto di compressione dipende ancora dai dati, se i dati hanno molti valori simili PACKBITS produrrà buoni risultati.

Contrariamente a lossless useresti algoritmi con perdita come JPEG per comprimere i raster che non devono restituire valori esatti. Ad esempio, le ortofoto o le immagini satellitari possono essere compresse utilizzando algoritmi con perdita.


5
+1 per la bella risposta. PACKBITS è una forma di codifica run-length ( en.wikipedia.org/wiki/Run-length_encoding ) che funzionerà bene per i dati con molti valori uguali adiacenti (se, ad esempio, hai molti NULL o un raster classificato) e LZW è un algoritmo più robusto che è efficace su più tipi di dati. Il compromesso generale è tra spazio e velocità, come indicato, quindi ciò che è appropriato dipende dall'uso e dai dati. Inoltre, alcuni software non supportano determinati tipi di compressione GeoTiff.
scw,

3
questo è un buon post pertinente linfiniti.com/2011/05/…
oeon

1
Buona risposta, riassume bene le tue opzioni. Ricorda anche che ciascuno di questi metodi di compressione ha parametri che puoi impostare, il che influenzerà considerevolmente il risultato. @ j03lar50n, felice di aver trovato utile l'articolo del mio blog ...
R Thiede

bella risposta! così semplice e giusto al punto.
sys49152,

@scw potresti dire di più su quale software non supporta determinati tipi di compressione - in particolare, c'è qualche software che non supporta lzw o pacchetti? O ti riferisci principalmente ad algoritmi meno comuni?
David LeBauer,

29

L'uso lzwe la deflatecompressione -co predictor=2possono aiutare con le immagini che variano senza problemi in quanto comprime le differenze da pixel a pixel anziché i valori assoluti, e questi tenderanno ad essere piccoli e avere più modelli ( rif ). Predictor è utile solo con lzwe deflatecompressione, l'opzione non ha alcun effetto con altri metodi.

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

Il risparmio del predittore può essere drammatico. Ho appena ricompresso una directory di modelli di elevazione geotiff a 16 bit utilizzando fino a 17 GB con le impostazioni LZW predefinite in soli 5 GB con predittore = 2.

Ci sono informazioni contrastanti sulle differenze tra i predittori 2 e 3 e quando ciascuno è applicato al meglio ( ref1 , ref2 ). Forse carburante per un'altra domanda.

Un'altra opzione facile per il risparmio è -co tiled=yes. Esistono alcuni software che non sono in grado di leggere immagini affiancate, ma stanno diventando più rari e principalmente al di fuori di GIS (non conosco alcun software GIS di flusso principale che non li legge).

Basarsi sulla risposta di @ alfonx sull'utilizzo di panoramiche compresse : Ciò consente di archiviare senza perdita l'immagine di base, per l'integrità dei dati e per le perdite delle piramidi, per la velocità e alcuni risparmi di spazio. È quasi il migliore dei due mondi. Per le più piccole panoramiche possibili con gdaladdoimmagini RGB: usa la compressione jpeg, il ricampionamento medio o gaussiano invece del vicino più vicino predefinito (rende le panoramiche più fluide) e la panoramica fotometrica YCBCR. Vedi la pagina di riferimento di gdaladdo per maggiori informazioni su queste opzioni (anche se non dice molto su cosa sia fotometrico).

Questo fa parte di un file batch di Windows che utilizzo per applicare panoramiche jpeg esterne a tutti i tiff in una directory:

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

Appunti

GDAL 1.6.0 ha introdotto il gaussricampionamento che può portare a risultati migliori averagein caso di spigoli vivi con contrasto elevato o motivi rumorosi. Poteri di 2 livelli (2 4 8 ...) dovrebbero essere usati in modo da selezionare un kernel gaussiano di ricampionamento 3x3.

JPEG_QUALITY_OVERVIEW 85 - se non specificato viene utilizzato il valore predefinito del 75%, che produce file più piccoli, ma trovo che l'85% sia un compromesso migliore nelle dimensioni rispetto al compromesso sulla qualità.

Aggiornamento 2015: GDAL 1.8 e 2.0 hanno introdotto molte nuove opzioni non trattate qui e che non ho avuto il tempo di digerire. Leggi la pagina ufficiale del formato gtiff , sono sicuro che ci sono ulteriori impostazioni utili dettagliate.


10

Per i grandi raster GeoTiff offre la possibilità di memorizzare panoramiche (pre) ridimensionate come immagini extra nel file GeoTiff. Questo può essere fatto con gdaladdo (= Panoramica GDAL ADD). Durante la creazione di queste panoramiche, puoi dire manualmente anche a gdal di comprimerle:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Accelera la visualizzazione dei dati senza aggiungere troppe dimensioni. Nota: le applicazioni Geotools come Geoserver, uDig, AtlasStyler, Geopublisher possono utilizzare questa funzione e trarre profitto dalle panoramiche.


6

Per abilitare la decompressione parziale dell'immagine, utilizzare semplicemente TILED = YES.

Peter


4

Alla fine probabilmente dovrai sperimentare le diverse opzioni e vedere cosa soddisfa le tue esigenze.

Ho fatto un uso crescente di GeoTIFF compressi in JPEG su formati basati su wavelet. I miei risultati sono stati abbastanza buoni. L'utilizzo di GDAL per fare ciò ha prodotto rapporti di compressione paragonabili ai formati basati su wavelet senza troppa perdita di dati. Il colpo di prestazione che viene fornito con la decompressione è stato accettabile.

Quello che mi piace di più di questo approccio è che il supporto GeoTIFF è quasi universale, mentre il supporto per i formati basati su wavelet non è sempre garantito ed è talvolta soggetto a spinosi problemi di licenza.


3

La mia esperienza di confronto tra la compressione ECW ( Enhanced Compressed Wavelet ) di GeoTIFF e Earth Resource Mapping è che ECW è meglio in ordine di grandezza quando comprime foto aeree ad alta risoluzione. Un altro importante vantaggio della compressione basata su wavelet è che, a differenza dei formati più vecchi come GeoTIFF, JPEG - non JPEG 2000 -, solo una parte dell'immagine può essere decompressa [rif. 1]. L'importanza di questo vantaggio non deve essere sottovalutata, specialmente quando si lavora con "dimensioni della memoria superiori a circa la metà del computer".

Sembra - non ho mai avuto la possibilità di testarlo - che MrSID , un altro formato di file propietario basato su wavelet, mostri anche rapporti di compressione più alti rispetto ai formati "più vecchi" e decompressione selettiva.

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


1
dariapra, ricorda che GeoTIFF-Packbits o GeoTIFF-LZW sono compressioni senza perdita mentre ECW e JPEG sono con perdita. La compressione senza perdita o perdita deve essere scelta con cura a seconda dell'utilizzo futuro dei dati.
markusN,

1
Non sto affermando che un formato di compressione non valido sia sempre un formato di archiviazione valido. Quello che volevo dire è che l'uso di un formato come ECW è adatto in alcuni ambienti di produzione. Ad esempio, ECW è un formato più adatto di GeoTIFF se disponiamo di un'istanza MapServer che serve layer ortophoto tramite WMS. Nulla vieta di conservare anche l'ortofoto utilizzando la compressione senza perdita.
dariapra,

3

Le risposte di @dodobas e @ matt-wilkie coprono quasi tutto ciò che riguarda gli atti di compressione e sfocatura con GDAL per ridurre le dimensioni dell'immagine.

Vorrei aggiungere due cose:

  • la documentazione in formato file di GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Vedi le opzioni di creazione ( -co), in particolare:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • e che è essenziale verificare che il software che utilizzerà i GeoTIFF:
    • supporta il metodo di compressione desiderato;
    • consiglia di utilizzare la compressione.

Ad esempio, GeoServer non consiglia di comprimere GeoTIFF :

Come nota finale, Geotiff supporta vari tipi di compressione, ma suggeriamo di non usarlo. Mentre consente file molto più piccoli, il processo di decompressione è costoso e verrà eseguito su ogni accesso ai dati, rallentando significativamente il rendering. Nella nostra esperienza, il tempo di decompressione è superiore alla lettura dei dati del disco puro.

Ciò è particolarmente vero se si utilizzano già panoramiche, affiancamento e supporti di archiviazione ad alte prestazioni (disco di livello enterprise o SSD).


Devo anche copiare la mia immagine jpeg perché non sono in grado di convertire il mio raster in array con gdalin Python. Mostra errori di memoria e talvolta memoria insufficiente. Qualcuno potrebbe avere idea di come posso implementare questa riga (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) in Python. Sono nuovo nell'uso di gdal. Quindi, a volte è difficile per me capire la struttura.
Shiuli Pervin,

1
@ShiuliPervin, in primo luogo, JPEG è già un formato compresso (con perdita). In secondo luogo, sembra che tu abbia un problema di chunk, non di compressione. Leggi il file in riquadri, strisce o pezzi, anziché tutti in una volta. Anche se il file è compresso, dovrà essere non compresso quando lo si utilizza (esempio: se un file da 4 GB utilizza 2 GB sul disco quando è compresso, occuperà comunque 4 GB di RAM quando sarà caricato per l'elaborazione. alternativa salvaspazio, potresti voler esaminare la formattazione sparsa per GeoTIFF .
Kevin,

1
@ShiuliPervin, Anche se potrei fraintendere la tua domanda. La compressione stessa utilizza spesso molta memoria, ma non deve sovraccaricare il sistema, a meno che non ci sia un bug nella libreria o che non venga fornito un argomento non valido. Se riscontri problemi con JPEG come tipo di compressione per un GeoTIFF, prova LZMA o DEFLATE.
Kevin,

0

Per coloro che utilizzano le versioni GDAL più recenti, sono disponibili anche le opzioni di compressione ZStandard ( ZSTD ) senza perdita di dati ( GDAL> = 2.3) e di compressione con errori Raster Compression ( LERC ) con perdita limitata (GDAL> = 2.4).

In generale, tuttavia, ZSTDoffre una maggiore velocità di lettura dei dati rispetto a entrambi LZWe DEFLATEcon rapporti di compressione simili, anche se può essere leggermente più lento quando si scrive il file (a seconda delle impostazioni utilizzate).

Se non sei così preoccupato per la precisione dei dati (ad es. Solo per la visualizzazione piuttosto che per l'analisi), allora LERCpotrebbe essere una buona opzione. C'è MAX_Z_ERRORun'impostazione che ti consente di modificare quanta precisione sei disposto a sacrificare. Ad esempio un MAX_Z_ERROR=0.001o 1 mm ha consentito un risparmio di spazio del 50% in un benchmark (vedi rif ).

La parte migliore è che puoi anche combinare LERCcon l' ZSTDuso COMPRESS=LERC_ZSTD! O se preferisci usare DEFLATE, puoi farlo COMPRESS=LERC_DEFLATE. Vedi anche l'elenco completo di combinazioni / impostazioni nei documenti ufficiali GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Maggiori dettagli e confronti comparativi completi sono disponibili in questo prezioso riferimento:

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.