È possibile farlo utilizzando i pacchetti sp
e maptools
. Ci sono pratici funzioni writePointsShape()
e writeLinesShape()
in maptools
che scriverà nel formato shapefile ESRI.
Prima di eseguire questa operazione, è necessario estrarre l'informazione lat/lon dai vertici del grafico e inserirla in un oggetto SpatialPoints
per i vertici e un oggetto SpatialLinesDataFrame
per i bordi.
Questo codice produce una molto semplice igraph
oggetto per il seguente esempio:
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)
Ora, creare l'oggetto SpatialPoints
per i vertici
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")
Infine, creare l'oggetto SpatialLinesDataFrame
per i bordi. Questo è un po 'disordinato, ma devo ancora trovare un modo rapido per produrre le coordinate di un oggetto 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")
Grazie mille. Ci proverò ora. – Seen
Aveva trasposto Lat e Lon. Corretto ora Ripeti dopo di me: (Lon = X, Lat = Y) :) – digitalmaps
Errore in validityMethod (oggetto): coords non può contenere valori mancanti. È così che ottengo la funzione "applica" per la linea. Hai qualche suggerimento che posso controllare i valori. Scusa se sono una nuova mano in R ... – Seen