如何计算R中的邻域邻接?

时间:2014-08-25 23:23:32

标签: r spatial neighbours

我的最终目标是使用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"’

我非常感谢任何试图弄清楚这个循环问题的帮助!

2 个答案:

答案 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对象一起使用)。