我有很多光栅文件(卫星图像,所有文件都可以在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”。有人可以在这里帮助我如何更改代码吗?
谢谢
答案 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