2016-04-10 6 views
0

В настоящее время я работаю над скриптом, который загружает файл 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, но я этого не вижу. Если бы кто-нибудь из вас, ребята, мог мне помочь, я был бы действительно благодарен. Спасибо заранее!

ответ

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, которые более полезны?

+0

Спасибо за ваш ответ, это очень помогло. В настоящее время я работаю над диссертацией бакалавра о потенциальных путях распространения инвазивных видов лягушек. Я знаю о пакете gdistance, и я тоже это использую, но мне тоже нужно было попробовать этот подход. В любом случае, еще раз спасибо! – snoops