简体   繁体   English

输出R中igraph网络的shapefile

[英]Output shapefile for the igraph network in R

Hello I have a network in R using the igraph library 你好我在R中使用igraph库有一个网络

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

How can I generate two shapefiles for the Vertices and the Edges using the Lat, Lon info in the vertex? 如何使用顶点中的Lat,Lon信息为顶点和边创建两个shapefile?

You can do this using the sp and maptools packages. 您可以使用spmaptools包执行此操作。 There are handy functions writePointsShape() and writeLinesShape() in maptools that will write to the ESRI shapefile format. 有方便的功能writePointsShape()writeLinesShape()maptools将写入ESRI shape文件格式。

Before doing this, it is necessary to extract the lat/lon information from the graph vertices and put it into a SpatialPoints object for the vertices, and a SpatialLinesDataFrame object for the edges. 在此之前,有必要提取从图形顶点经/纬度信息,并把它变成一个SpatialPoints对象的顶点和SpatialLinesDataFrame的边缘对象。

This code produces a very simple igraph object for the following example: 此代码为以下示例生成一个非常简单的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)

Now, create the SpatialPoints object for the vertices 现在,为顶点创建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")

Finally, create the SpatialLinesDataFrame object for the edges. 最后,为边创建SpatialLinesDataFrame对象。 This is a little messy, but I am yet to find a quick way to produce a SpatialLines object given coordinates. 这有点乱,但我还没有找到一种快速的方法来生成给定坐标的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")

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM