R: Преобразование одного полосового слоя rasterLayer с таблицей цветов в 3-полосный RGB rasterStack

Аналогично вопросу, поднятому в R: Crop GeoTiff Raster с использованием пакетов "rgdal" и "raster". Я пытаюсь обрезать карту из Федерального управления топографии Швейцарии с пакетами "rgdal" и "raster", сохраняя при этом исходную таблицу цветов., Для одного *.tif файла с полосами обрезанное изображение теряет информацию таблицы цветов и, таким образом, не отображается должным образом (получающееся изображение является почти черным).

Входной файл можно скачать здесь и должен быть распакован в папку "C:/files". Это код:

## install.packages("rgdal")
## install.packages("raster")
library("rgdal")
library("raster")
input <- "C:/files/PK25_KOMB_20L_2004_1_1.tif"
output <- "C:/files/cropped.tif"
r <- raster(input)
ex  <- extent(c(600500, 601500, 196500, 197500))
cropped <- crop(r, ex)
writeRaster(cropped, output, format="GTiff", datatype='INT1U', overwrite=TRUE)

Решение, представленное в вышеупомянутом посте, работало только для 3-полосного *.tif, но не для 1-полосного *.tif (такого как файл примера).

Решение, которое должно работать, заключается в преобразовании одного полосового rasterLayer, который включает в себя таблицу цветов, в трехполосный RGB rasterStack (как обрисовано в комментарии в ранее упомянутом посте), который, очевидно, сохраняет таблицу цветов.

Тем не менее, я не знаю, как сделать преобразование одной полосы *.tif в 3-полосную RGB rasterStack при сохранении таблицы цветов. Кто-нибудь знает, как это преобразование может быть сделано, или у кого-то есть лучшая идея, чтобы решить проблему?

1 ответ

Ты можешь использовать gdalUtils::gdalwarp за это:

library(raster)
library(gdalUtils)

Загрузка данных:

download.file(file.path('http://www.swisstopo.admin.ch/internet/swisstopo/de',
                        'home/products/maps/national/digital/national',
                        'pk_25.parsys.89625.downloadList.82162.DownloadFile.tmp',
                        'pk25komblzw.zip'), f <- tempfile())
unzip(f, exdir=tempdir())

Обрезка с gdalwarp :

cropped <- gdalwarp(
  file.path(tempdir(), 'PK25_KOMB_20L_2004_1_1.tif'), 
  'cropped.tif', te=c(600500, 196500, 601500, 197500), output_Raster = TRUE)

Обратите внимание, что степень должна быть задана как c(xmin, ymin, xmax, ymax), который отличается от порядка, используемого для raster::extent,

Подтверждая, что это сработало:

plot(raster('cropped.tif'))

Другие вопросы по тегам