В настоящее время я работаю над скриптом, который загружает файл TIF в растровый объект, обследует его и наносит две точки (начальную точку и точку назначения, выбранную через click
- функция) в этот растровый. Затем я хочу, чтобы он получил номера этих двух точек. Все это не вызвало никаких проблем, но теперь я попытался написать while-Loop, который получает мне номер случайной ячейки (которая смежна с текущей ячейкой, начиная с начальной точки), пока это число не будет равно номер ячейки моей точки назначения. Моя идея заключалась в том, чтобы «ходить» через растр, пока я не достиг своей точки назначения или, по крайней мере, столбца, содержащего его (чтобы сократить время вычисления). Число ячеек i, пересекающихся во время этой прогулки, должно храниться в векторе («Путь»). Я выбираю смежную ячейку (= выберите мой следующий шаг) случайным образом взятия выборки из вектора, который содержит числа, которые при добавлении к текущему номеру ячейки приводят к количеству соседней ячейки. У меня есть несколько векторов, из которых можно пробовать число возможных направлений, в которых «ходить» отличается в зависимости от положения текущей ячейки (например, я не могу «ходить» к ячейке до моей нижней шкалы (= 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 длинного вектора (я всегда должен остановить его, как он никогда не закончит вычисления), который содержит только несколько различных номера. Почему это ? Я смотрю на это весь день, но я просто не могу понять, где я ошибся. Должно быть что-то не так с Loop, но я этого не вижу. Если бы кто-нибудь из вас, ребята, мог мне помочь, я был бы действительно благодарен. Спасибо заранее!
Спасибо за ваш ответ, это очень помогло. В настоящее время я работаю над диссертацией бакалавра о потенциальных путях распространения инвазивных видов лягушек. Я знаю о пакете gdistance, и я тоже это использую, но мне тоже нужно было попробовать этот подход. В любом случае, еще раз спасибо! – snoops