【问题标题】:Get sequence of adjacent cell numbers out of a raster从栅格中获取相邻单元格编号的序列
【发布时间】:2016-07-31 11:31:45
【问题描述】:

我目前正在编写一个脚本,该脚本将 TIF 文件加载到栅格对象中,对其进行裁剪并将两个点(起点和目标点;通过click-函数选择)绘制到该栅格中。然后我希望它得到这两个点的单元格号码。所有这一切都没有造成任何麻烦,但现在我尝试编写一个 while-Loop 来获取随机单元格的数量(与当前单元格相邻;从起点开始),直到该单元格数量等于我的目的地的手机号码。我的想法是“走”过栅格,直到我到达目的地或至少包含它的列(以减少计算时间)。我在那次步行期间穿过的单元格的数量应该存储在一个向量(“路径”)中。我通过从包含数字的向量中随机抽样来选择相邻单元格(=选择我的下一步),这些数字在添加到当前单元格编号时会导致相邻单元格的编号。我有多个要从中采样的向量,因为“行走”的可能方向的数量取决于当前单元格的位置(例如,我不能“走到”单元格到我的下层(=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
                }

当我运行脚本并打印路径向量时,它会返回一个非常长的向量(我总是不得不停止它,因为它永远不会完成计算),它只包含几个不同的数字。这是为什么 ?我整天都在盯着这个,但我根本不知道我哪里出错了。 while 循环一定有问题,但我没有看到。 如果你们中的任何人可以帮助我解决这个问题,我将非常感激。 提前致谢!

【问题讨论】:

    标签: r raster r-raster


    【解决方案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 中有更有用的功能?

    【讨论】:

      猜你喜欢
      • 2019-11-08
      • 1970-01-01
      • 2020-09-09
      • 1970-01-01
      • 2012-02-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多