Невозможно записать сжатые геотифы на диск с помощью пакета terra

Я пытаюсь переключиться с растрового пакета Роберта Хиджманса на более новый и быстрый пакет terra для растровых вычислений в r. При этом я столкнулся с до смешного простой проблемой, которую не могу решить. Независимо от того, что я делаю, я не могу заставить новую функцию writeRaster записать геотиф в файл со сжатием.

Вот воспроизводимый пример: Давайте сделаем 2 растра с нуля:

  1. Большой растр с последовательными значениями

    библиотека (терра)

    r <- rast(ncol=1000, nrow=1000, xmin=0, xmax=10, ymin=0, ymax=10)

    значения (r) <- 1:ncell(r)

  2. Большой растр с одним значением

    r2 <- rast(ncol=1000, nrow=1000, xmin=0, xmax=10, ymin=0, ymax=10)

    значения (r2) <- 1

Независимо от того, указываю ли я параметр сжатия в новой функции writeRaster, выходные файлы будут иметь одинаковый размер для двух растров. Указывает, что сжатие не применяется.

      writeRaster(r2, "D:/simple_raster_test_no_comp_lzw.tif", overwrite=T) #complex raster no compression
writeRaster(r2, "D:/simple_raster_test_comp_lzw.tif", overwrite=T,  gdal=c("COMPRESS=LZW"))
writeRaster(r, "D:/test_comp_lzw.tif", overwrite=T) #simple raster no compression
writeRaster(r, "D:/test_comp_lzw2.tif", overwrite=T,   gdal=c("COMPRESS=LZW"))

file.size("D:/simple_raster_test_no_comp_lzw.tif")
file.size("D:/simple_raster_test_comp_lzw.tif")
file.size("D:/test_comp_lzw.tif")
file.size("D:/test_comp_lzw2.tif")

Я понял, что аргументы сжатия gdal просто не рассматриваются, так как я могу заменить строку LZW на любое значение и все равно получить растровый вывод без сжатия и без ошибок.

      writeRaster(r, "D:/test_comp_lzw3.tif", overwrite=T,   gdal=c("COMPRESS=IAmSuperman"))
file.size("D:/test_comp_lzw3.tif")

Наконец, попытка сохранения с использованием синтаксиса старого растрового пакета дает те же несжатые результаты.

      writeRaster(r, "D:/test_comp_lzw4.tif", overwrite=T,  compress="lzw")
file.size("D:/test_comp_lzw4.tif")

Есть идеи, как это преодолеть? Я работаю с довольно большими геотифами и без компрессии набиваю жесткий диск как колбасу в кратчайшие сроки ...

1 ответ

Решение

Если вы обнаружите ошибку в пакете, то лучше всего сообщить об этом на github или подобном ( здесь для terra упаковка.

Я увидел ваш комментарий только после того, как написал ответ; так что для потомков ниже я покажу, что сжатие работает; по крайней мере, в текущей версии на CRAN и в разрабатываемой версии.

      library(terra)
#terra version 1.1.4

r <- rast(ncol=1000, nrow=1000, xmin=0, xmax=10, ymin=0, ymax=10)
values(r) <- sqrt(1:ncell(r))

ff <- replicate(4, paste0(tempfile(), ".tif"))

writeRaster(r, ff[1], overwrite=T) #complex raster no compression
writeRaster(r, ff[2],  gdal=c("COMPRESS=LZW"))
writeRaster(r>100, ff[3]) #simple raster no compression
writeRaster(r>100, ff[4],   gdal=c("COMPRESS=LZW"))

sapply(ff, file.size, USE.NAMES=FALSE)
#[1] 4003716 2886677 4003712  146519
 
Другие вопросы по тегам