[R-sig-Geo] shortest path

Barry Rowlingson b.rowlingson at lancaster.ac.uk
Fri Aug 31 13:15:09 CEST 2012


On Fri, Aug 31, 2012 at 11:58 AM, Rowlingson, Barry
<b.rowlingson at lancaster.ac.uk> wrote:

>  If I didn't have to be on a train in three hours I'd code this up...

 Oh who am I kidding:

buildTopo <- function(lines){
  require(rgeos)
  require(igraph)

  g = gIntersection(lines,lines)
  edges = do.call(rbind,lapply(g at lines[[1]]@Lines,function(ls){as.vector(t(ls at coords))}))
  lengths = sqrt((edges[,1]-edges[,3])^2+(edges[,2]-edges[,4])^2)

  froms = paste(edges[,1],edges[,2])
  tos = paste(edges[,3],edges[,4])

  graph = graph.edgelist(cbind(froms,tos),directed=FALSE)
  E(graph)$weight=lengths
  return(graph)

}

 > m = readOGR(".","Line")
 > gg = buildTopo(m)

compute shortest distance between two vertices (note the -1 is because
I'm still on old igraph with 0-indexing):

 > E(gg)[get.shortest.paths(gg,V(gg)[1],V(gg)[14])[[1]]-1]

Edge sequence:

[0]  0.81711193 47.57711634 -- -0.28546154 48.4287593
[1]  2.2151139 46.49728033  -- 0.81711193 47.57711634
[9]  1.57160852 45.36348513 -- 2.2151139 46.49728033
[10] 1.39973834 45.06066625 -- 1.57160852 45.36348513
[11] 1.29755246 44.88062446 -- 1.39973834 45.06066625
[12] 0.91544563 43.67971729 -- 1.29755246 44.88062446
[13] 0.88815229 43.43407719 -- 0.91544563 43.67971729

I think this could be improved by adding the coordinates to the nodes.
But anyway, 90% done.

Barry



More information about the R-sig-Geo mailing list