我是R的新手,但不是ArcView。我正在绘制一些双模式数据,并希望将绘图转换为shapefile。具体来说,如果可能的话,我想转换顶点和边缘,以便我可以获得在ArcView中显示的相同绘图以及属性。
我已经安装了包“shapefiles”,我看到了convert.to.shapefile命令,但是帮助没有讨论如何将XY坐标分配给顶点。
谢谢,
添
答案 0 :(得分:4)
好的,我在这里做了几个假设,但是当你想要将空间坐标分配给二分图并将顶点和边缘导出为点形状文件和折线以供在ArcGIS中使用时,我会阅读这个问题。
这个解决方案有点笨拙,但会生成坐标限制为xmin,ymin和xmax,ymax为-0.5和+0.5的shapefile。您可以自行决定图形布局算法(例如Kamada-Kawai),并根据@ gsk3的建议,一旦shapefile在ArcGIS中,就将shapefile投影到所需的坐标系中。可以在创建points.data和edge.data数据框的位置添加顶点和边的附加属性。
library(igraph)
library(shapefiles)
# Create dummy incidence matrix
inc <- matrix(sample(0:1, 15, repl=TRUE), 3, 5)
colnames(inc) <- c(1:5) # Person ID
rownames(inc) <- letters[1:3] # Event
# Create bipartite graph
g.bipartite <- graph.incidence(inc, mode="in", add.names=TRUE)
# Plot figure to get xy coordinates for vertices
tk <- tkplot(g.bipartite, canvas.width=500, canvas.height=500)
tkcoords <- tkplot.getcoords(1, norm=TRUE) # Get coordinates of nodes centered on 0 with +/-0.5 for max and min values
# Create point shapefile for nodes
n.points <- nrow(tkcoords)
points.attr <- data.frame(Id=1:n.points, X=tkcoords[,1], Y=tkcoords[,2])
points.data <- data.frame(Id=points.attr$Id, Name=paste("Vertex", 1:n.points, sep=""))
points.shp <- convert.to.shapefile(points.attr, points.data, "Id", 1)
write.shapefile(points.shp, "~/Desktop/points", arcgis=TRUE)
# Create polylines for edges in this example from incidence matrix
n.edges <- sum(inc) # number of edges based on incidence matrix
Id <- rep(1:n.edges,each=2) # Generate Id number for edges.
From.nodes <- g.bipartite[[4]]+1 # Get position of "From" vertices in incidence matrix
To.nodes <- g.bipartite[[3]]-max(From.nodes)+1 # Get position of "To" vertices in incidence matrix
# Generate index where position alternates between "From.node" to "To.node"
node.index <- matrix(t(matrix(c(From.nodes, To.nodes), ncol=2)))
edge.attr <- data.frame(Id, X=tkcoords[node.index, 1], Y=tkcoords[node.index, 2])
edge.data <- data.frame(Id=1:n.edges, Name=paste("Edge", 1:n.edges, sep=""))
edge.shp <- convert.to.shapefile(edge.attr, edge.data, "Id", 3)
write.shapefile(edge.shp, "~/Desktop/edges", arcgis=TRUE)
希望这有帮助。
答案 1 :(得分:2)
我会根据你的数据看起来很疯狂地猜测这一点。
基本上你会想要将数据强制转换为包含x和y坐标(或lat / long或其他)的两列的data.frame。
library(sp)
data(meuse.grid)
class(meuse.grid)
coordinates(meuse.grid) <- ~x+y
class(meuse.grid)
一旦你将它作为SpatialPointsDataFrame,sp提供了一些不错的功能,包括导出shapefile:
writePointsShape(meuse.grid,"/home/myfiles/wherever/myshape.shp")
相关的帮助文件示例来自:
至少几年前,当我上次使用sp时,投影非常棒,而且将投影信息写入shapefile非常糟糕。所以最好不要对坐标进行转换,并手动告诉Arc它是什么投影。或使用writeOGR
而不是writePointsShape
。