Экспорт графика R в шейп-файл - PullRequest
6 голосов
/ 18 мая 2011

Я довольно новичок в R, но не в ArcView.Я строю некоторые данные в двух режимах и хочу преобразовать график в шейп-файл.В частности, я хотел бы преобразовать вершины и ребра, если это возможно, чтобы я мог получить тот же график для отображения в ArcView вместе с атрибутами.

Я установил пакет "shapefiles",и я вижу команду convert.to.shapefile, но в справке не говорится о том, как назначить координаты XY вершинам.

Спасибо,

Тим

Ответы [ 2 ]

4 голосов
/ 18 мая 2011

Хорошо, я делаю пару предположений здесь, но я прочитал вопрос, поскольку вы хотите назначить пространственные координаты двудольному графу и экспортировать как вершины, так и ребра в виде точечных шейп-файлов и полилиний для использования в ArcGIS.

Это решение немного сложное, но оно будет создавать шейп-файлы с координатными пределами xmin, ymin и xmax, ymax -0,5 и +0,5. Вам будет необходимо выбрать алгоритм компоновки графа (например, Kamada-Kawai) и спроецировать шейп-файлы в нужную систему координат, как только шейп-файлы будут в ArcGIS, согласно предложению @ gsk3. Дополнительные атрибуты для вершин и ребер могут быть добавлены при создании фреймов данных 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)

Надеюсь, это поможет.

2 голосов
/ 18 мая 2011

Я собираюсь сделать попытку на этом основании на основе дикого предположения о том, как выглядят ваши данные.

По сути, вы захотите привести данные в data.frame с двумя столбцами, содержащимикоординаты x и y (или широта / долгота, или что-то еще).

library(sp)
data(meuse.grid)
class(meuse.grid)
coordinates(meuse.grid) <- ~x+y
class(meuse.grid)

После того, как у вас есть это как SpatialPointsDataFrame, sp предоставляет некоторые приличные функции, включая экспорт шейп-файлов:

writePointsShape(meuse.grid,"/home/myfiles/wherever/myshape.shp")

Соответствующие примеры файлов справки взяты из:

  • координаты
  • SpatialPointsDataFrame
  • readShapePoints

По крайней мере несколько лет назад, когда япоследний раз использовал sp, это было здорово при проектировании и очень плохо при записи информации о проекции в шейп-файл.Поэтому лучше оставить координаты без преобразования и вручную указать Arc, что это за проекция.Или используйте writeOGR вместо writePointsShape.

...