Выходной шейп-файл для сети igraph в R

Здравствуйте, у меня есть сеть в R, использующая библиотеку igraph.

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

Как я могу создать два шейп-файла для вершин и краев, используя информацию о широте и долготе в вершине?


person Seen    schedule 09.02.2012    source источник


Ответы (1)


Вы можете сделать это с помощью пакетов sp и maptools. В maptools есть удобные функции writePointsShape() и writeLinesShape(), которые будут записывать в формат шейп-файла ESRI.

Прежде чем сделать это, необходимо извлечь информацию о широте и долготе из вершин графа и поместить ее в объект 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")
person digitalmaps    schedule 09.02.2012
comment
Спасибо большое. Я попробую это сейчас. - person Seen; 10.02.2012
comment
Переставил Lat и Lon. Исправлено сейчас. Повторяйте за мной: (Lon=X, Lat=Y) :) - person digitalmaps; 10.02.2012
comment
Ошибка в validMethod(object): координаты не могут содержать пропущенных значений. Вот как я получаю функцию применения для строки. Есть ли у вас какие-либо предложения, что я могу проверить значения. Извините, я новичок в R... - person Seen; 10.02.2012
comment
Я предполагаю, что вы используете это в своей 616-вершинной сети, а не в приведенном примере 4-вершинного кольца. Похоже, что есть некоторые вершины, у которых нет информации о широте и долготе. Вы можете проверить с помощью print(yourGraph, vertex=T) - person digitalmaps; 10.02.2012
comment
Наконец-то я заработал! Спасибо! Остался последний вопрос: различать направления ребер графа... - person Seen; 10.02.2012
comment
Не уверен, как бы вы представили направленное ребро (т.е. дугу) в шейп-файле. Являются ли дуги/стрелки частью спецификации шейп-файла ESRI? - person digitalmaps; 10.02.2012