เหตุใดผลการรวมหลายแรสเตอร์จึงใหญ่มาก [ปิด]


10

ฉันพยายามรวม 14 geotiff แบบนี้:

ป้อนคำอธิบายรูปภาพที่นี่

geotiff แต่ละอันมีค่าประมาณ 50Mb ฉันต้องการ geotiff ที่เอาต์พุต

เวิร์กโฟลว์ของฉัน:

gdalbuildvrt -input_file_list list.txt test.vrt 

(ที่รายการของฉันมีชื่อของ tifs)

จากนั้น:

gdal_translate -of Gtiff test.vrt test.tif
Input file size is 79841, 59955

มันใช้งานได้ แต่ผลที่ได้คือ geotiff ที่ 13,3 Gb! สำหรับไฟล์ 14 ไฟล์แต่ละ 50 Mb ฉันพยายาม Geotiff ที่ 700 Mb ไม่ใช่ 13 Gb

ฉันรู้ว่า gdal ไม่บีบอัดตามค่าเริ่มต้นดังนั้นฉันลองคำสั่งนี้:

gdal_translate -of Gtiff -co COMPRESS=JPEG test.vrt test_compressed.tif

แต่ "ผสาน" ของไฟล์ใหญ่เกินไปสำหรับการบีบอัด JPEG:

Input file size is 79841, 59955
0ERROR 1: JPEGPreEncode:Strip/tile too large for JPEG
ERROR 1: WriteEncodedTile/Strip() failed.
ERROR 1: JPEGPreEncode:Strip/tile too large for JPEG
ERROR 1: WriteEncodedTile/Strip() failed.
ERROR 1: An error occured while writing a dirty block
...

ดังนั้นฉันจึงลองเวิร์กโฟลว์อื่นและแปลงไฟล์ tif ทั้งหมดของฉันเป็น jpeg (14 Mb แต่ละอัน) สร้างไฟล์ vrt และแปลด้วยการบีบอัด LZW แต่พิกัดผลผลิตมีค่าประมาณ 5 Gb

คุณช่วยบอกฉันได้ว่าวิธีปฏิบัติที่ดีที่สุดในการทำงานคืออะไรและถ้าเป็นไปได้ที่จะได้รับ geotiff 14 * 50Mb หนึ่งอัน?

ฉันไม่ได้ลอง แต่ฉันคิดถึงการรวม tifs นี้ใน photoshop จากนั้นทำการคำนวณตำแหน่งทางภูมิศาสตร์ใหม่ด้วยพิกัดบนซ้าย / ขวาล่าง ด้วยเวิร์กโฟลว์นี้ฉันคิดว่าฉันจะมี 14 * 50 Mb แต่ฉันไม่แน่ใจ และฉันต้องการเรียนรู้หลักปฏิบัติที่ดีที่สุดของ gdal ดังนั้นฉันจึงไม่ได้ลองสักครู่


การกัด: ถ้าอินพุตเป็น tif ด้วย 8 บิตและการส่งออกเป็น 32 บิตโดยค่าเริ่มต้นคุณจะพบปัญหาร้ายแรง เพื่อให้แน่ใจว่าคุณใช้คำจำกัดความของไบต์ตามที่เป็นอยู่ และจำไว้ว่า tif เต็มจะเป็นปัญหา มี 20x50mb เป็น tiff เป็นรูปสี่เหลี่ยมผืนผ้าเสมอ

ถ้าฉันเข้าใจตัวเลขที่ฉันชี้เป็นสีเขียวบนสกรีนช็อตนี้จะต้องเหมือนกันทางซ้ายและขวาใช่ไหม

เกร็ด

ภาพที่ส่งออกของคุณจะมีพิกเซลมากกว่าผลรวมของภาพที่คุณป้อน แต่สิ่งนี้ไม่ได้อธิบายความแตกต่างที่มีขนาดใหญ่ ฉันขอแนะนำให้คุณดูที่ลักษณะของภาพของคุณตาม gdalinfo เพื่อดูว่ามีการใช้การบีบอัดใดและตรวจสอบว่าส่วนขยายนั้นถูกต้อง

14 tifs จาก 50 Mb เดิมที 14 tifs ของ 700 Mb ที่ฉันประมวลผลด้วย gdal_translate ด้วย -co COMPRESS = JPEG ฉันบีบอัดแรสเตอร์เพื่อลดจำนวน Mb แต่อาจไม่ใช่ความคิดที่ดีใช่ไหม

ภาพหน้าจอนี้แสดงถึงข้อมูล 2 gdal ของ geotiff เดียวกัน (01.tif) ที่ด้านซ้ายของภาพหน้าจอคือ gdalinfo ของ Gtiff ที่ไม่บีบอัด 700 Mb สิ้นสุด Gtiff เดียวกันด้วย COMPRESS = JPEG ดังนั้น 50 Mb, โดยความต่างของสีเขียว:

ไม่ใช่การบีบอัดและบีบอัด gdalinfo ของไฟล์ 01.tif

ตามที่ฉันขอบเขตถูกต้องเพราะใน qgis มันตรงกับแหล่งข้อมูลอื่นและภาพจากดาวเทียม

* สมมติว่าภาพอินพุตของคุณมีขนาดเท่ากันมันจะทำให้ 20,000 * 12000 พิกเซลต่อภาพอินพุตซึ่งมีขนาดใหญ่สำหรับภาพ 50 Mb บางทีคุณอาจข้ามขอบเขตของระบบพิกัดเมื่อคุณสร้างโมเสค *

ฉันไม่แน่ใจว่าจะเข้าใจสิ่งที่คุณหมายถึงโดย "ข้ามขอบเขต" แต่ฉันพยายามเปิด 5 Gb LZW ของฉันใน QGIS และขอบเขตนั้นดีเพราะมันตรงกับแหล่งข้อมูลอื่น ๆ

คำตอบของคุณทำให้ฉันรู้ว่า Gtiff มีขนาดไม่เท่ากันคุณคิดว่าอาจเป็นสาเหตุของการเพิ่มขนาดเมื่อรวมกันหรือไม่ เพราะ gdal ชอบไฟล์ที่มีขนาดเท่ากัน ฉันสร้าง gdalinfo ใน Gtiff แต่ละอันเพื่อให้ได้ขนาดของมันมีความแตกต่างเล็กน้อยระหว่างขนาดของ Gtiffs:

02.tif Size is 19956, 11981
03.tif Size is 19959, 11993
04.tif Size is 19961, 11992
05.tif Size is 19958, 11993
06.tif Size is 19958, 11990
07.tif Size is 19956, 11984
08.tif Size is 19956, 11993
09.tif Size is 19958, 11993
10.tif Size is 19958, 11989
11.tif Size is 19958, 11985
12.tif Size is 19958, 11993
13.tif Size is 19959, 11993
14.tif Size is 19960, 11994

จากนั้นคุณควรดูที่ความลึกพิกเซลของภาพของคุณ: หากอินพุตของคุณอยู่ในหน่วยไบต์> จากนั้นคุณควรเก็บไบต์ gdal_translate -of Gtiff -ot ไบต์ -co COMPRESS = LZW test.vrt test.tif

ฉันลองคำสั่งนี้ แต่ gdal บอกฉันว่าขนาดของ tiff เกิน

Input file size is 79841, 59955
0...10...20...30...40...50..ERROR 1: TIFFAppendToStrip:Maximum TIFF file size exceeded. Use BIGTIFF=YES creation option.
ERROR 1: WriteEncodedTile/Strip() failed.

แต่ถ้าฉันต้องสร้าง tiff ใหญ่มันก็ไม่ได้แก้ปัญหาของฉันเพราะมันเป็นมากกว่า 4 Gb ความลึกของพิกเซลมีความสำคัญในกรณีของฉันหรือไม่ (รูปภาพ HD ของแผนที่จากนั้นอ้างอิงทางภูมิศาสตร์ไม่ใช่ DEM)

หมายเหตุ 1: การแปลงภาพเป็น jpeg ก่อนการสร้าง vrt ไม่ได้ช่วยอะไรและคุณอาจสูญเสียข้อมูล

ไม่ร้ายแรงหากฉันปล่อยข้อมูลเล็กน้อย แน่นอนว่าฉันไม่ชอบที่จะทำแบบนี้ แต่ถ้าฉันต้องทำมันก็ไม่ใช่ปัญหา ฉันเชื่อว่าผลลัพธ์จะเบาลงหากฉันทำงานกับ jpeg แต่โดยสรุปแล้วมันไม่เป็นความจริงเมื่อผลผลิตเป็น Gtiff ดังนั้นนี่ไม่ใช่ทางออกที่ดี ฉันยอมแพ้วิธีนี้

> หมายเหตุ 2: การใช้ vrt มีประโยชน์: คุณแน่ใจหรือไม่ว่าคุณต้องการ GTiff

ใช่ฉันต้องการ Gtiff เพราะฉันต้องนำเข้ามันในแอปพลิเคชันมือถือซึ่งจำเป็นต้องใช้อินพุต geotiff ในการทำงาน (ฉันคิดว่าแอปสามารถใช้อินพุต PDF geospatial ด้วย แต่ฉันไม่เคยทำงานด้วยและฉันต้องการเข้าใจปัญหาของฉันด้วย gdal, เพราะมันไม่ใช่ครั้งแรกที่ฉันมี)


ฉันพยายาม -co tiled = ใช่ -co bigtiff = ใช่ -co compress = jpeg -co photometric = ycbcr และฉันลอง -co TILED = ใช่ -CO BLOCKXSIZE = 512 -co BLOCKYSIZE = 512

2 คำสั่งเหล่านี้ทำงานได้ดีฉันมีขนาด ~ 700 Mb มันเป็นสิ่งที่ฉันคาดไว้

ตอนนี้ฉันมีปัญหาอื่น: QGIS ไม่สามารถเปิดได้อย่างรวดเร็ว ฉันต้องรอ 15 นาที (แต่ฉันออกก่อน QGIS เปิด tif สำเร็จ) ฉันไม่รู้ว่าทำไม และในแอพ Android ของฉันมันไม่ทำงาน (อาจเป็นสาเหตุของ "tiled = ใช่") ฉันต้องอ่านเอกสารด้วยตัวเอง


ใช้ -co tiled = ใช่ -co bigtiff = ใช่ -co compress = jpeg -co photometric = ycbcr
user30184

คำตอบ:


2

ภาพที่ส่งออกของคุณจะมีพิกเซลมากกว่าผลรวมของภาพที่คุณป้อน แต่สิ่งนี้ไม่ได้อธิบายความแตกต่างที่มีขนาดใหญ่ ฉันขอแนะนำให้คุณดูที่ลักษณะของภาพของคุณตาม gdalinfo เพื่อดูว่ามีการใช้การบีบอัดใดและตรวจสอบว่าส่วนขยายนั้นถูกต้อง (สมมติว่าภาพอินพุตของคุณมีขนาดเท่ากันมันจะทำให้ 20,000 * 12000 พิกเซลต่อภาพอินพุตซึ่งมีขนาดใหญ่สำหรับภาพ 50 Mb บางทีคุณอาจข้ามขอบเขตของระบบพิกัดเมื่อคุณสร้างโมเสค) ดูที่ความลึกพิกเซลของภาพของคุณ: ถ้าอินพุตของคุณเป็นไบต์แล้วคุณควรเก็บไบต์

gdal_translate -of Gtiff -ot Byte -co COMPRESS=LZW test.vrt test.tif 

หมายเหตุ 1: การแปลงภาพของคุณเป็น jpeg ก่อนการสร้าง vrt ไม่ได้ช่วย (มันจะไม่ถูกบีบอัดก่อนขั้นตอนถัดไป) และคุณอาจสูญเสียข้อมูล

หมายเหตุ 2: การใช้ vrt มีประโยชน์: คุณแน่ใจหรือไม่ว่าคุณต้องการ GTiff

แก้ไข: ไม่มีปาฏิหาริย์ที่มีขนาดภาพของคุณ แต่คุณควรใช้ tif แบบเรียงต่อกันเพื่อให้คุณสามารถใช้การบีบอัด jpeg กับข้อมูลขนาดใหญ่ของคุณ (-co TILED = ใช่ -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512 ) หากยังคงมีขนาดใหญ่เกินไปทางออกเดียวคือให้ใช้ gdalwarp เพื่อสุ่มตัวอย่างอีกครั้งด้วยความละเอียดที่ต่ำกว่า


การกัด: ถ้าอินพุตเป็น tif ด้วย 8 บิตและการส่งออกเป็น 32 บิตโดยค่าเริ่มต้นคุณจะพบปัญหาร้ายแรง เพื่อให้แน่ใจว่าคุณใช้คำจำกัดความของไบต์ตามที่เป็น และจำไว้ว่า tif เต็มจะเป็นปัญหา มี 20x50mb เป็น tiff เป็นรูปสี่เหลี่ยมผืนผ้าเสมอ
Riccardo

คุณได้รับ 20,000 จากที่ไหน การส่งออกที่แสดงในคำถามที่จะขอแนะนำให้ภาพที่นำเข้าคือ 79,841 x 59955.
Evil Genius

79841, 59955 คือขนาดของอินพุต vrt แต่มี 5 แถวและ 4 คอลัมน์ดังนั้นฉันจึงแบ่ง ~ 80000 คูณ 4 และ ~ 60000 คูณ 5 ตามที่ฉันบอกนี่ถือว่าสมมติว่าภาพมีขนาดเท่ากันและอยู่ในตำแหน่งเหมือนรูป
radouxju

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