2016-04-09 13 views
0

accCost() - und costDistance() - Funktionen von R gdistance erzeugen unterschiedliche Werte beim Übergang von der Quellkoordinate A zur Zielkoordinate B. Sollte der Kostenakkumulationswert bei B nicht gleich dem sein costDistance-Wert von A nach B bei einer äquivalenten anisotropen Übergangsmatrix und dass beide Funktionen den Dijkstra-Algorithmus verwenden?R: gdistance verschiedene Ergebnisse für accCost und costDistance

Wenn nicht, was ist der grundlegende Unterschied zwischen den Berechnungen? Wenn ja, was sind die unterschiedlichen Werte, die sich aus dem unten dargestellten Code ergeben? Im Beispiel A bis B costDistance = 0,13 Stunden und accCost = 0,11 Stunden bei Punkt B. Meine anderen Tests deuten darauf hin, dass accCost konsistent weniger als CostDistance ist und dies auch über weite Entfernungen. Der Code basiert auf dem Beispiel in der accCost-Dokumentation.

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

Bitte geben Sie ein reproduzierbares Beispiel an. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-beispiel –

+0

Ich habe die Zeile "require (gdistance)" hinzugefügt, die das Beispiel vollständig reproduzierbar machen sollte. – RandyHaas

Antwort

1

Es sollte keinen Unterschied geben. Die aktuelle Version von accCost hat einen kleinen Fehler, der durch eine Änderung des igraph-Pakets entsteht.

Für den Moment, sehen Sie, ob diese Funktion das Problem löst.

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

Danke. Ich habe das versucht und bekomme folgenden Fehler: Fehler in accCost (Leitwert, fromCoords = A): konnte die Funktion ".coordsToMatrix" nicht finden – RandyHaas

+0

Sorry, das funktioniert nur, wenn Sie diese Funktion von hier bekommen: https: // r- forge.r-project.org/scm/viewvc.php/pkg/gdistance/R/internal-functions.R?view=markup&revision=222&root=gdistance Dies ist nur eine temporäre Lösung und sollte bald gelöst werden. – JacobVanEtten

+0

Das funktioniert. Vielen Dank. – RandyHaas