从栅格中获取相邻单元格编号的序列

时间:2016-04-10 12:04:05

标签: r raster r-raster

我目前正在制作一个脚本,它将TIF文件加载到栅格对象中,裁剪它并绘制两个点(起始点和目标点;通过click - 函数选择)到该栅格中。然后我想让它得到这两点的单元格数。所有这些都没有造成任何麻烦,但现在我试着写一个while-Loop,它给我一个随机单元的数量(它与当前单元相邻;从起始点开始)直到该单元格数等于我的目的地的单元格号。我背后的想法是" walk"穿过栅格直到我到达目的地或至少包含它的列(以减少计算时间)。在该步行期间我穿过的单元格的数量应该存储在向量中(" Path")。我通过从包含数字的向量中随机采样来选择相邻的单元格(=选择我的下一步),当添加到当前单元格编号时,该数字导致相邻单元格的编号。我有多个向量可以从中采样,作为步行的可能方向的数量"根据当前单元格的位置而有所不同(例如,如果我当前位于底部,我可以"步行"到单元格到我的下方(= n + (ncol_dispersal + 1)光栅)。到目前为止,脚本看起来像这样:

library(gdistance)
library(raster)
library(rgdal)
library(sp)
setwd("C:/Users/Giaco/Dropbox/Random Walk")   
altdata <- raster("altitude.tif")        
plot(altdata)      
e <- extent(92760.79,93345.79,204017.5,204242.5)    
dispersal_area <- crop(altdata,e)               
plot(dispersal_area)
points(92790.79,204137.5,pch=16,cex=1)              
points(93300.79,204062.5,pch=16,cex=1) 
Pts <- matrix(c(92790.79,204137.5,93300.79,204062.5),nrow=2,ncol=2,byrow=TRUE)     
Start <- cellFromXY(dispersal_area,Pts[1,])    
End <- cellFromXY(dispersal_area,Pts[2,])
nrow_dispersal <- nrow(dispersal_area)     
ncol_dispersal <- ncol(dispersal_area)
col_start <- colFromCell(dispersal_area,Start)  
row_start <- rowFromCell(dispersal_area,Start)
col_end <- colFromCell(dispersal_area,End)
row_end <- rowFromCell(dispersal_area,End)
upper_left_corner <- cellFromRowCol(dispersal_area,1,1)     
lower_left_corner <- cellFromRowCol(dispersal_area,14,1)
sample_standard <- c(1,(ncol_dispersal+1),(ncol_dispersal*-1+1))   
sample_top <- c(1,ncol_dispersal,(ncol_dispersal+1))               
sample_bottom <- c(1,(ncol_dispersal*-1+1),(ncol_dispersal*-1))    
sample_left <- c(1,(ncol_dispersal+1),(ncol_dispersal*-1+1))       
sample_upper_left <- c(1,ncol_dispersal,(ncol_dispersal+1))        
sample_lower_left <- c(1,(ncol_dispersal*-1+1),(ncol_dispersal*-1))
Path <- c()
Path[1] <- Start    
n <- Start
counter <- 1




       while (n != End)                             
                {
                n = Start+sample(sample_standard,1) 
                   if (colFromCell(dispersal_area,n)==col_end) {
                   n=End
                   break
                   } else if (n==upper_left_corner) {
                   n = n+sample(sample_upper_left,1)
                   } else if(n==lower_left_corner){
                   n = n+sample(sample_lower_left,1)
                   } else if(colFromCell(dispersal_area,n)==1) {
                   n = n+sample(sample_left,1)
                   } else if(rowFromCell(dispersal_area,n)==1){
                   n = n+sample(sample_top,1)
                   } else if(rowFromCell(dispersal_area,n)==nrow_dispersal) {
                   n = n+sample(sample_bottom,1)
                   } 
                counter <- counter+1
                Path[counter] <- n
                }

当我运行脚本并打印路径向量时,它返回一个veeerryy长向量(我总是必须停止它,因为它永远不会完成计算),它只包含几个不同的数字。这是为什么 ?我一整天都在盯着这个,但我无法弄清楚我哪里出错了。 while循环一定有问题,但我看不到它。 如果你们中的任何人能够帮助我,我真的很感激。 提前谢谢!

1 个答案:

答案 0 :(得分:1)

将来,请提供一个简单且可重复的示例。这样的事情(我认为这也回答了你的问题)。

library(gdistance)

r <- raster(system.file("external/maungawhau.grd", package="gdistance"))
r <- aggregate(r, 5)
p <- matrix(c(2667531, 6478843, 2667731, 6479227), ncol=2, byrow=TRUE)     

start <- cellFromXY(r, p[1,])    
end <- cellFromXY(r, p[2,])

counter <- 1
cell <- start
path <- cell
while (cell != end)  {
    a <- adjacent(r, cell, pairs=F)
    cell <- sample(a, 1)
    path <- c(path, cell)
}
xy <- xyFromCell(r, path)

plot(r)
lines(xy)

cols <- rainbow(nrow(xy))
for (i in 1:nrow(xy)-1) { lines(xy[i:(i+1), ], col=cols[i]) }

这种粗糙光栅的速度非常快,但是通过随机漫步确实需要很长时间才能到达大型光栅上的特定单元。

你没有说明你为什么这样做。也许gdistance中的函数更有用吗?