我正在使用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"’
答案 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)
现在问题区域更容易阅读。
无论如何,现在应该关闭。
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的地方。