Скажем, у меня есть объект пространственных объектов (DataFrame) в R с высоким уровнем географической детали. Я хочу упростить этот объект (уменьшить количество координатных точек, необходимых для создания объекта, некоторая потеря деталей в порядке), а затем преобразовать его в объект igraph.Упростить объект пространственных объектов и преобразовать в объект igraph
Каждая координатная точка должна быть узлом на графике. Атрибуты узла графика должны содержать географические координаты, а атрибуты края должны содержать географическое расстояние между узлами. Края также должны наследовать атрибуты, хранящиеся в части DataFrame объекта SpatialLines.
Вот что я сделал до сих пор:
readShapeFile <- function(path, filename, crs){
shapefile <- readOGR(path.expand(path), filename)
if(is.na(is.projected(shapefile))){
projection(shapefile) <- CRS(crs)
} else{
shapefile <- spTransform(shapefile, CRS(crs))
}
return(shapefile)
}
canal_shapefile <- readShapeFile(PATH, FILENAME, "+init=epsg:4326")
lines <- canal_shapefile
length(coordinates(lines)[[1]][[1]][, 1]) ### To indicate how 'complex' the object is.
lines <- gSimplify(lines, tol = .001)
length(coordinates(lines)[[1]][[1]][, 1])
nodes <- NULL
edges <- NULL
for(i in 1:length(coordinates(lines))){
nodes <- rbind(nodes, coordinates(lines)[[i]][[1]])
for (j in 2:length(coordinates(lines)[[i]][[1]][, 1])){
node1 <- coordinates(lines)[[i]][[1]][j - 1, ]
node2 <- coordinates(lines)[[i]][[1]][j, ]
dist <- distance(node1[2], node1[1], node2[2], node2[1])$distance
edges <- rbind(edges, c(node1, node2, dist))
}
}
colnames(edges) <- c("node1_long", "node1_lat", "node2_long", "node2_lat", "dist")
NODE1 <- match(sprintf("%s:%s", edges[, "node1_long"], edges[, "node1_lat"]),
sprintf("%s:%s", nodes[, 1], nodes[, 2]))
NODE2 <- match(sprintf("%s:%s", edges[, "node2_long"], edges[, "node2_lat"]),
sprintf("%s:%s", nodes[, 1], nodes[, 2]))
EDGES <- cbind(NODE1, NODE2, edges[, "dist"])
NODES <- cbind(1:length(nodes[, 1]), nodes)
g <- graph.data.frame(EDGES, FALSE, NODES)
Однако команда gSimplify удаляет DataFrame. Мне все еще нужно дважды проверить это правильно.
Данные - файл формы каналов, загруженный как SpatialLinesDataFrame от https://my.vanderbilt.edu/jeremyatack/data-downloads/.
Просьба представить воспроизводимый код и данные за то, что вы пробовали до сих пор. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –
@ Hack-R, я добавил источник данных и частичное решение. Благодарю. – LJB