14 votos

¿Por qué es tan grande el resultado de la fusión de varias tramas?

Intento fusionar 14 geotiff así :

enter image description here

Cada Geotiff ocupa unos 50 Mb. Necesito un geotiff en la salida

Mi flujo de trabajo :

gdalbuildvrt -input_file_list list.txt test.vrt 

(donde mi lista contiene el nombre de los tifs)

Entonces..:

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

¡Funciona, pero el resultado es un geotiff de 13,3 Gb ! Para 14 archivos, cada uno de 50 Mb, he intentado un geotiff de 700 Mb, no 13 Gb.

Sé que gdal no comprime por defecto, así que probé este comando :

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

Pero la "fusión" del archivo es demasiado grande para la compresión 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
...

Así que probé otro flujo de trabajo, y convertí todos mis tifs en jpeg (14 Mb cada uno), construí un archivo vrt y lo traduje con compresión LZW. Pero el geotiff de salida es de unos 5 Gb.

¿Podríais decirme cuál es la mejor práctica para hacer el trabajo, y si es posible obtener un geotiff de 14*50Mb?

No lo he probado, pero he pensado en fusionar estos tifs en photoshop, y luego volver a georeferenciarlos con las coordenadas superior izquierda/inferior derecha. Con este flujo de trabajo creo que tendré 14*50 Mb, pero no estoy seguro. Y quiero aprender gdal mejores prácticas por lo que no lo intente por el momento


llegando a bites: si input es tif con 8bit y export es 32bit por defecto tendras serios problemas. asi que asegurate de mantener tu byte definición de bytes. Y recuerda: el tif completo probablemente tendrá 20x 50mb como un tiff es siempre rectangular

Si lo he entendido bien, ¿el número que he señalado en verde en esta captura de pantalla tiene que ser el mismo a la izquierda y a la derecha?

bits

La imagen de salida tendrá más píxeles que la suma de las imágenes de entrada, pero esto no explica la gran diferencia. Le sugiero que usted mira las características de sus imágenes basadas en gdalinfo en gdalinfo para ver qué compresión se utiliza y comprobar que las extensiones son correctas. correctos.

Los 14 tifs de 50 Mb eran originalmente 14 tifs de 700 Mb que procesé con gdal_translate con -co COMPRESS=JPEG. Comprimí la trama para reducir el número de Mb, ¿pero quizá no fue buena idea?

Este pantallazo representa los 2 gdal info del mismo geotiff ( 01.tif) , a la izquierda del pantallazo esta el gdalinfo del Gtiff no comprimido de 700 Mb, al final a la derecha el mismo Gtiff con COMPRESS=JPEG, o sea 50 Mb, con el diff en verde:

non-compress and compress gdalinfo of the 01.tif file

Según yo, las extensiones son correctas porque en qgis coincide con otra fuente de datos e imágenes de satélite.

*suponiendo que sus imágenes de entrada tienen el mismo tamaño, hace 20000 * 12000 píxeles por imágenes de entrada, que es grande para una imagen de 50 Mb, tal vez usted está cruzando la extensión de su sistema de coordenadas cuando se crea el mosaico.*

No estoy seguro de entender lo que quiere decir con "cruzar el límite". Pero he intentado abrir mi 5 Gb LZW en QGIS, y la extensión es buena, porque coincide con otra fuente de datos.

Tu respuesta me hace darme cuenta de que los Gtiff no tienen el mismo tamaño, ¿crees que puede ser la causa de que aumente el tamaño al fusionarse? Porque gdal prefiere archivos del mismo tamaño. Hice un gdalinfo en cada Gtiff para obtener su tamaño, hay una diferencia muy pequeña entre el tamaño de 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

Entonces deberías mirar la profundidad en píxeles de tus imágenes : si tu entrada estuviera en Bytes, >entonces deberías mantener los bytes. gdal_translate -of Gtiff -ot Byte -co COMPRESS=LZW prueba.vrt prueba.tif

He probado este comando pero el gdal me dice que se ha excedido el tamaño del 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.

Pero si tengo que crear un tiff grande, no me resuelve el problema porque supera los 4 Gb. ¿ Es importante la profundidad de pixel en mi caso ? ( Foto HD de mapas, luego georeferenciada, no DEM)

Observación 1 : Convertir las imágenes a jpeg antes de crear un vrt no ayuda y puede perder datos.

No es grave si pierdo un poco de información. Prefiero no perderla, por supuesto, pero si tengo que hacerlo no hay problema. Estaba convencido de que la salida sería más ligera si trabajaba con jpeg, pero como conclusión, no es cierto cuando la salida es Gtiff. Así que esta no es una buena solución. Renuncio a esta solución.

> Observación 2 : utilizar un vrt es útil: ¿está seguro de que necesita GTiff?

Sí, necesito un Gtiff, porque tengo que importarlo en una aplicación móvil que necesita geotiff de entrada para trabajar ( creo que la aplicación puede tomar geoespacial pdf de entrada también, pero nunca he trabajado con él, y quiero entender mi problema con gdal, porque no es la primera vez que lo tengo).


He probado -co tiled=yes -co bigtiff=yes -co compress=jpeg -co photometric=ycbcr y he probado -co TILED=yes -co BLOCKXSIZE=512 -co BLOCKYSIZE=512

Estos 2 comandos funcionan bien, tengo un tamaño de ~700 Mb. Es exactamente lo que esperaba.

Ahora tengo otro problema : no se puede abrir rápidamente por QGIS. Tengo que esperar 15 minutos ( pero salgo antes de que QGIS abra el tif con éxito). No se por que. Y en mi aplicación Android, no funciona (tal vez causa de "tiled=yes"). Tengo que leer algunos doc por mi cuenta.

0 votos

Utilice -co tiled=yes -co bigtiff=yes -co compress=jpeg -co photometric=ycbcr

4voto

xenny Puntos 670

La imagen de salida tendrá más píxeles que la suma de las imágenes de entrada, pero esto no explica la gran diferencia. Te sugiero que mires las características de tus imágenes en gdalinfo para ver qué compresión se utiliza y compruebes que las extensiones son correctas. (asumiendo que tus imagenes de entrada tienen el mismo tamaño, hace 20000 * 12000 pixeles por imagen de entrada, lo cual es grande para una imagen de 50 Mb, quizas estas cruzando la extension de tu sistema de coordenadas cuando creas el mosaico). Entonces deberias mirar la profundidad de pixel de tus imagenes : si tu entrada estaba en Bytes, entonces deberias mantener bytes.

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

Observación 1 : Convertir tus imágenes a jpeg antes de crear un vrt no ayuda (se descomprimirán antes del siguiente paso) y podrías perder datos.

Observación 2 : utilizar un vrt es útil: ¿estás seguro de que necesitas GTiff?

EDIT: No hay ningún milagro con el tamaño de tus imágenes, pero deberías usar un tif en mosaico como salida para poder usar la compresión jpeg con tus datos grandes (-co TILED=yes -co BLOCKXSIZE=512 -co BLOCKYSIZE=512 ). Si sigue siendo demasiado grande, la única solución es utilizar gdalwarp para remuestrear a una resolución más baja.

1 votos

Yendo al grano: si la entrada es tif con 8bit y la exportación es 32bit por defecto tendrás serios problemas. así que asegúrate de mantener tu definición de bytes tal cual. Y recuerda: el tif completo tendrá probablemente 20x 50mb ya que un tiff es siempre rectangular.

0 votos

¿De dónde has sacado 20000 x 12000? El resultado mostrado en la pregunta sugiere que la imagen de entrada es de 79841 x 59955.

0 votos

79841, 59955 es el tamaño del vrt de entrada. pero hay 5 filas y 4 columnas, así que he dividido ~80000 entre 4 y ~60000 entre 5. Como he dicho, esto supone que las imágenes tienen el mismo tamaño y están colocadas como en la figura.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X