2017-12-01 6 views
1

SpatialPointsDataFrame을 사용하여 SpatialLinesNetwork에 새 노드를 추가하는 방법은 무엇입니까?stplanr의 SpatialLinesNetwork에 새 노드 추가

내 문제의 문맥 : 버스 경로의 셰이프 파일과 버스의 다른 셰이프 파일이 있습니다. 버스 노선을 따라 정류장 사이의 거리를 계산하고 싶습니다. 이상적으로, 각 정지 점은 노드 일 것이므로 stplanr::sum_network_routes()을 사용하여 그 사이의 거리를 계산할 것입니다. 문제는 내가 버스 경로를 SpatialLinesNetwork으로 변환 할 때 네트워크가 멀리 떨어져 있고 버스 정류장 위치와 관련이없는 몇 개의 노드 만 있다는 것입니다.

재현 세트 :

# load library and data 
    library(stplanr) 
    data(routes_fast) 

# convert SpatialLinesDataFrame into SpatialLinesNetwork 
    rnet <- overline(routes_fast, attrib = "length") 
    SLN <- SpatialLinesNetwork(rnet) 

# identify nodes 
    sln_nodes = sln2points(SLN) 

# Here is a bus stop which should be added as a node 
    new_point <- SpatialPointsDataFrame(coords = cbind(-1.535, 53.809), data= data.frame(id="new")) 

# plot 
    plot(SLN, col = "gray")     # network 
    plot(sln_nodes, col="red", add = TRUE) # nodes 
    plot(new_point, add=T, col="blue")  # stop to be added as a new node 

enter image description here

답변

2

이 처음부터 귀하의 질문에 대답하지 않지만, 나는 그것이 게재하여 "컨텍스트"해결 않습니다 생각하는 방법을 원하는 네트워크 거리가 수 계산해라. 이는 같은 dodgr (최신 dev 버전)을 수행 할 수 있습니다

library (dodgr) 
library (stplanr) 
library (sf) 
library (sp) 
dat <- st_as_sf (routes_fast) 
net <- weight_streetnet (dat, wt_profile = 1) 

net 객체가 네트워크의 모든 모서리 및 정점을 포함하는 간단한 data.frame입니다. 그런 다음 sln2points 단순히 접합 지점입니다 (stplanr 용어) "노드"를 반환

rnet rnet <- overline(routes_fast, attrib = "length") 
SLN <- SpatialLinesNetwork(rnet) 
sln_nodes = sln2points(SLN) 
xy <- coordinates (sln_nodes) 
colnames (xy) <- c ("x", "y") 

노드 단순 매트릭스로 라우팅 포인트를 얻을 수 위의 코드를 적용. 버스 정류장의 좌표로 대체하거나 간단히이 행렬에 추가 할 수 있습니다. 다음 세 줄은 dodgr net 개체의 고유 한 (가까운) 정점 ID에 그 좌표를 변환 :

v <- dodgr_vertices (net) 
pts <- match_pts_to_graph (v, xy) 
pts <- v$id [pts] 

네트워크에서 그 pts 사이의 거리를 계산하려면, 단지

d <- dodgr_dists (net, from = pts, to = pts) 
+0

감사 @mpadge을! 그것은 문제를 해결하지 못한다. 그러나 정말 도움이된다. 그래서 나는 당신의 답을 뽑았다. –