2016-04-09 103 views
0

當從源座標A轉到目標座標B時,來自R gdistance的accCost()和costDistance()函數產生不同的值。不應該在B處的成本累積值等於給定一個等價的各向異性轉移矩陣,從A到B的costDistance值,並且這兩個函數都使用Dijkstra算法?R:gdistance accCost和costDistance的不同結果

如果不是,那麼計算之間的根本區別是什麼?如果是這樣,那麼從下面給出的代碼得出的不同值是什麼原因?在這個例子中,B點costDistance = 0.13小時,accCost = B點0.11小時。我的其他測試表明,accCost始終低於costDistance,並且遠遠超過了這個距離。該代碼基於accCost文檔中提供的示例。

require(gdistance) 
r <- raster(system.file("external/maungawhau.grd", package="gdistance")) 
altDiff <- function(x){x[2] - x[1]} 
hd <- transition(r, altDiff, 8, symm=FALSE) 
slope <- geoCorrection(hd) 
adj <- adjacent(r, cells=1:ncell(r), pairs=TRUE, directions=8) 
speed <- slope 
speed[adj] <- 6 * 1000 * exp(-3.5 * abs(slope[adj] + 0.05))#1000 to convert to a common spatial unit of meters 
Conductance <- geoCorrection(speed) 
A <- matrix(c(2667670, 6479000),ncol=2) 
B <- matrix(c(2667800, 6479400),ncol=2) 
ca <- accCost(Conductance,fromCoords=A) 
extract(ca,B) 
costDistance(Conductance,fromCoords=A,toCoords=B) 
+0

請提供一個可重現的例子。 http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

我已經添加了「require(gdistance)」這一行,這應該使該示例具有完全可重現性。 – RandyHaas

回答

1

應該沒有區別。當前版本的accCost有一個小瑕疵,這是由於igraph軟件包發生了變化而引起的。

目前,請看看這個功能是否解決了這個問題。

setMethod("accCost", signature(x = "TransitionLayer", fromCoords = "Coords"), 
def = function(x, fromCoords) 
    { 
    fromCoords <- .coordsToMatrix(fromCoords) 
    fromCells <- cellFromXY(x, fromCoords) 
    if(!all(!is.na(fromCells))){ 
     warning("some coordinates not found and omitted") 
     fromCells <- fromCells[!is.na(fromCells)] 
    } 
    tr <- transitionMatrix(x) 
    tr <- rBind(tr,rep(0,nrow(tr))) 
    tr <- cBind(tr,rep(0,nrow(tr))) 

    startNode <- nrow(tr) #extra node to serve as origin 
    adjP <- cbind(rep(startNode, times=length(fromCells)), fromCells) 

    tr[adjP] <- Inf 

    adjacencyGraph <- graph.adjacency(tr, mode="directed", weighted=TRUE) 
    E(adjacencyGraph)$weight <- 1/E(adjacencyGraph)$weight  

    shortestPaths <- shortest.paths(adjacencyGraph, v=startNode, mode="out")[-startNode] 

    result <- as(x, "RasterLayer") 
    result <- setValues(result, shortestPaths) 
    return(result) 
    } 
) 
+0

謝謝。我試過這個,並得到以下錯誤:錯誤accCost(電導,fromCoords = A): 找不到函數「.coordsToMatrix」 – RandyHaas

+0

對不起,只有當你從這裏獲得該函數時,這將工作:https:// r- forge.r-project.org/scm/viewvc.php/pkg/gdistance/R/internal-functions.R?view=markup&revision=222&root=gdistance這只是一個臨時解決方案,應儘快解決。 – JacobVanEtten

+0

這是有效的。非常感謝你。 – RandyHaas