Mengapa hasil penggabungan banyak raster begitu besar? [Tutup]

10

Saya mencoba menggabungkan 14 geotiff seperti ini:

masukkan deskripsi gambar di sini

Setiap geotiff sekitar 50MB. Saya perlu geotiff di output

Alur kerja saya:

gdalbuildvrt -input_file_list list.txt test.vrt 

(tempat daftar saya berisi nama tif)

Kemudian :

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

Ini bekerja, tetapi hasilnya adalah geotiff 13,3 Gb! Untuk 14 file, masing-masing 50 Mb, saya mencoba geotiff 700 Mb, bukan 13 Gb.

Saya tahu bahwa gdal tidak dikompres secara default, jadi saya mencoba perintah ini:

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

Tetapi "gabungan" file terlalu besar untuk kompresi 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
...

Jadi saya mencoba alur kerja lain, dan mengkonversi semua tif saya di jpeg (masing-masing 14 Mb), membangun file vrt dan menerjemahkannya dengan kompresi LZW. Tetapi geotiff keluaran sekitar 5 Gb.

Bisakah Anda memberi tahu saya apa praktik terbaik untuk melakukan pekerjaan itu, dan jika mungkin untuk mendapatkan satu geotiff 14 * 50MB?

Saya tidak mencobanya, tetapi saya berpikir untuk menggabungkan tif ini di photoshop, kemudian melakukan georeferensi dengan koordinat kiri atas / kanan bawah. Dengan alur kerja ini saya pikir saya akan memiliki 14 * 50 Mb, tapi saya tidak yakin. Dan saya ingin belajar praktik terbaik gdal jadi saya tidak mencobanya untuk saat ini


datang ke gigitan: jika input tif dengan 8bit dan ekspor 32bit secara default Anda akan mendapatkan masalah serius. jadi pastikan Anda menjaga definisi byte Anda apa adanya. Dan ingat: tif penuh akan prob. memiliki 20x 50mb sebagai tiff selalu persegi panjang

Jika saya mengerti, angka yang saya tunjuk hijau pada screenshot ini harus sama di kiri dan di kanan?

bit

Gambar output Anda akan memiliki lebih banyak piksel daripada jumlah gambar input Anda, tetapi ini tidak menjelaskan perbedaan besar. Saya menyarankan agar Anda melihat karakteristik gambar Anda berdasarkan gdalinfo untuk melihat kompresi apa yang digunakan dan memeriksa apakah luasan sudah benar.

14 tif dari 50 Mb pada awalnya 14 tif dari 700 Mb yang saya proses dengan gdal_translate dengan -co COMPRESS = JPEG. Saya mengompres raster untuk mengurangi jumlah Mb, tapi mungkin itu bukan ide yang baik?

Tangkapan layar ini mewakili 2 gdal info dari geotiff yang sama (01.tif), di sebelah kiri tangkapan layar adalah gdalinfo dari Gtiff non-kompresi dari 700 Mb, dan kanan Gtiff yang sama dengan COMPRESS = JPEG, jadi 50 Mb, dengan diff in green:

non-kompres dan kompres gdalinfo dari file 01.tif

Menurut saya, luasannya benar karena dalam qgis cocok dengan sumber data lain dan citra satelit.

* Dengan asumsi gambar input Anda memiliki ukuran yang sama, itu membuat 20000 * 12000 piksel per gambar input, yang besar untuk gambar 50 Mb, mungkin Anda melewati batas sistem koordinat Anda saat membuat mosaik. *

Saya tidak yakin untuk memahami apa yang Anda maksud dengan "melewati batas". Tapi saya mencoba membuka 5 Gb LZW saya di QGIS, dan luasnya bagus, karena cocok dengan sumber data lainnya.

Jawaban Anda membuat saya sadar bahwa Gtiff tidak memiliki ukuran yang sama, apakah Anda pikir itu bisa menjadi penyebab meningkatnya ukuran ketika digabung? Karena gdal lebih suka file dengan ukuran yang sama. Saya membuat gdalinfo di setiap Gtiff untuk mendapatkan ukurannya, ada perbedaan yang sangat kecil antara ukuran 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

Maka Anda harus melihat kedalaman piksel gambar Anda: jika input Anda dalam Bytes,> maka Anda harus menyimpan byte. gdal_translate -of Gtiff -ot Byte -co COMPRESS = LZW test.vrt test.tif

Saya mencoba perintah ini tetapi gdal mengatakan kepada saya bahwa ukuran tiff terlampaui.

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.

Tetapi jika saya harus membuat tiff besar, itu tidak menyelesaikan masalah saya karena lebih dari 4 Gb. Apakah kedalaman piksel penting dalam kasus saya? (Foto HD peta, lalu georeferensi, bukan DEM)

Catatan 1: Mengubah gambar Anda ke jpeg sebelum membangun vrt tidak membantu dan Anda mungkin kehilangan data.

Tidak serius jika saya kehilangan sedikit informasi. Saya lebih suka untuk tidak kehilangan itu, tentu saja, tetapi jika saya harus itu tidak masalah. Saya yakin bahwa output akan lebih ringan jika saya bekerja dengan jpeg, tetapi sebagai kesimpulan, itu tidak benar ketika outputnya adalah Gtiff. Jadi ini bukan solusi yang baik. Saya menyerah solusi ini.

> Catatan 2: menggunakan vrt sangat membantu: Anda yakin perlu GTiff?

Ya, saya memerlukan Gtiff, karena saya harus mengimpornya dalam aplikasi seluler yang memerlukan input geotiff agar berfungsi (saya pikir aplikasi tersebut dapat mengambil input pdf geospasial juga, tetapi saya tidak pernah bekerja dengannya, dan saya ingin memahami masalah saya dengan Gdal, karena ini bukan pertama kalinya saya memilikinya).


Saya mencoba -co ubin = ya -co bigtiff = ya -co kompres = jpeg -co fotometrik = ycbcr dan saya mencoba -co TILED = ya -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512

2 perintah ini bekerja dengan baik, saya memiliki ukuran ~ 700 Mb. Persis seperti yang saya harapkan.

Sekarang saya punya masalah lain: tidak bisa dibuka dengan cepat oleh QGIS. Saya harus menunggu 15 menit (tapi saya berhenti sebelum QGIS berhasil membuka tif). Saya tidak tahu kenapa. Dan di aplikasi android saya, itu tidak berfungsi (mungkin karena "tiled = yes"). Saya harus membaca beberapa dokumen sendiri.

grimdaemon
sumber
Gunakan -co ubin = ya -co bigtiff = ya -co kompres = jpeg -co fotometrik = ycbcr
user30184

Jawaban:

2

Gambar output Anda akan memiliki lebih banyak piksel daripada jumlah gambar input Anda, tetapi ini tidak menjelaskan perbedaan besar. Saya menyarankan agar Anda melihat karakteristik gambar Anda berdasarkan gdalinfo untuk melihat kompresi apa yang digunakan dan memeriksa apakah luasan sudah benar. (dengan asumsi gambar input Anda memiliki ukuran yang sama, itu membuat 20000 * 12000 piksel per gambar input, yang besar untuk gambar 50 Mb, mungkin Anda melewati batas sistem koordinat Anda saat membuat mosaik.) Maka Anda harus lihat kedalaman piksel gambar Anda: jika input Anda dalam Bytes, maka Anda harus menyimpan byte.

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

Catatan 1: Mengubah gambar Anda ke jpeg sebelum membangun vrt tidak membantu (itu akan dikompresi sebelum langkah berikutnya) dan Anda mungkin kehilangan data.

Komentar 2: menggunakan vrt bermanfaat: apakah Anda yakin bahwa Anda membutuhkan GTiff?

EDIT: Tidak ada keajaiban dengan ukuran gambar Anda, tetapi Anda harus menggunakan tif ubin sebagai output sehingga Anda dapat menggunakan kompresi jpeg dengan data besar Anda (-co TILED = yes -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512 ). Jika tetap terlalu besar, satu-satunya solusi adalah menggunakan gdalwarp untuk melakukan resample pada resolusi yang lebih rendah.

radouxju
sumber
datang ke gigitan: jika input tif dengan 8bit dan ekspor 32bit secara default Anda akan mendapatkan masalah serius. jadi pastikan Anda menjaga definisi byte Anda apa adanya. Dan ingat: tif penuh akan prob. memiliki 20x 50mb sebagai tiff selalu persegi panjang.
Riccardo
Dari mana Anda mendapatkan 20000 x 12000? Output yang ditunjukkan dalam pertanyaan akan menyarankan gambar input adalah 79841 x 59955.
Evil Genius
79841, 59955 adalah ukuran dari input vrt. tetapi ada 5 baris dan 4 kolom, jadi saya membagi ~ 80000 dengan 4 dan ~ 60000 dengan 5. Seperti yang saya katakan, ini mengasumsikan bahwa gambar memiliki ukuran yang sama dan diposisikan seperti pada gambar.
radouxju
Saya menjawab dengan mengedit pertanyaan asli saya, saya harap saya harus melanjutkan.
grimdaemon