The stplanr provides Functionality and data access tools for solving the routing problems in R, mainly using the shortest path algorithm. It is based on the sp and igraph packages. So the shortest path algorithms are from the igraph package?
Basically, it provides a SpatialLinesNetwork class. Some very useful functions are in the follows:
overline: turn a SpatialLines into a route network. Return a SpatialLines object.
SpatialLinesNetwork: turn the SpatialLines object into a SpatialLinesNetwork
sln2points: find the nodes in the network
sum_network_links: summarise the use of linkes between the origin-destinatin (O-D) pairs.
sum_network_route: summarise the length of the shortest paths between the O-D pairs.
Note that both sum_network_links and sum_network_route are quite slow and eats up a lot of memory for a large number of O-D pairs. Both function use the shortest route, and summarise of the link use or route length of all pairs, rather than that of an individual O-D. In order to obtain the link use or route length between an O-D, the mapply or map function or their parallel versions can be used. According to experiments, using an apply function on many O-D pairs is almost as efficient as that of calling sum_network_links or sum_network_route in one go.
I have done a project using stplanr, to solve the following problem: given a road network and a set of O-D coordinates not on the network, summarise the road use from the shortest paths between the O-D.
This is done through the following steps:
Create the SpatialLinesNetwork object and the nodes.
Check if the SpatialLinesNetwork object is connected, i.e. containing only one connected component, using the nt.connect function from the shp2graph package. Revise the network if necessary.
Obtaining the nodes in the network using sln2points
For each pair of O-D, determining the nearest nodes on the network to the origin and destination, using the nabor::knn function. Is this step called snapping?
Calling sum_network_links and sum_network_route to obtain the link use or the route lengths on all shortest paths.
Coupling sum_network_* functions with parallel::clusterMap to get the individual information of each shortest path.
The unsolved problem: although the network is identified as connected by the nt.connect function, meaning that all nodes in the network are connected, the sum_network_* function returns NA for some O-D pairs.
LS0tDQp0aXRsZTogIlNvbHZpbmcgdGhlIHJvdXRpbmcgcHJvYmxlbXMgaW4gUjogc3RwbGFuciINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoZSAqc3RwbGFuciogcHJvdmlkZXMgRnVuY3Rpb25hbGl0eSBhbmQgZGF0YSBhY2Nlc3MgdG9vbHMgZm9yIHNvbHZpbmcgdGhlIHJvdXRpbmcgcHJvYmxlbXMgaW4gUiwgbWFpbmx5IHVzaW5nIHRoZSBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobS4gSXQgaXMgYmFzZWQgb24gdGhlIHNwIGFuZCBpZ3JhcGggcGFja2FnZXMuIFNvIHRoZSBzaG9ydGVzdCBwYXRoIGFsZ29yaXRobXMgYXJlIGZyb20gdGhlIGlncmFwaCBwYWNrYWdlPw0KDQpCYXNpY2FsbHksIGl0IHByb3ZpZGVzIGEgKipTcGF0aWFsTGluZXNOZXR3b3JrKiogY2xhc3MuIFNvbWUgdmVyeSB1c2VmdWwgZnVuY3Rpb25zIGFyZSBpbiB0aGUgZm9sbG93czoNCg0KKiAqKm92ZXJsaW5lKio6IHR1cm4gYSBTcGF0aWFsTGluZXMgaW50byBhIHJvdXRlIG5ldHdvcmsuIFJldHVybiBhIFNwYXRpYWxMaW5lcyBvYmplY3QuDQoNCiogKipTcGF0aWFsTGluZXNOZXR3b3JrKio6IHR1cm4gdGhlIFNwYXRpYWxMaW5lcyBvYmplY3QgaW50byBhIFNwYXRpYWxMaW5lc05ldHdvcmsNCg0KKiAqKnNsbjJwb2ludHMqKjogZmluZCB0aGUgbm9kZXMgaW4gdGhlIG5ldHdvcmsNCg0KKiAqKnN1bV9uZXR3b3JrX2xpbmtzKio6IHN1bW1hcmlzZSB0aGUgdXNlIG9mIGxpbmtlcyBiZXR3ZWVuIHRoZSBvcmlnaW4tZGVzdGluYXRpbiAoTy1EKSBwYWlycy4NCg0KKiAqKnN1bV9uZXR3b3JrX3JvdXRlKio6IHN1bW1hcmlzZSB0aGUgbGVuZ3RoIG9mIHRoZSBzaG9ydGVzdCBwYXRocyBiZXR3ZWVuIHRoZSBPLUQgcGFpcnMuDQoNCk5vdGUgdGhhdCBib3RoIHN1bV9uZXR3b3JrX2xpbmtzIGFuZCBzdW1fbmV0d29ya19yb3V0ZSBhcmUgcXVpdGUgc2xvdyBhbmQgZWF0cyB1cCBhIGxvdCBvZiBtZW1vcnkgZm9yIGEgbGFyZ2UgbnVtYmVyIG9mIE8tRCBwYWlycy4gQm90aCBmdW5jdGlvbiB1c2UgdGhlIHNob3J0ZXN0IHJvdXRlLCBhbmQgc3VtbWFyaXNlIG9mIHRoZSBsaW5rIHVzZSBvciByb3V0ZSBsZW5ndGggb2YgYWxsIHBhaXJzLCByYXRoZXIgdGhhbiB0aGF0IG9mIGFuIGluZGl2aWR1YWwgTy1ELiBJbiBvcmRlciB0byBvYnRhaW4gdGhlIGxpbmsgdXNlIG9yIHJvdXRlIGxlbmd0aCBiZXR3ZWVuIGFuIE8tRCwgdGhlIG1hcHBseSBvciBtYXAgZnVuY3Rpb24gb3IgdGhlaXIgcGFyYWxsZWwgdmVyc2lvbnMgY2FuIGJlIHVzZWQuIEFjY29yZGluZyB0byBleHBlcmltZW50cywgdXNpbmcgYW4gYXBwbHkgZnVuY3Rpb24gb24gbWFueSBPLUQgcGFpcnMgaXMgYWxtb3N0IGFzIGVmZmljaWVudCBhcyB0aGF0IG9mIGNhbGxpbmcgc3VtX25ldHdvcmtfbGlua3Mgb3Igc3VtX25ldHdvcmtfcm91dGUgaW4gb25lIGdvLg0KDQpJIGhhdmUgZG9uZSBhIHByb2plY3QgdXNpbmcgc3RwbGFuciwgdG8gc29sdmUgdGhlIGZvbGxvd2luZyBwcm9ibGVtOiBnaXZlbiBhIHJvYWQgbmV0d29yayBhbmQgYSBzZXQgb2YgTy1EIGNvb3JkaW5hdGVzIG5vdCBvbiB0aGUgbmV0d29yaywgc3VtbWFyaXNlIHRoZSByb2FkIHVzZSBmcm9tIHRoZSBzaG9ydGVzdCBwYXRocyBiZXR3ZWVuIHRoZSBPLUQuDQoNClRoaXMgaXMgZG9uZSB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc3RlcHM6DQoNCiogQ3JlYXRlIHRoZSBTcGF0aWFsTGluZXNOZXR3b3JrIG9iamVjdCBhbmQgdGhlIG5vZGVzLg0KDQoqIENoZWNrIGlmIHRoZSBTcGF0aWFsTGluZXNOZXR3b3JrIG9iamVjdCBpcyBjb25uZWN0ZWQsIGkuZS4gY29udGFpbmluZyBvbmx5IG9uZSBjb25uZWN0ZWQgY29tcG9uZW50LCB1c2luZyB0aGUgKipudC5jb25uZWN0KiogZnVuY3Rpb24gZnJvbSB0aGUgKnNocDJncmFwaCogcGFja2FnZS4gUmV2aXNlIHRoZSBuZXR3b3JrIGlmIG5lY2Vzc2FyeS4NCg0KKiBPYnRhaW5pbmcgdGhlIG5vZGVzIGluIHRoZSBuZXR3b3JrIHVzaW5nIHNsbjJwb2ludHMNCg0KKiBGb3IgZWFjaCBwYWlyIG9mIE8tRCwgZGV0ZXJtaW5pbmcgdGhlIG5lYXJlc3Qgbm9kZXMgb24gdGhlIG5ldHdvcmsgdG8gdGhlIG9yaWdpbiBhbmQgZGVzdGluYXRpb24sIHVzaW5nIHRoZSBuYWJvcjo6a25uIGZ1bmN0aW9uLiBJcyB0aGlzIHN0ZXAgY2FsbGVkIHNuYXBwaW5nPw0KDQoqIENhbGxpbmcgc3VtX25ldHdvcmtfbGlua3MgYW5kIHN1bV9uZXR3b3JrX3JvdXRlIHRvIG9idGFpbiB0aGUgbGluayB1c2Ugb3IgdGhlIHJvdXRlIGxlbmd0aHMgb24gYWxsIHNob3J0ZXN0IHBhdGhzLg0KDQoqIENvdXBsaW5nIHN1bV9uZXR3b3JrXyogZnVuY3Rpb25zIHdpdGggcGFyYWxsZWw6OmNsdXN0ZXJNYXAgdG8gZ2V0IHRoZSBpbmRpdmlkdWFsIGluZm9ybWF0aW9uIG9mIGVhY2ggc2hvcnRlc3QgcGF0aC4NCg0KVGhlIHVuc29sdmVkIHByb2JsZW06IGFsdGhvdWdoIHRoZSBuZXR3b3JrIGlzIGlkZW50aWZpZWQgYXMgY29ubmVjdGVkIGJ5IHRoZSBudC5jb25uZWN0IGZ1bmN0aW9uLCBtZWFuaW5nIHRoYXQgYWxsIG5vZGVzIGluIHRoZSBuZXR3b3JrIGFyZSBjb25uZWN0ZWQsIHRoZSBzdW1fbmV0d29ya18qIGZ1bmN0aW9uIHJldHVybnMgTkEgZm9yIHNvbWUgTy1EIHBhaXJzLg0KDQoNCg0K