Bạn có thể thực hiện việc này bằng cách sử dụng gói sp
và maptools
. Có các chức năng tiện dụng writePointsShape()
và writeLinesShape()
trong maptools
sẽ ghi vào định dạng shapefile ESRI.
Trước khi thực hiện việc này, cần trích xuất thông tin lat/lon từ các đỉnh đồ thị và đặt nó vào đối tượng SpatialPoints
cho các đỉnh và đối tượng SpatialLinesDataFrame
cho các cạnh.
Mã này tạo ra một đối tượng rất đơn giản igraph
cho ví dụ sau:
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)
Bây giờ, tạo ra các đối tượng SpatialPoints
cho các đỉnh
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")
Cuối cùng, tạo đối tượng SpatialLinesDataFrame
cho các cạnh. Đây là một chút lộn xộn, nhưng tôi chưa tìm ra cách nhanh chóng để tạo ra một đối tượng SpatialLines cho các tọa độ.
## 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")
Cảm ơn bạn rất nhiều. Tôi sẽ thử điều đó ngay bây giờ. – Seen
Đã chuyển đổi Lat và Lon. Đã sửa ngay. Lặp lại sau tôi: (Lon = X, Lat = Y) :) – digitalmaps
Lỗi trong tính hợp lệMethod (đối tượng): coords không thể chứa giá trị bị thiếu. Đó là cách tôi nhận được cho các "áp dụng" chức năng cho dòng. Bạn có bất cứ đề nghị nào mà tôi có thể kiểm tra các giá trị không. Xin lỗi tôi là một bàn tay mới trong R ... – Seen