Найкращий спосіб відрізати великий растровий файл ECW?


9

Я намагаюся вирізати великий ECW (деталі нижче), але растровий файл занадто великий, щоб його цілком обробляти.

Деякі деталі ECW нижче

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

розмір файлу: 50gb Розмір 450000, 565081 Розмір пікселів: 0,15 0,15 COLORSPACE = RGB COMPRESSION_RATE_TARGET = 9 ВЕРСІЯ = 2 Кількість діапазонів: 4

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

Ось методи, які я випробував без успіху:

  1. Аркгіз використовував для врятування програми ecw у тиф / інших форматах ... (я швидко відмовився)

  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 64 біт на 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 повинен використовувати найменше пам'яті, оскільки ви читаєте лише те, що вам потрібно. Погляньте на цей підручник, якщо вам потрібно "як" (адаптуйте біт для читання та запису за блоком).


Дякую за відповідь! Я спробую SAGA, і якщо це не спрацює, я буду їхати з Numpy.
Блакитний

5

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

gdal_translate -projwin [ulx uly lrx lry] infile outfile  

Якщо не використовувати -srswinпрапор так:

gdal_translate -srcwin [xoff yoff xsize ysize] інфілірований файл файлу.

Іншим варіантом є побудова «віртуального» растра (у кілька кілобайт), який спрямовується на ваш початковий набір даних, з 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

Дякуємо за відповідь ніки. Я створив віртуальний растр і запустив <code> gdaladdo -ro --config COMPRESS_OVERVIEW DEFLATE outfile 2 4 8 16 </code> Я не дуже впевнений, чому я отримав таке повідомлення про помилку Помилка 1: Неможливо створити файл TIFF через відсутність кодек для DEFLATE. Помилка будівлі.
Синій

Перевірте помилки qgis-bug: 8782 та osge4w-bug: 382, якщо вони описують ваш випадок. Тим часом спробуйте створити огляди без алгоритмів стиснення або виберіть інший .
ніки

схоже, я працював у 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 см / пкс), і GDAL може довільно обрізати її за допомогою форм-файлу, використовуючи

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

у командному рядку Windows. (Я розумію, що для цього рішення потрібно створити файл форми для цільової області, що цікавить, але це не найбільша проблема, відома GIS).

Для вилучення шматка розміру на півмісті потрібно ~ 0,4 сек; щоб нарізати файл на чверті займає 4 сек. Характеристики моєї машини не відрізняються кардинально (i7-4770 при 3,4 ГГц, 16 Гб оперативної пам’яті, Win7-64 Ultimate).


gdalwarp вже згадувався. Інформація про продуктивність та конкретний приклад розміру зображення є вітальним доповненням, але насправді це має бути коментарем до gis.stackexchange.com/a/74450/108 (а також запропонувати редагування запропонованого редагування за допомогою командного рядка з форматуванням коду також буде вітатися ; це легше читати)
matt wilkie
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.