【问题标题】:Loop through clip tiff files and export to new folder循环播放剪辑 tiff 文件并导出到新文件夹
【发布时间】:2014-11-25 03:59:08
【问题描述】:

我正在使用Bivand 的书来尝试弄清楚如何将 R 用于空间数据,但遇到了困难。

我有一个文件夹,其中包含从 1950 年到 2010 年的年度 tiff 文件(名称:tas_mean_C_cru_TS31_01_1950,列 4762,行 2557,源类型连续,像素类型浮点,像素深度 32 位,压缩 LZW)。

我想用多边形图层对它们进行剪辑,然后将剪辑后的栅格放入与原始栅格同名的新文件夹中。我有下面的代码,我试图从书中和在线的示例中进行操作,但它不起作用。我的问题出现在循环部分,最后出现错误。

我的两个问题是: 1)我的循环语句有什么问题?我正在尝试遍历 input.path 中定义的文件夹中的文件。 2)如果我退后一步,忽略剪辑,我怎样才能将文件复制并放置在同名的新文件夹中?

谢谢珍


#load libraries
library (sp)
library (rgdal)
library (raster)
library (maps)
library (mapproj)

#SET THE WORKING DIRECTORY PATH
input.path  = "F:/Dropbox/GIS/SNAP/Temp/tas50_09/"
#SET THE OUTPUT DIRECTORY
out.file<-"F:/temp/"
#FIND THE SIZE OF THE MATRIX -- WILL NEED THESE TO PRE-ALLOCATE SUBSEQUENT MATRICES
nrow <- 2557
ncol <- 4762
# initial rasters are....
# xmn=-2173225.11814296,xmx= 1498276.88185705, ymn = 409671.150470569, 
# ymx = 2381118.15047057, crs = '+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs')
# polygon to clip rasters
poly<-readOGR("F:/Dropbox/GIS/AKCommunities","AleutianComm50mile")
#reads the path to the files with a tif extention
file.names <- dir(input.path, pattern =".tif")
# then a loop for reading each existing file of type ".tif" as table
for(j in 1:length(input.path)){
  v <- extract(input.path, poly, weights=TRUE, cellnumbers=TRUE)
#Write the data to a geotiff
out <- raster(v ,xmn=-1446037.8545397,xmx= -686037.854539692, ymn = 356262.979377343, ymx = 607262.979377344, crs = '+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154 +x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs')
writeRaster(v,filename=paste(out.file,'file.names ',sep=''),format = 'GTiff',options='COMPRESS=LZW',datatype='FLT4S',overwrite=T)
}
# I get the following error
Error in (function (classes, fdef, mtable)  : 
unable to find an inherited method for function ‘extract’ for signature ‘"character", "SpatialPolygonsDataFrame"’

【问题讨论】:

  • 您好 Jen,欢迎来到 Stack Overflow。请求资源建议的问题在这里被认为是题外话,通常很快就结束了。您可以通过识别您发布的代码 sn-p 遇到的特定问题来使您的问题符合网站的规则,而不是征求意见。
  • 提出好的问题是一门艺术。一开始并不容易。在这个主题上有非常有用的suggestions。不过,公平地说,具有空间数据的可重现示例可能会很棘手(但这并没有降低它的重要性)。如果您的问题更侧重于关键字,请说“迭代栅格多边形剪辑?”更多有类似问题的人将有机会在这里找到答案。谢谢。
  • 你不能把所有的文件都堆叠起来,然后剪辑堆叠的文件吗?

标签: r loops gis


【解决方案1】:

以下编辑可能会帮助您发现逻辑中的问题。

当您需要迭代时,一致的命名方案是一件好事:

ipath <- "F:/Dropbox/GIS/SNAP/Temp/tas50_09/"
opath <- "F:/temp/"

ppath <- "F:/Dropbox/GIS/AKCommunities"
pname <- "AleutianComm50mile"

避免使用可能有命名空间冲突的对象名称,包括“poly”、“nrow”和“ncol”。

ppoly <- readOGR(ppath,pname)

请注意,您不会在任何地方使用这些值:

m <- 2557
n <- 4762

从循环中提取复杂的文字值可以提高可读性:

p1 <- '+proj=aea +lat_1=55 +lat_2=65 +lat_0=50 +lon_0=-154'
p2 <- '+x_0=0 +y_0=0 +ellps=GRS80 +datum=NAD83 +units=m +no_defs'
projargs <- paste(p1,p2)

## output raster limits
xmn <- -1446037.8545397
xmx <- -686037.854539692
ymn <- 356262.979377343
ymx <- 607262.979377344

使用 $ 锚定模式匹配字符串结尾并避免无意的不匹配。

files <- list.files(ipath, pattern='[.]tif$')
stopifnot(length(files)>0)

现在问题区域更容易阅读。

  1. 您是否需要 extract() 中的权重和单元格编号似乎值得怀疑。
  2. 如果 v 不是矩阵对象,您可能希望在 raster() 中使用 nrow=m 和 ncol=n 参数:

无论如何,现在应该很近了。

for (f in files) {

    ifile <- file.path(ipath,f)
    ofile <- file.path(opath,f)

    v  <- extract(ifile, ppoly, weights=TRUE, cellnumbers=TRUE)

    rv <- raster(v, crs=CRS(projargs), xmn=xmn, xmx=xmx, ymn=ymn, ymx=ymx)

    writeRaster(rv, filename = ofile, format='GTiff',
                options='COMPRESS=LZW', datatype='FLT4S', overwrite=TRUE)
}

【讨论】:

  • 我确实尝试过,但存在同样的错误。这是回溯......(函数(类,fdef,mtable)中的错误:无法为签名“字符”,“SpatialPolygonsDataFrame””找到函数“提取”的继承方法3停止(gettextf(“无法找到用于签名 %s 的函数 %s 的继承方法”,sQuote(fdef@generic),sQuote(cnames)),domain = NA) 2 (function (classes, fdef, mtable) { methods
  • 仔细检查会发现您的 for() 循环存在许多问题。例如,您正在使用变量 j 进行索引,该变量从未在循环体中引用,j 本身是字符串的长度,而不是文件名的可迭代序列,并且对 writeRaster() 的调用传递了一个不是栅格的对象。我认为您正在尝试一次做太多事情以提高您的经验水平。我已经对以上内容进行了编辑,使其在逻辑上与您的目标一致,并且更具可读性。
【解决方案2】:

我意识到这已经快两年了,但我想我可以将我的解决方案提供给遇到这个问题的任何人。我很高兴我创建了我的第一个 for 循环。我也有同样的错误信息。使用@goangit 的命名约定,我自己创建了一些东西。只是略有不同。大会非常有条理,所以我同意@goangit 并建议这成为未来的一种习惯。它是最短的小东西。不管怎样,下面是一个通用光栅裁剪循环的脚本。

#Set your working directory
setwd("C:/Here_it_is/")
ipath <- "C:/Here_it_is/"   
#I know it repeats the above, but I noticed for me, it needed the wd set
opath <- "C:/Where_its_going/"

#Identify your polygon boundary
ppath <- "C:/GIS/" #directory where the .shp is 
pname <- "boundary" #filename of the actual .shp without the extension.

#Read your polygon boundary
ppoly <- readOGR(ppath,pname) #if this doesn't work theyn maybe you do not have the package loaded? 

#Identify spatial extent
e <- extent(ppoly)

#Projection type and datum, respectively
p1 <- "+proj=UTM"
p2 <- "+datum=WGS84"
projmap <- paste(p1,p2)

#Identify the list of images you wish to perform the loop
files <- list.files(ipath, pattern=".tif$", full.names=FALSE)
stopifnot(length(files)>0)

#add output directory
outfiles <- pasteO(opath, files) #paste0 forgoes any separator between the two vectors "opath" and "files". if you need to add a slash somewhere then you need to change it to the paste function or change your vectors above.

#Change extension
extension(outfiles) <- "tif" #if you want to make it .tif 

for (f in 1:length(files)){
r <- raster(files[f])
rc <- crop(r, e)
rm <- mask(rc, ppoly)
rw <- writeRaster(rm,outfiles[f],overwrite=TRUE)
}

#这应该保存你指定outfiles向量的位置。

【讨论】:

  • 感谢您的尝试。代码中的拼写错误很少,例如 paste0 和 rasater。 readOGR 行也发生了一些事情。这是一个开始,我可以从那里开始。谢谢。
  • 嗨,仁,哎呀。为错别字道歉。考虑一下我没有直接从我的代码行中复制并在 stackoverflow 中重新输入的事实。希望你可以调整错别字,它对你有用。使用“paste0”而不是 pasteO。当然,“rasater”的意思是“raster”。
猜你喜欢
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
  • 1970-01-01
  • 2021-01-22
  • 1970-01-01
  • 1970-01-01
  • 2012-06-09
  • 1970-01-01
相关资源
最近更新 更多