2012-02-09 22 views
6

你好,我必须使用的igraph库输出shape文件在R上的igraph网络

Vertices: 616 
Edges: 6270 
Directed: TRUE 
No graph attributes. 
Vertex attributes: name, Lat, Lon. 
Edge attributes: V3. 

怎样才能使用的纬度,经度信息在顶点的顶点2个shape文件和边缘中的R网络?

回答

9

您可以使用spmaptools包进行此操作。有便利的功能writePointsShape()writeLinesShape()maptools将写入到ESRI shapefile格式。

在此之前,有必要从图顶点提取纬度/经度信息,并将其放入顶点的SpatialPoints对象和边缘的SpatialLinesDataFrame对象。

此代码生成一个非常简单的igraph对象为以下示例:

library(igraph) 

## Produce a ring graph with 4 vertices 
x <- graph.ring(4) 

## Add lat/lon information to vertices 
V(x)$lat <- c(50, 50, 51, 51) 
V(x)$lon <- c(40, 41, 41, 40) 

现在,创建SpatialPoints对象顶点

library(sp) 
library(maptools) 

## Create SpatialPoints object containing coordinates 
xV <- SpatialPoints(cbind(V(x)$lon, V(x)$lat)) 

## Write vertices to a shapefile 
writePointsShape(xV, fn="vertices") 

最后,创建用于边缘SpatialLinesDataFrame对象。这有点乱,但我还没有找到一种快速的方法来生成给定坐标的SpatialLines对象。

## Create SpatialLinesDataFrame object describing edges 
edges <- get.edgelist(x)+1 
edges <- cbind(edgeNum=1:nrow(edges), v1=edges[,1], v2=edges[,2]) 
xE <- apply(edges, 1, function(i) Lines(Line(cbind(c(V(x)$lon[i["v1"]], V(x)$lon[i["v2"]]), c(V(x)$lat[i["v1"]], V(x)$lat[i["v2"]]))), ID=as.character(i["edgeNum"]))) 
xE <- SpatialLinesDataFrame(SpatialLines(xE), data=data.frame(edgeNum=1:nrow(edges))) 

## Write edges to a shapefile 
writeLinesShape(xE, fn="edges") 
+0

非常感谢。我现在会尝试。 – Seen 2012-02-09 20:14:55

+0

已经调换了Lat和Lon。现在更正。在我之后重复:(Lon = X,Lat = Y):) – digitalmaps 2012-02-09 20:27:00

+0

validityMethod(对象)错误:coords不能包含缺失值。这就是我如何获得线的“应用”功能。你有什么建议可以检查这些值。对不起,我是一个新手... – Seen 2012-02-09 22:33:25