Найпростішим способом вирішити цю проблему було використання віртуального формату GDAL . Цей формат дозволив мені розглядати весь набір зображень як єдиний об’єкт зображення та перетворювати його в три відносно прості дії.
Створення віртуального набору даних
GDAL (включаючи файли бінарних файлів Windows GISInternals Тамаша Секереса та останні версії OSGeo4W ) включає утиліту під назвою gdalbuildvrt, яка може бути використана для створення початкового віртуального набору даних.
Один з простих способів цього - додати всі свої зображення до текстового файлу, а потім використовувати цей текстовий файл як вхід до gdalbuildvrt. Ось приклад (вам потрібно буде повернути другу команду в один рядок):
dir /b *.tif > my_images.txt
gdalbuildvrt
-hidenodata
-vrtnodata "255 255 255"
-resolution highest
-input_file_list my_images.txt
my_image.vrt
Це дасть вам файл XML, який ви можете розглядати як єдине зображення для всіх операцій GDAL. Він також внутрішньо представляє нодані як білі, але приховує визначення нодату від інструментів, що читаються з неї.
Створення перегляду впорядкованих даних
Далі ви виконаєте перекомпонування та виведення оглядового зображення. Це можна зробити за допомогою gdal_translate або gdalwarp . Для будь-якого з них пам’ятайте, що отриманий розмір буде width * height * 3
(кількість 8 бітових діапазонів) байт. Якщо це буде більше 4 Гб, ви захочете переглянути параметри GeoTIFF для синтаксису, щоб вказати BigTIFF як свій вихід (-co "BIGTIFF = ТАК").
Для gdal_translate вам потрібно буде визначити розміри віртуального зображення за допомогою зручної команди gdalinfo . Візьміть ці розміри і розділіть кожен на деякий послідовний коефіцієнт, щоб визначити вихідну ширину та висоту вашого файлу в пікселях.
Команда буде виглядати приблизно так (в одному рядку):
gdal_translate
-outsize 53120 14000
-co "TILED=YES"
-co "PROFILE=GEOTIFF"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Для gdalwarp вам потрібно знати піксельний розмір; в цьому випадку я використовую .5 метр. Ви також захочете подзвонити за методом перекомпонування. Я віддаю перевагу кубічній лінії для оглядів ортофото. Це м'якше, але ви не збираєтесь використовувати їх до повного дозволу, і, на мій досвід, він створює більш стисливий образ, якщо ви використовуєте щось на зразок JPEG або ECW.
gdalwarp
-r cubicspline
-of GTiff
-dstnodata "255 255 255"
-tr 0.5 0.5
-co "PROFILE=GEOTIFF"
-co "BIGTIFF=YES"
-co "TILED=YES"
-co "BLOCKXSIZE=256"
-co "BLOCKYSIZE=256"
my_image.vrt
my_image.tif
Ви також можете розглянути можливість використання параметрів стиснення JPEG для цих перекомпонованих оглядів GeoTIFF; він значно скорочує вихідний файл із ( за Франком ) лише граничним покаранням продуктивності.
-co "COMPRESS=JPEG"
-co "JPEG_QUALITY=80"
-co "PHOTOMETRIC=YCBCR"
Огляди
Ви також захочете запустити зручну команду gdaladdo над отриманим зображенням, щоб створити внутрішні "піраміди", щоб запити на нижчу роздільну здатність, ніж повні розміри зображення, могли задовольнятися підмножиною даних. Збільшення продуктивності в більшості випадків більше, ніж коштує місця на диску. Ви захочете пограти з рівнями, які ви тут використовуєте; для дуже великих зображень ви можете залишити деякі. Команда gdaladdo виглядає приблизно так:
gdaladdo
-r average
my_image.tif
2 4 8 16 32 64 128 256
Я б запропонував експериментувати з цими рівнями для досягнення оптимальної продуктивності. Ви можете виявити, що інший інтервал перекомпонування краще для вашої програми або, залежно від розміру зображення, ви можете скинути деякі більш високі цифри (або що більше потрібно)
Крім того, якщо ви генеруєте зовнішній огляд (використовуючи параметр -ro), подумайте про додавання рядків конфігурації стиснення JPEG:
--config COMPRESS_OVERVIEW JPEG
--config PHOTOMETRIC_OVERVIEW YCBCR
--config INTERLEAVE_OVERVIEW BAND
(Я вважаю, що вони успадковані від батьківського GeoTIFF для вбудованих оглядів)
Примітки
Зіткнувшись з цією проблемою, я поцікавився на каналі #gdal на freenode.irc.net. Це дивовижний ресурс, і я повністю вдячний Говарду Батлеру, Френку Вармердаму та навіть Руа за допомогу мені у цьому.