SpatialLines到iGraph转换简化了拓扑

时间:2016-10-09 23:41:36

标签: r igraph

我试图将spatialLinesDataFrame转换为igraph对象,并认为我可能会丢失我想保留的信息。 igraph相当新,所以请耐心等待。以下示例说明:

# create sldf object
require(sp); require(igraph); require(shp2graph)
d = data.frame(x = c(0,80,100,0,-20,-8,0,3,-10,-5,80,75),
               y = c(0,-10,5,0,14,33,0,-4,-10,-12,-10,5),
               grp = c(1,1,1,2,2,2,3,3,3,3,4,4))

sl = SpatialLines(list(
  Lines(list(Line(d[d$grp == 1,1:2]),
             Line(d[d$grp == 4,1:2])), ID=1),
  Lines(Line(d[d$grp == 2,1:2]), ID=2),
  Lines(Line(d[d$grp == 3,1:2]), ID=3))
)

sldf = SpatialLinesDataFrame(sl, iris[1:3,])
plot(sldf)

enter image description here

现在转换为igraph和情节:

read_sldf = readshpnw(sldf, ELComputed = T)
g = nel2igraph(read_sldf[[2]], read_sldf[[3]], weight=read_sldf[[4]])
plot(g)

enter image description here

我是对的,第一个spdf行(sldf[1,])的分支已经丢失了吗?调用as_edgelist(g)会返回3行而不是4行。

1 个答案:

答案 0 :(得分:1)

只需在readshpnw中更改这些选项:

# create sldf object
require(sp); require(igraph); require(shp2graph)
d = data.frame(x = c(0,80,100,0,-20,-8,0,3,-10,-5,80,75),
               y = c(0,-10,5,0,14,33,0,-4,-10,-12,-10,5),
               grp = c(1,1,1,2,2,2,3,3,3,3,4,4))

sl = SpatialLines(list(
    Lines(list(Line(d[d$grp == 1,1:2]),
               Line(d[d$grp == 4,1:2])), ID=1),
    Lines(Line(d[d$grp == 2,1:2]), ID=2),
    Lines(Line(d[d$grp == 3,1:2]), ID=3))
)

sldf = SpatialLinesDataFrame(sl, iris[1:3,])
plot(sldf)

nodes = readshpnw(sldf, ELComputed = TRUE, Detailed = TRUE, ea.prop = names(sldf))
g = nel2igraph(nodes[[2]], nodes[[3]])
plot(g)

enter image description here