gdistance -- How to combine transition Layers?
Great, thank you very much for your solution, Jacob. While I was waiting, I tried fiddling around with the following, but nothing really good came out of it. Your solution works well. #failed solution: tr.max <- tr.roads tr.alt.num <- as.numeric(tr.alt[1:nrow(tr.roads),1:ncol(tr.roads)]) tr.roads.num <- as.numeric(tr.roads[1:nrow(tr.roads),1:ncol(tr.roads)]) max.speed <- pmax(tr.alt.num, tr.roads.num) max.speed <- as.integer(max.speed) ## needs to be integer or next step won't work tr.max at transitionMatrix@p <- max.speed Thanks again, Thomas On Mon, Sep 26, 2011 at 9:34 PM, Jacob van Etten
<jacobvanetten at yahoo.com> wrote:
Hi Thomas,
Currently, max() is not implemented in gdistance, because it is not
implemented in Matrix.
But there are ways to work around these limitations.
See the example below, based on your self contained example.
Meanwhile, I will think about a more elegant and permanent solution.
Jacob.
###################
require(raster)
require(gdistance)
#Create sample rasters
roads <- raster(nrows=10, ncols=10)
altitude <- raster(nrows=10, ncols=10)
roads <- setValues(roads, round(runif(10*10)) )? ; plot(roads)
altitude <- setValues(altitude, runif(10*10))??????? ; plot(altitude)
#Define transition layers
tr.roads <- transition(roads, transitionFunction=function(x) x[1]*x[2]*60,
8)? #? driving at 60km/h is possible iff both cells are roads (is this
correct)?
#Yes, this is a sensible approach.
tr.alt <- transition(altitude, transitionFunction=function(x)
abs(x[1]-x[2]), 8, symm=F)? #just a sample function.
#Take a look a the vignette for a more realistic (but not state-of-the-art)
approach.
#Now how to combine them by choosing the "fastest" transportation method?
tr.stacked <- max(tr.roads, tr.alt)? #does not work
#Alternative approach using indexing
adjacencyFromTransition <- function(transition) #Probably a function I need
to include in the package
{
?? ?transitionMatr <- as(transition,"sparseMatrix")
?? ?transition.dgT <- as(transitionMatr,"dgTMatrix")
?? ?adjacency <- cbind(transition.dgT at i+1,transition.dgT at j+1)
?? ?return(adjacency)
}
adj <- adjacencyFromTransition(tr.roads)
#Now use the index together with pmax to do what you want
tr.alt[adj] <- pmax(tr.roads[adj], tr.alt[adj])
###############
________________________________ From: Thomas Chadefaux <chadefaux at gmail.com> To: r-sig-geo at r-project.org Sent: Monday, 26 September 2011, 17:37 Subject: [R-sig-Geo] gdistance -- How to combine transition Layers? Dear all, This is my first post here, so I thank you in advance for your help. My goal is to calculate the cost of traveling (friction) between two geographical points, given underlying "friction" rasters. Suppose for example that my data is composed of two rasters, one binary for roads (a given cell has a road or not), and another, continuous, for, say, altitude. Using the "gdistance" package, one can calculate a transition function between cells. The resulting transitionLayers can be combined by addition or multiplication (see http://cran.r-project.org/web/packages/gdistance/vignettes/gdistance-vignette.pdf). However, what I would need is to combine them using some kind of max function. In other words, the transition to use would be roads if there is one, otherwise by foot (in which case the altitude transition layer should be used). Here is a working example that shows where I get stuck: require(raster) require(gdistance) #Create sample rasters roads <- raster(nrows=10, ncols=10) altitude <- raster(nrows=10, ncols=10) roads <- setValues(roads, round(runif(10*10)) )? ; plot(roads) altitude <- setValues(altitude, runif(10*10))? ? ? ? ; plot(altitude) #Define transition layers tr.roads <- transition(roads, transitionFunction=function(x) x[1]*x[2]*60, 8)? #? driving at 60km/h is possible iff both cells are roads (is this correct)? tr.alt <- transition(altitude, transitionFunction=function(x) x[1]-x[2], 8, symm=F)? #just a sample function. #Now how to combine them by choosing the "fastest" transportation method? tr.stacked <- max(tr.roads, tr.alt)? #does not work Thank you very much in advance. Thomas _______________________________________________ R-sig-Geo mailing list R-sig-Geo at r-project.org https://stat.ethz.ch/mailman/listinfo/r-sig-geo