使用Polygon裁剪栅格文件并使用相同的文件名写入输出

时间:2018-12-03 11:01:21

标签: polygon crop raster geotiff

我有很多光栅文件(卫星图像,所有文件都可以在geotiff .tif扩展名中找到)。某些文件作为单个文件分成所有带,某些文件具有多个带。由于这会占用硬盘驱动器上的大量空间,因此我想用我感兴趣的区域裁剪每个文件,并将其作为shapefile多边形。

我已经接近自己的解决方案,并使用以下代码将裁剪后的图像作为新的.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等...

不幸的是,生成的文件只有1个波段,因此当涉及多波段TIF图像时,R仅识别第一个波段。

我想保留所有乐队和原始文件名,然后在新乐队的末尾添加“ _crop”。有人可以在这里帮助我如何更改代码吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以循环编写它们

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])
}

答案 1 :(得分:0)

我现在找到了解决方案,以下代码列出了文件夹中的所有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)
 }

感谢Richard提供出色的循环代码!

关于数据类型:很好,如果R可以检查输入文件具有哪种数据类型,并自动为裁剪的输出选择相同的数据类型。现在,我必须手动指定数据类型。否则,即使输入文件仅具有8位无符号(INT1U)或16位带符号(INT2S),输出文件仍将为float32(FLT4S)。

 datatype= same.as.input.file