Лучший способ обрезать большой растровый файл ECW?

9

Я пытаюсь обрезать большой ECW (подробности ниже), но растровый файл слишком велик для полной обработки.

Некоторые детали ECW ниже

Драйвер: ECW / ERDAS сжатые вейвлеты (SDK 5.0)

размер файла: 50 ГБ Размер 450000, 565081 Размер пикселя: 0,15 0,15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 VERSION = 2 Количество полос: 4

Область, которую я хочу обрезать, составляет примерно 1/5 от исходного файла.

Вот методы, которые я опробовал безуспешно:

  1. Использовал Arcgis для сохранения ecw в tiff / другие форматы ... (я быстро сдался)

  2. Использовал Qgis и его инструмент обрезки ... создание файла застряло на 40%.

  3. Использовал gdal_translate из OSGeo4W с другими опциями, кроме Qgis. (Попробовал подумать, что МОЖЕТ освободить память, не используя Qgis)

  4. Использовал gdal_retile, думая, что я бы разрезал изображение на части и взял то, что хотел. Команда "gdal_retile -ps 10000 10000 -of ecw -tileIndex tile.shp -targetDir input.ecw Это сбой еще быстрее"

У кого-нибудь есть идея?

Для информации я запускаю Windows 7 64bit на i5-3470 3,2 ГГц с 16 ГБ оперативной памяти.

синий
источник

Ответы:

5

Другие идеи, которые вы могли бы попробовать:

  1. gdal_translate с ключом -srcwin
  2. gdalwarp с ключами -cutline и -crop_to_cutline и -wm. Последний из них определяет память для кэширования и может помочь вам справиться с проблемами, возникшими при использовании Clipper в QGIS (поскольку это по сути та же функция)
  3. Растровый калькулятор QGIS, устанавливающий экстент в нужную область (проще, чем клипер).
  4. SAGA-> Срезать сетку с полигоном - кто знает, возможно, это более эффективно использует память.
  5. Кодируйте решение, используя Python и Numpy / SciPy, чтобы прочитать только часть набора растра в память и сохранить его.

Я подозреваю, что выполнение очень простого кадрирования по экстенту (с помощью растрового калькулятора или переключателя -srcwin в gdal_translate) будет менее требовательным к памяти, чем обрезка с помощью многоугольника, поскольку у вас нет проверок и преобразований геометрии. Вариант 5 должен использовать наименьшее количество памяти, поскольку вы читаете только то, что вам нужно. Посмотрите этот урок, если вам нужно «как» (адаптировать бит при чтении и записи по блокам).

MappaGnosis
источник
Спасибо за ответ! Я попробую SAGA, и если это не сработает, я попробую Numpy.
Синий
5

Вы можете вырезать его напрямую с помощью инструмента gdal gdal_translate, если вы знаете координаты вашей области интересов, если она имеет географическую привязку:

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Если не использовать -srswinфлаг, как это:

gdal_translate -srcwin [xoff yoff xsize ysize] infile outfile.

Другой вариант - создать «виртуальный» растр (из нескольких килобайт), который будет указывать на ваш начальный набор данных, с помощью gdalbuildvrt .

gdalbuildvrt -te [xmin ymin xmax ymax] infile outfile.vrt

К сожалению, вам понадобится файл с географической привязкой для использования gdalbuildvrt.

После клипа не забудьте создать пирамиды для удобства просмотра. Следующая команда создаст внешние пирамиды, сжатые по алгоритму DEFLATE (без потерь):

gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16

В качестве последнего шага вы также можете рассчитать статистику, чтобы избежать некоторых глупых проблем с конкретной коммерческой программой:

gdalinfo -stats outfile
nickves
источник
Спасибо за ответ, Никвес. Я создал виртуальный растр и запустил <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </ code> Я не слишком уверен, почему я получил следующее сообщение об ошибке ОШИБКА 1: Невозможно создать файл TIFF из-за отсутствия кодек для DEFLATE. Обзор здания не удался.
Голубой
Проверьте ошибки qgis-bug: 8782 и osge4w-bug: 382, если они описывают ваш случай. А пока попробуйте создать обзоры без каких-либо алгоритмов сжатия или выберите другой .
Nickves
похоже, у меня это работало в 2 этапа: gdaladdo -ro input.vrt 2 4 8 16тогда gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE input.vrt 2 4 8 16. Моя цель - получить ECW, поэтому я попытался gdal_translate -of ECW input.vrt output.ecw получить следующую ошибку:0ERROR 6: GDALDriver::Create() ... no create method implemented for this format.
Blue
@blue ECW является проприетарным форматом и требует особого отношения. Пожалуйста, сначала проверьте, может ли gdal писать в ECW с помощью gdalinfo --formats. Если вы не видите ECW в списке, попробуйте эти инструкции: faunalia.pt/node/438
nickves
0

gdalwarpДолжно работать прямое использование «клипа» (я знаю, что это очень старый вопрос: 18 месяцев IRL подобен геологической эпохе в интернет-годах).

У меня есть антенна 70 ГБ (ECW, 94000x81000 пикселей при 10 см / px), и GDAL может произвольно обрезать ее с помощью шейп-файла, используя

gdalwarp -cutline [clipfile] -crop_to_cutline [infile] [outfile]

в командной строке Windows. (Я понимаю, что это решение требует создания шейп-файла для целевой области, но это не самая большая проблема, известная ГИС).

Для извлечения фрагмента размером с половину пригорода требуется ~ 0,4 с; чтобы нарезать файл на четверти занимает 4 секунды. Технические характеристики моей машины не сильно отличаются (i7-4770 при 3,4 ГГц, 16 ГБ ОЗУ, Win7-64 Ultimate).

GT.
источник
gdalwarp уже упоминалось. Информация о производительности и конкретном размере изображения примера является желанным дополнением, но на самом деле это должен быть комментарий к gis.stackexchange.com/a/74450/108 (и было бы желательно сделать предлагаемое редактирование с помощью командной строки с форматированием кода). ; это легче читать)
Matt Wilkie