2017-12-01 7 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

これは、最初にあなたの質問に答えていませんが、私はそれが示すことによって、あなたの「コンテキスト」を解決しないと考えている方法をご希望のネットワーク距離はできます計算される。 netオブジェクトは、ネットワークのすべての辺と頂点を含む単純なdata.frameある

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

:これは、このようなdodgr(最新devバージョン)を用いて行うことができます。次いで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") 

ノードとしてルーティングポイントを得るために上記のコードを適応させます。代わりにバス停の座標に置き換えるか、単にそれらをこの行列に追加することができます。次の3行は、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を!それは問題を解決するものではありませんが、私はあなたの答えを投票したので本当に役に立ちます! –

関連する問題