Calculate matrix of pairwise distances between points.
dodgr_dists(graph, from = NULL, to = NULL, shortest = TRUE, heap = "BHeap", parallel = TRUE, quiet = TRUE)
graph 


from  Vector or matrix of points from which route distances are to be calculated (see Notes) 
to  Vector or matrix of points to which route distances are to be calculated (see Notes) 
shortest  If 
heap  Type of heap to use in priority queue. Options include
Fibonacci Heap (default; 
parallel  If 
quiet  If 
square matrix of distances between nodes
graph
must minimally contain three columns of from
,
to
, dist
. If an additional column named weight
or
wt
is present, shortest paths are calculated according to values
specified in that column; otherwise according to dist
values. Either
way, final distances between from
and to
points are calculated
by default according to values of dist
. That is, paths between any pair of
points will be calculated according to the minimal total sum of weight
values (if present), while reported distances will be total sums of dist
values.
For street networks produced with weight_streetnet, distances may also
be calculated along the fastest routes with the shortest = FALSE
option. Graphs must in this case have columns of time
and time_weighted
.
Note that the fastest routes will only be approximate when derived from
sfformat data generated with the osmdata function
osmdata_sf()
, and will be much more accurate when derived from sc
format
data generated with osmdata_sc()
. See weight_streetnet for details.
The from
and to
columns of graph
may be either single
columns of numeric or character values specifying the numbers or names of
graph vertices, or combinations to two columns specifying geographical
(longitude and latitude) coordinates. In the latter case, almost any sensible
combination of names will be accepted (for example, fromx, fromy
,
from_x, from_y
, or fr_lat, fr_lon
.)
from
and to
values can be either twocolumn matrices of
equivalent of longitude and latitude coordinates, or else single columns
precisely matching node numbers or names given in graph$from
or
graph$to
. If to
is NULL
, pairwise distances are calculated
between all points specified in from
. If both from
and to
are NULL
,
pairwise distances are calculated between all nodes in graph
.
Calculations in parallel (parallel = TRUE
) ought very generally be
advantageous. For small graphs, calculating distances in parallel is likely
to offer relatively little gain in speed, but increases from parallel
computation will generally markedly increase with increasing graph sizes.
# A simple graph graph < data.frame (from = c ("A", "B", "B", "B", "C", "C", "D", "D"), to = c ("B", "A", "C", "D", "B", "D", "C", "A"), d = c (1, 2, 1, 3, 2, 1, 2, 1)) dodgr_dists (graph)#> A B C D #> A 0 1 2 3 #> B 2 0 1 2 #> C 2 2 0 1 #> D 1 2 2 0# A larger example from the included [hampi()] data. graph < weight_streetnet (hampi) from < sample (graph$from_id, size = 100) to < sample (graph$to_id, size = 50) d < dodgr_dists (graph, from = from, to = to) # d is a 100by50 matrix of distances between `from` and `to`# NOT RUN { # a more complex street network example, thanks to @chrijo; see # https://github.com/ATFutures/dodgr/issues/47 xy < rbind (c (7.005994, 51.45774), # limbeckerplatz 1 essen germany c (7.012874, 51.45041)) # hauptbahnhof essen germany xy < data.frame (lon = xy [, 1], lat = xy [, 2]) essen < dodgr_streetnet (pts = xy, expand = 0.2, quiet = FALSE) graph < weight_streetnet (essen, wt_profile = "foot") d < dodgr_dists (graph, from = xy, to = xy) # First reason why this does not work is because the graph has multiple, # disconnected components. table (graph$component) # reduce to largest connected component, which is always number 1 graph < graph [which (graph$component == 1), ] d < dodgr_dists (graph, from = xy, to = xy) # should work, but even then note that table (essen$level) # There are parts of the network on different building levels (because of # shopping malls and the like). These may or may not be connected, so it may be # necessary to filter out particular levels index < which (! (essen$level == "1"  essen$level == "1")) # for example library (sf) # needed for following subselect operation essen < essen [index, ] graph < weight_streetnet (essen, wt_profile = "foot") graph < graph [which (graph$component == 1), ] d < dodgr_dists (graph, from = xy, to = xy) # }