我的最终目标是使用R包joincounts.multi()
中的spdep
函数来计算连接计数。
我有一个非常大的光栅文件(nrows = 19663,ncols = 34073),单元格大小为30米。它是一个二进制栅格,有两个值,0和1(以及许多NoData单元格)。它是整数格式。
首先,我需要生成一个nb
对象 - 即邻居列表。使用此程序包可以通过多种方式执行此操作。对于多边形数据,使用poly2nb
参数。对于网格单元,使用cell2nb
参数。显然后者不能用于非常大的栅格 - 它会使我的计算机崩溃,谷歌搜索表明其他人也遇到了同样的问题。
#set working directory
setwd("C:/Users/myData/")
#get a list of all the raster files in that folder
ingrids <- list.files(getwd(), pattern=".TIF$", full.names=FALSE, recursive=FALSE)
#loop through each raster file, dropping the file extension and giving a unique filename to each, and doing the "cell2nb" function on each.
for (i in 1:length(ingrids)){
fileName <-strsplit(ingrids[i],split="\\.")[[1]][1]
outputFile<-paste(fileName, '_nb','.tif',sep='')
mydatanb <- cell2nb(17,17, type="rook", torus=FALSE)
mydataout <-writeRaster(BETUPAPnb, filename=outputFile, overwrite=TRUE)
}
我收到以下错误消息:
Error in (function (classes, fdef, mtable) : unable to find an inherited method for function ‘writeRaster’ for signature ‘"nb", "character"’
我非常感谢任何试图弄清楚这个循环问题的帮助!
答案 0 :(得分:1)
函数cell2nb
生成单元格网格的邻居列表。传递mydata
不正确,这就是产生错误的原因。以下是它所期望的参数:
> cell2nb
function (nrow, ncol, type = "rook", torus = FALSE)
{...}
您需要为其提供行数和列数。您可以对summary.nb
创建的对象使用cell2nb
来查看它返回的对象的详细信息。
答案 1 :(得分:0)
我对cell2nb函数的输出将做出错误的假设。它不是栅格,因此WriteRaster工具不起作用。该函数创建了一个&#34; nb&#34;然后在其他函数中调用的对象。
另一个关键信息是,cell2nb函数不依赖于特定的栅格数据集 - 即,取决于特定的空间布置。相反,它会根据用户指定的范围创建一个nb对象(您之后调用的栅格数据的范围将在创建后与nb对象一起使用)。