Haruskah GDAL diatur untuk menghasilkan file GeoTIFF dengan kompresi? Algoritme mana yang harus digunakan?


51

Saya memiliki folder data GIS yang sebagian besar terdiri dari file GeoTIFF. Seluruh set memiliki berat sekitar 1.2 GB. Saya perhatikan bahwa jika saya mengemas isinya ke dalam tarball, itu hancur sekitar 82 MB. Saya ingin memeriksa set ke sistem kontrol revisi sehingga dapat dikerjakan oleh orang lain dan sepertinya ada beberapa ruang yang dapat diperas.

Halaman driver GDAL GeoTIFF mencantumkan banyak opsi yang dapat digunakan untuk membuat file GeoTIFF terkompresi. Ada juga banyak opsi yang memengaruhi cara kerja setiap algoritma.

Halaman bantuan melakukan pekerjaan yang baik dalam menggambarkan opsi tetapi tidak menguraikan cara memilih algoritma atau pengorbanan yang terkait dengan berbagai tingkat kompresi. Ini mengarah pada pertanyaan-pertanyaan berikut:

  • Kelebihan menggunakan kompresi adalah penghematan ruang yang dramatis. Apa yang kontra? Apakah informasi hilang ketika gambar dikompresi?

  • Bagaimana seharusnya seseorang memilih algoritma dan tingkat kompresi. Apakah beberapa jenis gambar cocok untuk algoritma tertentu?

Jawaban:


86

Untuk memilih metode kompresi, Anda perlu menggunakan perintah seperti:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

Ketika Anda menggunakan kompresi, trade-off terbesar adalah waktu pemrosesan tambahan yang diperlukan untuk membuka kompresi gambar, dan setelah membuka kompresi gambar akan tetap menggunakan jumlah memori yang sama. Tentang kehilangan informasi ada dua tipe dasar kompresi :

  • lossless - yang mempertahankan nilai data asli
  • lossy - yang menurunkan data untuk menghemat lebih banyak ruang

Anda akan kehilangan algoritma ketika nilai data asli harus dipertahankan, seperti DEM, atau fitur raster. Algoritma seperti PACKBITS , DEFLATE , dan LZW bersifat lossless dan dapat dipesan sesuai dengan rasio kompresi:

  1. LZW - rasio kompresi tertinggi, daya pemrosesan tertinggi
  2. MENURUNKAN
  3. PACKBITS - rasio kompresi terendah, daya pemrosesan terendah

Rasio kompresi masih tergantung pada data, jika data memiliki banyak nilai yang sama PACKBITS akan menghasilkan hasil yang baik.

Bertentangan dengan lossless Anda akan menggunakan algoritma lossy seperti JPEG untuk mengompres raster yang tidak harus mengembalikan nilai yang tepat. Misalnya, citra orthophotos atau satelit dapat dikompresi menggunakan algoritma lossy.


5
+1 untuk jawaban yang bagus. PACKBITS adalah bentuk pengkodean run-length ( en.wikipedia.org/wiki/Run-length_encoding ) yang akan bekerja dengan baik untuk data dengan banyak nilai yang sama berdekatan (jika misalnya, Anda memiliki banyak NULLs atau raster rahasia) dan LZW adalah algoritma yang lebih kuat yang efektif pada lebih banyak jenis data. Pertukaran umum adalah antara ruang dan kecepatan seperti yang disebutkan, jadi apa yang sesuai tergantung pada penggunaan dan data Anda. Juga, beberapa perangkat lunak tidak mendukung jenis kompresi GeoTiff tertentu.
scw

3
ini adalah pos yang bagus, relevan linfiniti.com/2011/05/…
oeon

1
Jawaban yang bagus, itu merangkum opsi Anda dengan baik. Ingat juga bahwa masing-masing metode kompresi memiliki parameter yang dapat Anda atur, yang akan sangat mempengaruhi hasil. @ j03lar50n, senang Anda menemukan artikel blog saya bermanfaat ...
R Thiede

jawaban yang indah! sangat sederhana dan tepat sasaran.
sys49152

@scw dapatkah Anda mengatakan lebih banyak tentang perangkat lunak apa yang tidak mendukung jenis kompresi tertentu - khususnya, apakah ada perangkat lunak yang tidak mendukung lzw atau paket? Atau apakah Anda sebagian besar merujuk pada algoritma yang kurang umum?
David LeBauer

29

Dengan lzwdan deflatekompresi, penggunaan -co predictor=2dapat membantu pencitraan yang bervariasi dengan lancar karena mengompres perbedaan dari piksel ke piksel alih-alih nilai absolut, dan ini cenderung kecil dan memiliki lebih banyak pola ( ref ). Predictor hanya berguna dengan lzwdan deflatekompresi, opsi tidak berpengaruh dengan metode lain.

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

Tabungan prediktor bisa dramatis. Saya baru saja mengkompres ulang direktori model elevasi geotiff 16bit yang menggunakan hingga 17GB dengan pengaturan LZW default menjadi hanya 5GB dengan prediktor = 2.

Ada info yang bertentangan tentang perbedaan antara prediktor 2 & 3 dan kapan masing-masing diterapkan terbaik ( ref1 , ref2 ). Mungkin bahan bakar untuk pertanyaan lain.

Pilihan lain yang mudah untuk ditabung adalah -co tiled=yes. Ada beberapa perangkat lunak yang tidak dapat membaca gambar ubin, tetapi itu menjadi lebih jarang dan sebagian besar di luar GIS (Saya tidak tahu ada perangkat lunak GIS aliran utama sekarang yang tidak membacanya).

Untuk membangun jawaban @ alfonx tentang penggunaan ikhtisar terkompresi : Ini memungkinkan gambar dasar disimpan tanpa kehilangan, untuk integritas data, dan piramida menjadi lossy, untuk kecepatan dan penghematan ruang. Ini hampir yang terbaik dari kedua dunia. Untuk ikhtisar sekecil mungkin dengan gdaladdopada gambar RGB: gunakan kompresi jpeg, rata-rata atau gaussian resampling alih-alih tetangga terdekat default (membuat ikhtisar lebih halus), dan ikhtisar fotometrik YCBCR. Lihat halaman referensi gdaladdo untuk info lebih lanjut tentang opsi-opsi ini (meskipun tidak banyak berbicara tentang apa itu fotometrik).

Ini adalah bagian dari file batch windows yang saya gunakan untuk menerapkan ikhtisar jpeg eksternal ke semua tiffs dalam direktori:

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

Catatan

GDAL 1.6.0 memperkenalkan gaussresampling yang dapat menghasilkan hasil yang lebih baik averagejika tepi tajam dengan kontras tinggi atau pola bising. Powers 2 level (2 4 8 ...) harus digunakan sehingga kernel Gaussian resampling 3x3 dipilih.

JPEG_QUALITY_OVERVIEW 85 - jika tidak ditentukan, default 75% digunakan, yang menghasilkan file lebih kecil, tapi saya menemukan 85% kompromi yang lebih baik dalam ukuran vs kualitas trade off.

Pembaruan, 2015: GDAL 1.8 dan 2.0 telah memperkenalkan banyak opsi baru yang tidak tercakup di sini dan yang belum sempat saya cerna. Baca halaman format gtiff resmi , saya yakin ada pengaturan berguna tambahan rinci.


10

Untuk raster besar, GeoTiff menawarkan kemungkinan untuk menyimpan (pra-) ikhtisar yang diturunkan sebagai gambar tambahan ke file GeoTiff. Ini dapat dilakukan dengan gdaladdo (= Ikhtisar GDAL ADD). Saat membuat ikhtisar ini, Anda dapat secara manual memberi tahu gdal untuk mengompresnya juga:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

Mempercepat melihat data Anda tanpa menambahkan ukuran terlalu banyak. Catatan: Aplikasi Geotools seperti Geoserver, uDig, AtlasStyler, Geopublisher semuanya dapat menggunakan fitur ini dan mendapat keuntungan dari ikhtisar.



4

Pada akhirnya Anda mungkin perlu bereksperimen dengan berbagai opsi dan melihat apa yang memenuhi kebutuhan Anda.

Saya telah meningkatkan penggunaan GeoTIFF yang dikompresi JPEG melalui format berbasis wavelet. Hasil saya cukup bagus. Menggunakan GDAL untuk melakukan ini telah menghasilkan rasio kompresi yang sebanding dengan format berbasis wavelet tanpa terlalu banyak kehilangan data. Hit kinerja yang datang dengan dekompresi telah diterima.

Yang paling saya sukai dari pendekatan ini adalah bahwa dukungan GeoTIFF hampir universal, sementara dukungan untuk format berbasis wavelet tidak selalu terjamin dan kadang-kadang tunduk pada masalah perizinan yang sulit.


3

Pengalaman saya membandingkan kompresi ECW GeoTIFF vs Earth Resource Mapping ( Enhanced Compressed Wavelet ) adalah bahwa ECW adalah urutan besarnya lebih baik ketika mengompresi foto udara resolusi tinggi. Keuntungan penting lain dari kompresi berbasis wavelet adalah bahwa, tidak seperti format lama seperti GeoTIFF, JPEG - bukan JPEG 2000 -, hanya sebagian gambar yang dapat didekompresi [ref. 1]. Pentingnya keunggulan ini tidak boleh diremehkan, khususnya ketika bekerja dengan "lebih besar dari sekitar setengah ukuran memori komputer".

Tampaknya - saya tidak pernah memiliki kesempatan untuk mengujinya - bahwa MrSID , format file berbasis wavelet lainnya, juga menunjukkan rasio kompresi yang lebih tinggi daripada format "lama" dan dekompresi selektif.

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


1
dariapra, ingatlah bahwa GeoTIFF-Packbits atau GeoTIFF-LZW adalah kompresi lossless sementara ECW dan JPEG adalah lossy. Kompresi lossless atau lossy harus dipilih dengan cermat tergantung pada penggunaan data di masa depan.
MarkusN

1
Saya tidak mengklaim bahwa format kompresi longgar selalu merupakan format penyimpanan yang valid. Yang ingin saya maksud adalah bahwa menggunakan format seperti ECW cocok di beberapa lingkungan produksi. Sebagai contoh, ECW adalah format yang lebih cocok daripada GeoTIFF jika kita memiliki instance MapServer yang menyajikan lapisan ortophoto melalui WMS. Tidak ada yang melarang Anda menyimpan ortophoto menggunakan kompresi lossless.
dariapra

3

Jawaban oleh @dodobas dan @ matt-wilkie mencakup hampir semua yang berhubungan dengan tindakan mengompresi dan mengaburkan dengan GDAL untuk mengurangi ukuran gambar.

Saya ingin menambahkan dua hal:

  • dokumentasi format file dari GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • Lihat opsi pembuatan ( -co), khususnya:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • dan bahwa sangat penting untuk memverifikasi bahwa perangkat lunak yang akan memakan GeoTIFF:
    • mendukung metode kompresi yang diinginkan;
    • merekomendasikan penggunaan kompresi.

Misalnya, GeoServer tidak merekomendasikan kompresi GeoTIFFs :

Sebagai catatan terakhir, Geotiff mendukung berbagai jenis kompresi, tetapi kami menyarankan untuk tidak menggunakannya. Sementara itu memungkinkan untuk file yang jauh lebih kecil, proses dekompresi mahal dan akan dilakukan pada setiap akses data, secara signifikan memperlambat rendering. Dalam pengalaman kami, waktu dekompresi lebih tinggi daripada pembacaan data disk murni.

Ini terutama benar jika sudah menggunakan ikhtisar, ubin, dan media penyimpanan berkinerja tinggi (disk kelas perusahaan atau SSD).


Saya juga perlu menekan gambar jpeg saya karena saya tidak dapat mengubah raster saya menjadi array dengan gdalin Python. Ini menunjukkan kesalahan memori dan kadang-kadang juga kehabisan memori. Adakah yang tahu bagaimana saya bisa menerapkan baris ini (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) dalam python. Saya baru menggunakan gdal. Jadi, kadang-kadang sulit bagi saya untuk memahami strukturnya.
Shiuli Pervin

1
@ SiiPervin, Pertama, JPEG sudah merupakan format terkompresi (rugi). Kedua, sepertinya Anda memiliki masalah chunk, bukan kompresi. Baca file dalam ubin, strip, atau potongan, bukan sekaligus. Meskipun file dikompresi, file tersebut harus dikompresi saat Anda menggunakannya (contoh: jika file 4GB menggunakan 2GB pada disk saat dikompresi, masih akan memakan 4GB RAM saat semua dimuat untuk diproses. menghemat alternatif ruang, Anda mungkin ingin melihat ke dalam format jarang untuk GeoTIFFs .
Kevin

1
@ SiiPervin, Meskipun, saya mungkin salah paham pertanyaan Anda. Kompresi itu sendiri sering menggunakan banyak memori, tetapi seharusnya tidak meluap sistem Anda, kecuali ada bug di perpustakaan atau Anda diberi argumen yang tidak valid. Jika Anda mengalami masalah dengan JPEG sebagai tipe kompresi untuk GeoTIFF, mungkin coba LZMA atau DEFLATE.
Kevin

0

Bagi mereka yang menggunakan versi GDAL yang lebih baru, ada juga kompresi ZStandard ( ZSTD ) lossless (GDAL> = 2.3) dan kompresi Raster Compression ( LERC ) lossy (GDAL> = 2.4) yang tersedia.

Namun secara umum, ZSTDmenawarkan kecepatan membaca data yang lebih cepat daripada keduanya LZWdan DEFLATEdengan rasio kompresi yang serupa, meskipun bisa agak lambat ketika menulis file (tergantung pada pengaturan apa yang Anda gunakan).

Jika Anda tidak terlalu fokus pada ketepatan data (mis. Hanya melakukan visualisasi daripada analisis), maka itu LERCmungkin merupakan pilihan yang baik. Ada MAX_Z_ERRORpengaturan yang memungkinkan Anda menyesuaikan seberapa banyak presisi yang ingin Anda korbankan. Misalnya a MAX_Z_ERROR=0.001atau 1mm memberikan penghematan ruang 50% dalam satu patokan (lihat ref ).

Bagian terbaiknya adalah Anda juga dapat menggabungkan LERCdengan ZSTDmenggunakan COMPRESS=LERC_ZSTD! Atau jika Anda lebih suka menggunakan DEFLATE, Anda bisa melakukannya COMPRESS=LERC_DEFLATE. Lihat juga daftar lengkap kombinasi / pengaturan di dokumen resmi GDAL GeoTIFF https://gdal.org/drivers/raster/gtiff.html#creation-options

Lebih detail dan perbandingan benchmark lengkap dapat ditemukan di referensi berharga ini:

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.