2012-02-09 13 views
6

Hola Tengo una red en I usando la biblioteca igraphshapefile de salida para la red igraph en I

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

¿Cómo puedo generar dos archivos de forma de los vértices y los bordes usando la información Lat, Lon en el vértice ?

Respuesta

9

Puede hacerlo utilizando los paquetes sp y maptools. Hay funciones prácticas writePointsShape() y writeLinesShape() en maptools que escribirán en el formato de archivo de forma de ESRI.

Antes de hacer esto, es necesario extraer la información lat/lon de los vértices del gráfico y ponerla en un objeto SpatialPoints para los vértices, y un objeto SpatialLinesDataFrame para los bordes.

Este código produce un muy simple igraph objeto para el siguiente ejemplo:

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) 

Ahora, crear el objeto SpatialPoints para los vértices

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") 

último, crear el objeto SpatialLinesDataFrame para los bordes. Esto es un poco desordenado, pero todavía tengo que encontrar una forma rápida de producir un objeto SpatialLines con coordenadas dadas.

## 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") 
+0

Muchas gracias. Voy a intentar eso ahora. – Seen

+0

Transpuso Lat y Lon. Corregido ahora. Repita después de mí: (Lon = X, Lat = Y) :) – digitalmaps

+0

Error en validityMethod (objeto): los coords no pueden contener valores perdidos. Así es como obtengo la función "aplicar" para la línea. ¿Tiene alguna sugerencia de que puedo verificar los valores? Lo siento, soy una nueva mano en R ... – Seen

Cuestiones relacionadas