在R中输出igraph网络的shapefile

7

您好,我正在使用igraph库在R中进行网络操作。

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

我如何使用顶点中的纬度和经度信息生成两个形状文件,一个用于顶点,另一个用于边缘?
1个回答

9
您可以使用spmaptools包来完成此操作。 在maptools中有方便的函数writePointsShape()writeLinesShape()可将其写入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")

之前经纬度位置颠倒了,现已更正。请跟我重复一遍:(Lon=X, Lat=Y) :) - digitalmaps
在validityMethod(object)中出现错误:coords不能包含缺失值。这是我使用“apply”函数时得到的结果。您有任何建议可以检查这些值吗?抱歉,我是R的新手... - Seen
我假设你正在运行这个程序在你的616个顶点网络上,而不是给定的4个顶点环形示例。听起来有一些顶点没有经纬度信息。你可以使用print(yourGraph, vertex=T)进行检查。 - digitalmaps
终于成功了!谢谢!最后一个问题是要区分图的边缘方向... - Seen
不确定如何在shapefile中表示有向边(即弧线)。弧线/箭头是否是ESRI shapefile规范的一部分? - digitalmaps

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接