Обрезать растровые файлы с помощью Polygon и записывать вывод с тем же именем файла - PullRequest
0 голосов
/ 03 декабря 2018

У меня много растровых файлов (спутниковые изображения, все доступны в расширении geotiff .tif).Некоторые файлы разбиты на все полосы как отдельные файлы, некоторые файлы имеют несколько полос.Поскольку это занимает много места на моем жестком диске, я хочу обрезать каждый файл с интересующей меня областью, которая у меня есть как многоугольник шейп-файла.

Я близок к своему собственному решению и получаю обрезанные изображениякак новые файлы .tif со следующим кодом:

library(raster)
rasterfiles = list.files(path=getwd(), pattern = "*.TIF", full.names=TRUE)
s = stack(rasterfiles)
shp = readOGR("Area.shp")
rasterfiles_crop = crop(s, extent(shp))

output = writeRaster(rc, 'out.tif', format="GTiff", overwrite=TRUE, bylayer = TRUE)

С этим кодом я получаю имена файлов out_1.tif, out_2.tif и т. д. *

К сожалению, полученные файлы имеют только 1band, поэтому R распознает только 1-ю полосу, когда речь идет о многоканальном TIF-изображении.

Я хочу сохранить все полосы и исходное имя файла и просто добавить "_crop" в конце новогоодин.Может ли кто-нибудь помочь мне здесь, как я должен изменить код?

Спасибо

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Я нашел решение, следующий код перечисляет все TIF-файлы в папке, а многополосный TIF сохраняет свои полосы после процесса кадрирования:

library(raster)
library(rgdal)

setwd("input-folder")

 ## polygon with crop-extend ##
shp <- readOGR("area.shp")

 ## load tif files ##
infiles = list.files(path=getwd(),
                     pattern="*.tif$|*.TIF$")

 ## Filenames with desired suffix and output place ##
outfiles = file.path("D:/Downloads/BDA/Output",
                     paste0(basename(tools::file_path_sans_ext(infiles)),
                     ".tif"))

 ## crop and output settings (compression and datatype)
 for (i in seq_along(infiles)) {
      r = crop(stack(infiles[i]), shp)
      writeRaster(r, filename=outfiles[i],
                  bylayer=FALSE,
                  format="GTiff",
                  datatype="INT1U",
                  options="COMPRESS=ZIP",
                  overwrite=TRUE)
 }

Спасибо Ричарду за хороший код цикла!

Относительно типа данных: Было бы хорошо, если бы R мог проверить, какой тип данных имеет входные файлы, и автоматически выбрать тот же тип для обрезанного вывода.Прямо сейчас я должен указать тип данных вручную.В противном случае выходные файлы будут иметь тип float32 (FLT4S), даже если входные файлы имеют только 8-битный без знака (INT1U) или 16-битный со знаком (INT2S).

 datatype= same.as.input.file
0 голосов
/ 03 декабря 2018

Вы можете написать их в цикле

library(raster)
library(rgdal)

shp <- readOGR("Area.shp")     

infiles <- list.files(path=getwd(), 
                      pattern="*.TIF", 
                      full.names=TRUE)

outfiles <- file.path(YourOutputPath, 
                      paste0(basename(tools::file_path_sans_ext(infiles)),
                      "_crop.tif")
                      )

for (i in seq_along(infiles)) {
  r <- crop(raster(infiles[i]), shp)
  writeRaster(r, filename=outfiles[i])
}
...