Почему результат объединения нескольких растров так велик? [закрыто]

10

Я пытаюсь объединить 14 геотифов так:

введите описание изображения здесь

Каждый геотиф около 50 Мб. Мне нужен геотиф на выходе

Мой рабочий процесс:

gdalbuildvrt -input_file_list list.txt test.vrt 

(где мой список содержит название TIFS)

Затем :

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

Это работает, но в результате получился геотиф 13,3 Гб! Для 14 файлов, каждый по 50 Мб, я попытался указать геотиф 700 Мб, а не 13 Гб.

Я знаю, что 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 Мб каждый), собрал файл vrt и перевел его со сжатием LZW. Но выходной геотиф около 5 Гб.

Не могли бы вы сказать мне, как лучше всего выполнять эту работу и можно ли получить один геотиф размером 14 * 50 МБ?

Я не пробовал, но подумал о слиянии этих tifs в фотошопе, а затем о повторной привязке к верхним левым / нижним правым координатам. С этим рабочим процессом я думаю, что у меня будет 14 * 50 Мб, но я не уверен. И я хочу изучить лучшие практики GDAL, поэтому я не пробовал это на данный момент


Перейдем к укусам: если ввод - 8-битный, а экспорт - 32-битный по умолчанию, вы получите серьезные проблемы. поэтому убедитесь, что вы сохраняете определение байта как есть. И помните: полный тиф будет пробным. иметь 20x50mb, как TIFF всегда прямоугольный

Если я понимаю, число, которое я указал зеленым на этом скриншоте, должно быть одинаковым слева и справа?

биты

Ваше выходное изображение будет иметь больше пикселей, чем сумма ваших входных изображений, но это не объясняет большую разницу. Я предлагаю вам взглянуть на характеристики ваших изображений на основе gdalinfo, чтобы увидеть, какое сжатие используется, и проверить правильность экстентов.

Первоначально 14 tif по 50 Мб были 14 tif по 700 Мб, которые я обработал с помощью gdal_translate с параметром -co COMPRESS = JPEG. Я сжал растр, чтобы уменьшить количество мегабайт, но, может быть, это не очень хорошая идея?

Этот снимок экрана представляет информацию о 2-х градусах того же самого геотифа (01.tif), в левой части скриншота - это гдалинфо несжатого Gtiff размером 700 Мб, в конце справа тот же Gtiff с COMPRESS = JPEG, поэтому 50 Мб с разницей в зеленом:

не сжимать и сжимать gdalinfo файла 01.tif

По моему мнению, экстенты правильны, потому что в QGIS он совпадает с другим источником данных и спутниковых изображений.

* при условии, что ваши входные изображения имеют одинаковый размер, он составляет 20000 * 12000 пикселей на входные изображения, что является большим для изображения размером 50 Мб, возможно, вы пересекаете экстент вашей системы координат при создании мозаики. *

Я не уверен, что понимаю, что ты имеешь в виду под "пересекать степень". Но я попытался открыть свой 5 Гб LZW в QGIS, и размер хорош, потому что он совпадает с другим источником данных.

Ваш ответ заставляет меня понять, что у Gtiff разный размер. Как вы думаете, это может быть причиной увеличения размера при объединении? Потому что GDAL предпочитает файл того же размера. Я сделал gdalinfo для каждого Gtiff, чтобы получить его размер, разница между размерами Gtiff очень мала:

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 Byte -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 Гб. Важна ли глубина пикселя в моем случае? (HD фото карт, затем с географической привязкой, а не DEM)

Замечание 1: Преобразование ваших изображений в формат JPEG перед созданием vrt не помогает, и вы можете потерять данные.

Это не серьезно, если я потеряю немного информации. Я предпочитаю не терять это, конечно, но если мне нужно, это не проблема. Я был убежден, что если бы я работал с jpeg, то вывод был бы легче, но в качестве вывода неверно, когда вывод - Gtiff. Так что это не очень хорошее решение. Я отказываюсь от этого решения.

> Замечание 2: использование vrt полезно: вы уверены, что вам нужен GTiff?

Да, мне нужен Gtiff, потому что я должен импортировать его в мобильное приложение, для работы которого требуется ввод геотипов (я думаю, что приложение может также принимать геопространственный ввод PDF, но я никогда не работаю с ним, и я хочу понять мою проблему с гдал, потому что это не первый раз, когда он у меня есть).


Я попробовал -co tiled = да -co bigtiff = да -co компресс = jpeg -co фотометрический = ycbcr, и я попытался -co TILED = да -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512

Эти 2 команды работают хорошо, у меня размер ~ 700 Мб. Это именно то, что я ожидал.

Теперь у меня есть другая проблема: она не может быть быстро открыта QGIS. Мне нужно подождать 15 минут (но я ухожу, прежде чем QGIS успешно откроет ТИФ). Я не знаю почему. И в моем приложении для Android, он не работает (может быть, причина "tiled = yes"). Я должен прочитать некоторые документы самостоятельно.

grimdaemon
источник
Использовать -co tiled = да -co bigtiff = да -co compress = jpeg -co photometric = ycbcr
user30184

Ответы:

2

Ваше выходное изображение будет иметь больше пикселей, чем сумма ваших входных изображений, но это не объясняет большую разницу. Я предлагаю вам взглянуть на характеристики ваших изображений на основе gdalinfo, чтобы увидеть, какое сжатие используется, и проверить правильность экстентов. (при условии, что ваши входные изображения имеют одинаковый размер, он составляет 20000 * 12000 пикселей на входные изображения, что является большим для изображения размером 50 МБ, возможно, вы пересекаете экстент вашей системы координат при создании мозаики.) Затем вам следует посмотрите на глубину пикселей ваших изображений: если ваш ввод был в байтах, то вы должны оставить байты.

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

Замечание 1: Преобразование ваших изображений в формат JPEG перед сборкой vrt не помогает (это будет сжато до следующего шага), и вы можете потерять данные.

Замечание 2: использование vrt полезно: вы уверены, что вам нужен GTiff?

РЕДАКТИРОВАТЬ: чудо с размером ваших изображений не существует, но вы должны использовать мозаичный tif в качестве вывода, чтобы вы могли использовать сжатие JPEG с вашими большими данными (-co TILED = yes -co BLOCKXSIZE = 512 -co BLOCKYSIZE = 512 ). Если он остается слишком большим, единственное решение - использовать gdalwarp для повторной выборки с более низким разрешением.

radouxju
источник
Перейдем к укусам: если ввод - 8-битный, а экспорт - 32-битный по умолчанию, вы получите серьезные проблемы поэтому убедитесь, что вы сохраняете определение байта как есть. И помните: полный тиф будет пробным. иметь 20x50mb, как TIFF всегда прямоугольной
Риккардо
Где вы взяли 20000 х 12000? Выходные данные, показанные в вопросе, предполагают, что входное изображение имеет размер 79841 x 59955.
Злой гений
79841, 59955 - это размер входного vrt. но есть 5 строк и 4 столбца, поэтому я разделил ~ 80000 на 4 и ~ 60000 на 5. Как я уже сказал, это предполагает, что изображения имеют одинаковый размер и расположены так же, как на рисунке.
Radouxju
Я ответил, отредактировав свой оригинальный вопрос, я надеюсь, что мне нужно продолжить.
grimdaemon