循环剪辑tiff文件并导出到新文件夹

时间:2014-11-25 03:59:09

标签: r loops gis

我正在使用Bivand的书来尝试弄清楚如何使用R来表示空间数据,但却在苦苦挣扎。

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

我想用多边形图层剪切它们,然后将剪切的栅格放在一个与原始栅格同名的新文件夹中。我有下面的代码,我试图从书中和在线的例子中操纵,但它不起作用。我的问题来自循环部分,最后我得到一个错误。

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

谢谢Jen


#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"’

2 个答案:

答案 0 :(得分:1)

以下编辑可帮助您查找逻辑中的问题。

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

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

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

避免可能存在命名空间冲突的对象名称,包括&#34; poly&#34;,&#34; nrow&#34;和&#34; ncol&#34;。

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个参数:
  3. 无论如何,现在应该关闭。

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

答案 1 :(得分:0)

我意识到这已经差不多两年了,但我想我可以把解决方案交给任何遇到这个问题的人。我兴高采烈地创造了我的第一个for循环。我也有相同的错误消息。使用@goangit的命名约定,我自己创建了一些东西。略有不同。该会议非常有条理,所以我同意@goangit并建议将来这成为一种习惯。它是最短的小东西。无论如何,下面是通用光栅剪辑循环的脚本。

<!DOCTYPE=html>
<html>
   <style>
       * {
          margin: 0;
          padding: 0;
       }
       body {
          float: left;
       }
       hr {
          clear: both;
          border: none;
       }
       p{
          float: left;
       }
       form {
          float: right;
       }
   </style>
   <body>
       <div id = "row_1">
              <p>looooooooooooo <br /> ooooooooooooo <br /> ooong label: </p>
              <form><input type="text" placeholder="Second" /></form>
       </div>
       <hr />
       <div id = "row_2">
              <p>short</p>
              <form><input type="text" placeholder="First" /></form>
       </div>
   </body>
</html>

#这应该保存你指定outfiles vector的地方。