ควรตั้งค่า GDAL เพื่อสร้างไฟล์ GeoTIFF ด้วยการบีบอัดหรือไม่ ควรใช้อัลกอริทึมแบบใด


50

ฉันมีโฟลเดอร์ของข้อมูล GIS ที่ประกอบด้วยไฟล์ GeoTIFF เป็นส่วนใหญ่ 1.2 GBทั้งชุดน้ำหนักในที่เกี่ยวกับ ผมสังเกตเห็นว่าถ้าผมแพ็คเนื้อหาลงใน tarball 82 MBนั้นมันแตกลงไปประมาณ ฉันต้องการตรวจสอบการตั้งค่าเป็นระบบควบคุมการแก้ไขเพราะมันสามารถทำงานได้โดยคนอื่นและดูเหมือนว่ามีพื้นที่บางส่วนที่สามารถบีบออก

หน้าไดรเวอร์ GDAL GeoTIFF แสดงรายการตัวเลือกมากมายที่อาจใช้ในการสร้างไฟล์ GeoTIFF ที่ถูกบีบอัด นอกจากนี้ยังมีตัวเลือกมากมายที่มีผลต่อการทำงานของอัลกอริทึม

หน้าความช่วยเหลือทำงานได้ดีในการอธิบายตัวเลือก แต่ไม่ได้อธิบายรายละเอียดเกี่ยวกับวิธีเลือกอัลกอริทึมหรือการแลกเปลี่ยนที่เกี่ยวข้องกับระดับการบีบอัดที่แตกต่างกัน สิ่งนี้นำไปสู่คำถามต่อไปนี้:

  • ข้อดีของการใช้การบีบอัดคือการประหยัดพื้นที่อย่างมาก ข้อเสียคืออะไร? ข้อมูลสูญหายเมื่อทำการบีบอัดภาพหรือไม่?

  • เราควรเลือกอัลกอริธึมและระดับการบีบอัดอย่างไร รูปภาพบางประเภทให้ยืมตัวเองกับอัลกอริธึมที่แน่นอนหรือไม่?

คำตอบ:


84

ในการเลือกวิธีการบีบอัดคุณต้องใช้คำสั่งเช่น:

gdal_translate -co "COMPRESS=method" src_dataset dst_dataset

เมื่อคุณใช้การบีบอัดที่ใหญ่ที่สุดคือเวลาในการประมวลผลพิเศษซึ่งจำเป็นสำหรับการคลายการบีบอัดภาพและหลังจากการคลายการบีบอัดภาพจะยังคงใช้หน่วยความจำในปริมาณเท่าเดิม เกี่ยวกับการสูญเสียข้อมูลมีการบีบอัดข้อมูลพื้นฐานสองประเภท:

  • lossless - ซึ่งเก็บรักษาค่าข้อมูลดั้งเดิม
  • lossy - ซึ่งลดข้อมูลเพื่อประหยัดพื้นที่มากยิ่งขึ้น

คุณจะสูญเสียอัลกอริธึมเมื่อค่าข้อมูลดั้งเดิมต้องถูกเก็บรักษาไว้เช่น DEMs หรือคุณสมบัติแรสเตอร์ อัลกอริทึมเช่นPACKBITS , DEFLATEและLZWเป็นแบบไม่สูญเสียและสามารถสั่งซื้อได้ตามอัตราส่วนการบีบอัด:

  1. LZW - อัตราส่วนการบีบอัดสูงสุดกำลังการประมวลผลสูงสุด
  2. ยุบ
  3. PACKBITS - อัตราส่วนการบีบอัดต่ำสุดกำลังประมวลผลต่ำสุด

อัตราส่วนการบีบอัดยังคงขึ้นอยู่กับข้อมูลหากข้อมูลมีค่าคล้ายกันมาก PACKBITS จะให้ผลลัพธ์ที่ดี

ตรงกันข้ามกับ lossless คุณจะใช้อัลกอริธึม lossy เช่นJPEGเพื่อบีบอัด rasters ที่ไม่ต้องคืนค่าที่แน่นอน ตัวอย่างเช่น orthophotos หรือภาพถ่ายดาวเทียมสามารถบีบอัดได้โดยใช้อัลกอริทึมที่สูญเสีย


5
+1 สำหรับคำตอบที่ดี PACKBITS เป็นรูปแบบของการเข้ารหัสความยาวรัน ( en.wikipedia.org/wiki/Run-length_encoding ) ซึ่งจะทำงานได้ดีกับข้อมูลที่มีค่าเดียวกันจำนวนมากที่อยู่ติดกัน (ตัวอย่างเช่นคุณมีจำนวน NULL หรือแรสเตอร์แยกประเภท) และ LZW เป็นอัลกอริธึมที่มีประสิทธิภาพมากกว่าซึ่งมีผลกับข้อมูลชนิดต่าง ๆ มากขึ้น การแลกเปลี่ยนทั่วไประหว่างพื้นที่และความเร็วดังที่กล่าวมาดังนั้นสิ่งที่เหมาะสมขึ้นอยู่กับการใช้งานและข้อมูลของคุณ นอกจากนี้ซอฟต์แวร์บางตัวไม่รองรับการบีบอัด GeoTiff บางประเภท
scw

3
นี่เป็นสิ่งที่ดีโพสต์ที่เกี่ยวข้องlinfiniti.com/2011/05/…
oeon

1
คำตอบที่ดีมันสรุปตัวเลือกของคุณได้ดี โปรดจำไว้ว่าวิธีการบีบอัดแต่ละวิธีนั้นมีพารามิเตอร์ที่คุณสามารถตั้งค่าได้ซึ่งจะส่งผลต่อผลลัพธ์อย่างมาก @ j03lar50n ดีใจที่คุณพบว่าบทความบล็อกของฉันมีประโยชน์ ...
R Thiede

คำตอบที่สวยงาม! ง่ายและถูกต้องตรงประเด็น
sys49152

@scw คุณสามารถพูดเพิ่มเติมเกี่ยวกับซอฟต์แวร์ที่ไม่รองรับการบีบอัดบางประเภท - โดยเฉพาะมีซอฟต์แวร์ที่ไม่รองรับ lzw หรือ packbits หรือไม่? หรือคุณส่วนใหญ่อ้างถึงอัลกอริทึมทั่วไปน้อยลงหรือไม่?
David LeBauer

28

ด้วยlzwและdeflateการใช้การบีบอัด-co predictor=2สามารถช่วยให้ภาพที่แตกต่างกันอย่างราบรื่นในขณะที่มันบีบอัดความแตกต่างจากพิกเซลเป็นพิกเซลแทนค่าสัมบูรณ์และเหล่านี้จะมีขนาดเล็กและมีรูปแบบมากขึ้น ( อ้างอิง ) Predictor มีประโยชน์เฉพาะกับlzwและการdeflateบีบอัดตัวเลือกไม่มีผลกับวิธีอื่น

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

การออมแบบทำนายได้อย่างน่าทึ่ง ฉันเพิ่งบีบอัดไดเรคทอรีรุ่นยกระดับพิกัด 16 บิตใหม่โดยใช้ขนาด 17GB ด้วยการตั้งค่า LZW เริ่มต้นเป็น 5GB ด้วยตัวพยากรณ์ = 2

มีข้อมูลที่ขัดแย้งกันเกี่ยวกับความแตกต่างระหว่างตัวทำนาย 2 และ 3 และเมื่อใช้อย่างใดอย่างหนึ่งที่ดีที่สุด ( ref1 , ref2 ) อาจเติมน้ำมันสำหรับคำถามอื่น

-co tiled=yesอีกหนึ่งทางเลือกที่ง่ายสำหรับเงินฝากออมทรัพย์ มีซอฟต์แวร์บางตัวที่ไม่สามารถอ่านภาพที่เรียงกันได้ แต่มันกลายเป็นสิ่งที่หายากและส่วนใหญ่อยู่นอกระบบ GIS (ฉันไม่รู้ซอฟต์แวร์ GIS กระแสหลักใด ๆ ที่ไม่ได้อ่าน)

หากต้องการสร้างคำตอบของ @ alfonx เกี่ยวกับการใช้ภาพรวมที่บีบอัด : วิธีนี้ช่วยให้ภาพฐานถูกจัดเก็บไว้แบบไม่สูญเสียเพื่อความสมบูรณ์ของข้อมูลและปิรามิดจะสูญเสียเพื่อความรวดเร็วและประหยัดพื้นที่ มันเกือบดีที่สุดของทั้งสองโลก สำหรับภาพรวมที่เล็กที่สุดเท่าที่เป็นไปได้ด้วยgdaladdoภาพ RGB: ใช้การบีบอัด jpeg, การสุ่มค่าเฉลี่ยหรือเกาส์แทนเพื่อนบ้านที่ใกล้ที่สุดที่เป็นค่าเริ่มต้น (ทำให้ภาพรวมราบรื่นขึ้น) และภาพรวมของแสง YCBCR ดูหน้าข้อมูลอ้างอิง gdaladdoสำหรับข้อมูลเพิ่มเติมเกี่ยวกับตัวเลือกเหล่านี้ (แม้ว่ามันจะไม่ได้พูดอะไรมากเกี่ยวกับการวัดความเข้มแสง)

นี่เป็นส่วนหนึ่งของชุดแบตช์ windows ที่ฉันใช้เพื่อนำภาพรวม jpeg ภายนอกไปใช้กับ tiffs ทั้งหมดในไดเรกทอรี:

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

หมายเหตุ

GDAL 1.6.0 แนะนำการgaussสุ่มใหม่ซึ่งสามารถนำไปสู่ผลลัพธ์ที่ดีกว่าaverageในกรณีที่ขอบคมที่มีความคมชัดสูงหรือรูปแบบที่มีเสียงดัง ควรใช้กำลัง 2 ระดับ (2 4 8 ... ) เพื่อเลือกเคอร์เนล Gaussian resampling 3x3 ใหม่

JPEG_QUALITY_OVERVIEW 85 - หากไม่ได้ระบุจะใช้ค่าเริ่มต้นที่ 75% ซึ่งทำให้ไฟล์มีขนาดเล็กลง แต่ฉันพบว่า 85% มีการประนีประนอมที่ดีกว่าในขนาดเทียบกับการแลกเปลี่ยนคุณภาพ

อัปเดต, 2558: GDAL 1.8 และ 2.0 ได้แนะนำตัวเลือกใหม่มากมายที่ไม่ได้กล่าวถึงในที่นี้และฉันไม่มีเวลาย่อย อ่านหน้ารูปแบบ gtiffอย่างเป็นทางการฉันแน่ใจว่ามีรายละเอียดการตั้งค่าที่มีประโยชน์เพิ่มเติม


10

สำหรับ rasters ขนาดใหญ่ GeoTiff นำเสนอความเป็นไปได้ในการจัดเก็บ (ก่อน -) ภาพรวมที่ลดขนาดลงเป็นภาพพิเศษไปยังไฟล์ GeoTiff สามารถทำได้ด้วย gdaladdo (= ภาพรวมของ GDAL เพิ่ม) เมื่อสร้างภาพรวมเหล่านี้คุณสามารถบอก gdal ให้บีบอัดได้ด้วยตนเอง:

gdaladdo --config COMPRESS_OVERVIEW JPEG 

เพิ่มความเร็วในการดูข้อมูลของคุณโดยไม่เพิ่มขนาดมากเกินไป หมายเหตุ: แอปพลิเคชัน Geotools เช่น Geoserver, uDig, AtlasStyler, Geopublisherสามารถใช้คุณสมบัตินี้และรับประโยชน์จากภาพรวมได้



4

ท้ายที่สุดคุณอาจต้องทดลองกับตัวเลือกที่แตกต่างกันและดูสิ่งที่ตรงกับความต้องการของคุณ

ฉันใช้ GeoTIFF ที่บีบอัดด้วย JPEG มากกว่ารูปแบบเวฟเล็ต ผลลัพธ์ของฉันค่อนข้างดี การใช้ GDAL ในการทำเช่นนี้ทำให้ได้อัตราส่วนการบีบอัดที่เทียบเคียงกับรูปแบบเวฟเลตโดยไม่ทำให้ข้อมูลสูญหายมากเกินไป ประสิทธิภาพการทำงานที่มาพร้อมกับการบีบอัดได้รับการยอมรับ

สิ่งที่ฉันชอบมากที่สุดเกี่ยวกับวิธีนี้คือการรองรับ GeoTIFF นั้นเกือบจะเป็นสากลในขณะที่การรองรับรูปแบบเวฟเล็ตนั้นไม่สามารถรับประกันได้เสมอไปและบางครั้งอาจมีปัญหาเรื่องใบอนุญาตที่ยุ่งยาก


3

ประสบการณ์ของฉันเปรียบเทียบ GeoTIFF กับการบีบอัด ECW ( Enhanced Compressed Wavelet ) ของการทำแผนที่ Earth คือ ECW นั้นมีขนาดที่ดีกว่าเมื่อบีบอัดภาพถ่ายทางอากาศความละเอียดสูง ข้อได้เปรียบที่สำคัญอีกประการหนึ่งของการบีบอัดที่ใช้เวฟเล็ตคือไม่เหมือนกับรูปแบบเก่าเช่น GeoTIFF, JPEG - ไม่ใช่JPEG 2000 - เพียงส่วนหนึ่งของภาพที่สามารถคลายการบีบอัดได้ 1] ความสำคัญของข้อได้เปรียบนี้จะต้องไม่ถูกประเมินต่ำเกินไปโดยเฉพาะอย่างยิ่งเมื่อทำงานกับ "ขนาดหน่วยความจำคอมพิวเตอร์ขนาดใหญ่กว่าประมาณครึ่ง"

ดูเหมือนว่า - ฉันไม่เคยมีโอกาสทดสอบเลย - MrSIDซึ่งเป็นรูปแบบไฟล์ในรูปแบบเวฟเล็ตที่น่าสนใจอีกรุ่นหนึ่งยังแสดงอัตราส่วนการบีบอัดที่สูงกว่ารูปแบบ "เก่า" และการบีบอัดแบบเลือก

อ้าง 1: http://www.ifp.uni-stuttgart.de/publications/phowo01/Ueffing.pdf


1
อย่างไรก็ตาม, จำไว้ว่า GeoTIFF-Packbits หรือ GeoTIFF-LZW เป็นการบีบอัดแบบไม่สูญเสียในขณะที่ ECW และ JPEG สูญเสียไป การบีบอัดแบบไม่สูญเสียหรือสูญหายต้องถูกเลือกอย่างระมัดระวังโดยขึ้นอยู่กับการใช้ข้อมูลในอนาคต
markusN

1
ฉันไม่ได้อ้างว่ารูปแบบการบีบอัดแบบหลวมเป็นรูปแบบการจัดเก็บข้อมูลที่ถูกต้องเสมอ สิ่งที่ฉันต้องการจะหมายถึงคือการใช้รูปแบบเช่น ECW เหมาะสมในบางสภาพแวดล้อมการผลิต ตัวอย่างเช่น ECW เป็นรูปแบบที่เหมาะสมกว่า GeoTIFF หากเรามีอินสแตนซ์ MapServer ที่ให้บริการเลเยอร์ ortophoto ผ่าน WMS ไม่มีข้อห้ามใด ๆ ที่คุณเก็บ ortophoto โดยใช้การบีบอัดแบบไม่สูญเสีย
dariapra

3

คำตอบโดย@dodobasและ@ matt-wilkieครอบคลุมทุกอย่างส่วนใหญ่ที่เกี่ยวข้องกับการกระทำของการบีบอัดและเบลอด้วย GDAL เพื่อลดขนาดภาพ

ฉันต้องการเพิ่มสองสิ่ง:

  • เอกสารประกอบรูปแบบไฟล์จาก GDAL: http://www.gdal.org/frmt_gtiff.html ;
    • ดูตัวเลือกการสร้าง ( -co) โดยเฉพาะ:
      • COMPRESS
      • NUM_THREADS
      • PREDICTOR
      • ZLEVEL
  • และมันเป็นสิ่งสำคัญในการตรวจสอบว่าซอฟต์แวร์ที่จะใช้ GeoTIFF:
    • รองรับวิธีการบีบอัดที่ต้องการ;
    • แนะนำให้ใช้การบีบอัด

ตัวอย่างเช่นGeoServer ไม่แนะนำให้บีบอัด GeoTIFF :

ในฐานะโน้ตสุดท้าย Geotiff รองรับการบีบอัดหลายรูปแบบ แต่เราแนะนำว่าอย่าใช้ ในขณะที่มันช่วยให้ไฟล์มีขนาดเล็กลงมากกระบวนการคลายบีบอัดมีราคาแพงและจะดำเนินการกับการเข้าถึงข้อมูลแต่ละครั้งทำให้การเรนเดอร์ช้าลงอย่างมาก จากประสบการณ์ของเราเวลาคลายการบีบอัดจะสูงกว่าการอ่านข้อมูลดิสก์บริสุทธิ์

โดยเฉพาะอย่างยิ่งหากใช้ภาพรวมการเรียงต่อเนื่องและสื่อบันทึกข้อมูลประสิทธิภาพสูง (ดิสก์ระดับองค์กรหรือ SSD)


ฉันยังต้องจัดการภาพ jpeg ของฉันเพราะฉันไม่สามารถแปลงแรสเตอร์เป็นอาร์เรย์ด้วย gdalin Python ได้ มันแสดงข้อผิดพลาดของหน่วยความจำและบางครั้งหน่วยความจำไม่เพียงพอ ทุกคนสามารถมีความคิดใด ๆ ฉันจะใช้บรรทัดนี้ได้อย่างไร (gdal_translate -co "COMPRESS = method" src_dataset dst_dataset) ในไพ ธ อน ฉันใหม่ในการใช้ gdal บางครั้งมันก็ยากสำหรับฉันที่จะเข้าใจโครงสร้าง
Shiuli Pervin

1
@ShiuliPervin ขั้นแรกให้ JPEG เป็นรูปแบบการบีบอัด (สูญเสีย) อยู่แล้ว ประการที่สองดูเหมือนว่าคุณมีปัญหาเรื่องการบีบอัด อ่านไฟล์ในแผ่นกระเบื้องแถบหรือก้อนแทนที่จะเป็นทั้งหมดในครั้งเดียว แม้ว่าไฟล์นั้นจะถูกบีบอัดมันจะต้องถูกคลายการบีบอัดเมื่อคุณใช้มัน (ตัวอย่าง: หากไฟล์ 4GB ใช้ 2GB บนดิสก์เมื่อถูกบีบอัดไฟล์นั้นจะยังคงใช้ RAM 4GB เมื่อโหลดทั้งหมดเพื่อการประมวลผล ทางเลือกที่ประหยัดพื้นที่ที่คุณอาจต้องการที่จะมองเข้าไปในการจัดรูปแบบเบาบางสำหรับGeoTIFFs .
เควิน

1
@ShiuliPervin แม้ว่าฉันอาจจะเข้าใจผิดคำถามของคุณ การบีบอัดตัวเองมักจะใช้หน่วยความจำจำนวนมาก แต่ไม่ควรล้นระบบของคุณเว้นแต่ว่ามีข้อผิดพลาดในไลบรารีหรือคุณได้รับอาร์กิวเมนต์ที่ไม่ถูกต้อง หากคุณมีปัญหาเกี่ยวกับ JPEG เป็นประเภทการบีบอัดสำหรับ GeoTIFF อาจลอง LZMA หรือ DEFLATE
เควิน

0

สำหรับผู้ที่ใช้รุ่น GDAL ที่ใหม่กว่านี้ยังมีตัวเลือกการบีบอัดZStandard ( ZSTD ) (GDAL> = 2.3) และ lossy Limited Error Raster Compression ( LERC ) การบีบอัดตัวเลือก (GDAL> = 2.4)

โดยทั่วไปแล้วแม้ว่าจะZSTDมีความเร็วในการอ่านข้อมูลที่เร็วกว่าทั้งสองLZWและDEFLATEอัตราส่วนการบีบอัดที่คล้ายกันถึงแม้ว่ามันจะค่อนข้างช้าเมื่อเขียนไฟล์ (ขึ้นอยู่กับการตั้งค่าที่คุณใช้)

หากคุณไม่ได้ยุ่งเกี่ยวกับความแม่นยำของข้อมูล (เช่นการทำวิชวลไลเซชันมากกว่าการวิเคราะห์) นั่นLERCอาจเป็นตัวเลือกที่ดี มีการMAX_Z_ERRORตั้งค่าที่ช่วยให้คุณปรับแต่งเท่าใดคุณยินดีที่จะเสียสละความแม่นยำ เช่น a MAX_Z_ERROR=0.001หรือ 1 มม. ให้พื้นที่ 50% ในการวัดประสิทธิภาพเดียว (ดูที่การอ้างอิง )

ส่วนที่ดีที่สุดคือคุณสามารถใช้LERCร่วมกับการZSTDใช้งานได้COMPRESS=LERC_ZSTD! หรือถ้าคุณต้องการใช้ที่คุณสามารถทำได้DEFLATE COMPRESS=LERC_DEFLATEดูรายการทั้งหมดของชุดค่าผสม / การตั้งค่าได้ที่เอกสารทางภูมิศาสตร์ของ GDAL GeoTIFF อย่างเป็นทางการhttps://gdal.org/drivers/raster/gtiff.html#creation-options

รายละเอียดเพิ่มเติมและการเปรียบเทียบมาตรฐานสามารถพบได้ในการอ้างอิงที่มีค่านี้:

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.