2016-06-02 5 views
1

Скажем, у меня есть объект пространственных объектов (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/.

+2

Просьба представить воспроизводимый код и данные за то, что вы пробовали до сих пор. http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example –

+0

@ Hack-R, я добавил источник данных и частичное решение. Благодарю. – LJB

ответ

0

Не вдаваясь в подробности вашего объекта spatialLines, ваш наиболее вероятный подход использует graph.data.frame с аргументом vertices не NULL.

Основываясь на вашем дефицитного описание могло быть так:

g = graph.data.frame(edge_list_with_distances, FALSE, points_with_coordinates) 

где:

points_with_coordinates является кадр данных, содержащий все точки с их атрибутами (первый столбец является имя точки или уникальный идентификатор , которые становятся символьными именами вершин в результирующем графе)

edge_list_with_distances - это кадр данных с расстояниями между этими точками: первые два столбца должны соответствовать символьным именам вершин от points_with_distances).