【发布时间】: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 循环一定有问题,但我没有看到。 如果你们中的任何人可以帮助我解决这个问题,我将非常感激。 提前致谢!
【问题讨论】: