pgr_withPoints - Proposed - pgRouting Manual (3.2)
pgr_withPoints - Proposed
   
    
     pgr_withPoints
    
   
   - Returns the shortest path in a graph with additional temporary vertices.
  
Warning
Proposed functions for next mayor release.
- 
     
They are not officially in the current release.
 - 
     
They will likely officially be part of the next mayor release:
- 
       
The functions make use of ANY-INTEGER and ANY-NUMERICAL
 - 
       
Name might not change. (But still can)
 - 
       
Signature might not change. (But still can)
 - 
       
Functionality might not change. (But still can)
 - 
       
pgTap tests have being done. But might need more.
 - 
       
Documentation might need refinement.
 
 - 
       
 
   
   Availability
- 
    
Version 3.2.0
- 
      
New proposed function:
- 
        
pgr_withPoints(Combinations)
 
 - 
        
 
 - 
      
 - 
    
Version 2.2.0
- 
      
New proposed function
 
 - 
      
 
Support
Description
Modify the graph to include points defined by points_sql. Using Dijkstra algorithm, find the shortest path(s)
The main characteristics are:
- 
     
Process is done only on edges with positive costs.
 - 
     
Vertices of the graph are:
- 
       
positive when it belongs to the edges_sql
 - 
       
negative when it belongs to the points_sql
 
 - 
       
 - 
     
Values are returned when there is a path.
- 
       
When the starting vertex and ending vertex are the same, there is no path. - The agg_cost the non included values (v, v) is 0
 - 
       
When the starting vertex and ending vertex are the different and there is no path: - The agg_cost the non included values (u, v) is ∞
 
 - 
       
 - 
     
For optimization purposes, any duplicated value in the start_vids or end_vids are ignored.
 - 
     
The returned values are ordered: - start_vid ascending - end_vid ascending
 
- 
     
Running time: \(O(start\_vids\times(V \log V + E))\)
 
Signatures
Summary
pgr_withPoints(edges_sql, points_sql, from_vid,  to_vid  [, directed] [, driving_side] [, details])
pgr_withPoints(edges_sql, points_sql, from_vid,  to_vids [, directed] [, driving_side] [, details])
pgr_withPoints(edges_sql, points_sql, from_vids, to_vid  [, directed] [, driving_side] [, details])
pgr_withPoints(edges_sql, points_sql, from_vids, to_vids [, directed] [, driving_side] [, details])
pgr_withPoints(Edges SQL, Points SQL, Combinations SQL  [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, [start_vid,] [end_vid,] node, edge, cost, agg_cost)
    Using defaults
pgr_withPoints(edges_sql, points_sql, from_vid, to_vid)
RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
    - Example :
 - 
     
From point \(1\) to point \(3\)
- 
       
For a directed graph.
 - 
       
The driving side is set as b both. So arriving/departing to/from the point(s) can be in any direction.
 - 
       
No details are given about distance of other points of points_sql query.
 
 - 
       
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, -3);
 seq  path_seq  node  edge  cost  agg_cost
-----+----------+------+------+------+----------
   1         1    -1     1   0.6         0
   2         2     2     4     1       0.6
   3         3     5    10     1       1.6
   4         4    10    12   0.6       2.6
   5         5    -3    -1     0       3.2
(5 rows)
    One to One
pgr_withPoints(edges_sql, points_sql, from_vid,  to_vid  [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, node, edge, cost, agg_cost)
     - Example :
 - 
      
From point \(1\) to vertex \(3\) with details of passing points
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, 3,
    details := true);
 seq  path_seq  node  edge  cost  agg_cost
-----+----------+------+------+------+----------
   1         1    -1     1   0.6         0
   2         2     2     4   0.7       0.6
   3         3    -6     4   0.3       1.3
   4         4     5     8     1       1.6
   5         5     6     9     1       2.6
   6         6     9    16     1       3.6
   7         7     4     3     1       4.6
   8         8     3    -1     0       5.6
(8 rows)
     One to Many
pgr_withPoints(edges_sql, points_sql, from_vid,  to_vids [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, end_vid, node, edge, cost, agg_cost)
     - Example :
 - 
      
From point \(1\) to point \(3\) and vertex \(5\)
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    -1, ARRAY[-3,5]);
 seq  path_seq  end_pid  node  edge  cost  agg_cost
-----+----------+---------+------+------+------+----------
   1         1       -3    -1     1   0.6         0
   2         2       -3     2     4     1       0.6
   3         3       -3     5    10     1       1.6
   4         4       -3    10    12   0.6       2.6
   5         5       -3    -3    -1     0       3.2
   6         1        5    -1     1   0.6         0
   7         2        5     2     4     1       0.6
   8         3        5     5    -1     0       1.6
(8 rows)
     Many to One
pgr_withPoints(edges_sql, points_sql, from_vids, to_vid  [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, start_vid, node, edge, cost, agg_cost)
     - Example :
 - 
      
From point \(1\) and vertex \(2\) to point \(3\)
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    ARRAY[-1,2], -3);
 seq  path_seq  start_pid  node  edge  cost  agg_cost
-----+----------+-----------+------+------+------+----------
   1         1         -1    -1     1   0.6         0
   2         2         -1     2     4     1       0.6
   3         3         -1     5    10     1       1.6
   4         4         -1    10    12   0.6       2.6
   5         5         -1    -3    -1     0       3.2
   6         1          2     2     4     1         0
   7         2          2     5    10     1         1
   8         3          2    10    12   0.6         2
   9         4          2    -3    -1     0       2.6
(9 rows)
     Many to Many
pgr_withPoints(edges_sql, points_sql, from_vids, to_vids [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
     - Example :
 - 
      
From point \(1\) and vertex \(2\) to point \(3\) and vertex \(7\)
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    ARRAY[-1,2], ARRAY[-3,7]);
 seq  path_seq  start_pid  end_pid  node  edge  cost  agg_cost
-----+----------+-----------+---------+------+------+------+----------
   1         1         -1       -3    -1     1   0.6         0
   2         2         -1       -3     2     4     1       0.6
   3         3         -1       -3     5    10     1       1.6
   4         4         -1       -3    10    12   0.6       2.6
   5         5         -1       -3    -3    -1     0       3.2
   6         1         -1        7    -1     1   0.6         0
   7         2         -1        7     2     4     1       0.6
   8         3         -1        7     5     7     1       1.6
   9         4         -1        7     8     6     1       2.6
  10         5         -1        7     7    -1     0       3.6
  11         1          2       -3     2     4     1         0
  12         2          2       -3     5    10     1         1
  13         3          2       -3    10    12   0.6         2
  14         4          2       -3    -3    -1     0       2.6
  15         1          2        7     2     4     1         0
  16         2          2        7     5     7     1         1
  17         3          2        7     8     6     1         2
  18         4          2        7     7    -1     0         3
(18 rows)
     Combinations SQL
pgr_withPoints(Edges SQL, Points SQL, Combinations SQL [, directed] [, driving_side] [, details])
RETURNS SET OF (seq, path_seq, start_vid, end_vid, node, edge, cost, agg_cost)
     - Example :
 - 
      
Two (source, target) combinations: (from point \(1\) to vertex \(3\) ), and (from vertex \(2\) to point \(3\) ) with right side driving topology.
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    'SELECT * FROM ( VALUES (-1, 3), (2, -3) ) AS t(source, target)',
    driving_side => 'r',
    details => true);
 seq  path_seq  start_pid  end_pid  node  edge  cost  agg_cost
-----+----------+-----------+---------+------+------+------+----------
   1         1         -1        3    -1     1   0.4         0
   2         2         -1        3     1     1     1       0.4
   3         3         -1        3     2     4   0.7       1.4
   4         4         -1        3    -6     4   0.3       2.1
   5         5         -1        3     5     8     1       2.4
   6         6         -1        3     6     9     1       3.4
   7         7         -1        3     9    16     1       4.4
   8         8         -1        3     4     3     1       5.4
   9         9         -1        3     3    -1     0       6.4
  10         1          2       -3     2     4   0.7         0
  11         2          2       -3    -6     4   0.3       0.7
  12         3          2       -3     5    10     1         1
  13         4          2       -3    10    12   0.6         2
  14         5          2       -3    -3    -1     0       2.6
(14 rows)
     Parameters
| 
        Parameter  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        Edges SQL  | 
      
        
          | 
      
        Edges query as described above.  | 
     
| 
        Points SQL  | 
      
        
          | 
      
        Points query as described above.  | 
     
| 
        Combinations SQL  | 
      
        
          | 
      
        Combinations query as described below.  | 
     
| 
        start_vid  | 
      
        
          | 
      
        Starting vertex identifier. When negative: is a point’s pid.  | 
     
| 
        end_vid  | 
      
        
          | 
      
        Ending vertex identifier. When negative: is a point’s pid.  | 
     
| 
        start_vids  | 
      
        
          | 
      
        Array of identifiers of starting vertices. When negative: is a point’s pid.  | 
     
| 
        end_vids  | 
      
        
          | 
      
        Array of identifiers of ending vertices. When negative: is a point’s pid.  | 
     
| 
        directed  | 
      
        
          | 
      
        
        (optional). When
          | 
     
| 
        driving_side  | 
      
        
          | 
      
       
  | 
     
| 
        details  | 
      
        
          | 
      
        
        (optional). When
          | 
     
Inner query
Edges query
| 
         Column  | 
       
         Type  | 
       
         Default  | 
       
         Description  | 
      
|---|---|---|---|
| 
         id  | 
       
         
           | 
       
         Identifier of the edge.  | 
      |
| 
         source  | 
       
         
           | 
       
         Identifier of the first end point vertex of the edge.  | 
      |
| 
         target  | 
       
         
           | 
       
         Identifier of the second end point vertex of the edge.  | 
      |
| 
         cost  | 
       
         
           | 
       
         Weight of the edge (source, target) 
  | 
      |
| 
         reverse_cost  | 
       
         
           | 
       
         -1  | 
       
         Weight of the edge (target, source) , 
  | 
      
Where:
- ANY-INTEGER :
 - 
      
SMALLINT, INTEGER, BIGINT
 - ANY-NUMERICAL :
 - 
      
SMALLINT, INTEGER, BIGINT, REAL, FLOAT
 
Points query
Description of the Points SQL query
- points_sql :
 - 
      
an SQL query, which should return a set of rows with the following columns:
 
| 
         Column  | 
       
         Type  | 
       
         Description  | 
      
|---|---|---|
| 
         pid  | 
       
         
           | 
       
         (optional) Identifier of the point. 
  | 
      
| 
         edge_id  | 
       
         
           | 
       
         Identifier of the "closest" edge to the point.  | 
      
| 
         fraction  | 
       
         
           | 
       
         Value in <0,1> that indicates the relative postition from the first end point of the edge.  | 
      
| 
         side  | 
       
         
           | 
       
         (optional) Value in [‘b’, ‘r’, ‘l’, NULL] indicating if the point is: 
  | 
      
Where:
- ANY-INTEGER :
 - 
      
smallint, int, bigint
 - ANY-NUMERICAL :
 - 
      
smallint, int, bigint, real, float
 
Combinations query
| 
         Column  | 
       
         Type  | 
       
         Default  | 
       
         Description  | 
      
|---|---|---|---|
| 
         source  | 
       
         
           | 
       
         Identifier of the first end point vertex of the edge.  | 
      |
| 
         target  | 
       
         
           | 
       
         Identifier of the second end point vertex of the edge.  | 
      
Where:
- ANY-INTEGER :
 - 
      
SMALLINT, INTEGER, BIGINT
 
Result Columns
| 
        Column  | 
      
        Type  | 
      
        Description  | 
     
|---|---|---|
| 
        seq  | 
      
        
          | 
      
        Row sequence.  | 
     
| 
        path_seq  | 
      
        
          | 
      
        Path sequence that indicates the relative position on the path.  | 
     
| 
        start_vid  | 
      
        
          | 
      
        Identifier of the starting vertex. When negative: is a point’s pid.  | 
     
| 
        end_vid  | 
      
        
          | 
      
        Identifier of the ending vertex. When negative: is a point’s pid.  | 
     
| 
        node  | 
      
        
          | 
      
       
  | 
     
| 
        edge  | 
      
        
          | 
      
       
  | 
     
| 
        cost  | 
      
        
          | 
      
       
  | 
     
| 
        agg_cost  | 
      
        
          | 
      
       
  | 
     
Additional Examples
- Example :
 - 
     
Which path (if any) passes in front of point \(6\) or vertex \(6\) with right side driving topology.
 
SELECT ('('  start_pid  ' => '  end_pid ') at '  path_seq  'th step:')::TEXT AS path_at,
        CASE WHEN edge = -1 THEN ' visits'
            ELSE ' passes in front of'
        END as status,
        CASE WHEN node < 0 THEN 'Point'
            ELSE 'Vertex'
        END as is_a,
        abs(node) as id
    FROM pgr_withPoints(
        'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
        'SELECT pid, edge_id, fraction, side from pointsOfInterest',
        ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
        driving_side := 'r',
        details := true)
    WHERE node IN (-6,6);
         path_at                status          is_a   id
-------------------------+---------------------+--------+----
 (-1 => -6) at 4th step:   visits              Point    6
 (-1 => -3) at 4th step:   passes in front of  Point    6
 (-1 => -2) at 4th step:   passes in front of  Point    6
 (-1 => -2) at 6th step:   passes in front of  Vertex   6
 (-1 => 3) at 4th step:    passes in front of  Point    6
 (-1 => 3) at 6th step:    passes in front of  Vertex   6
 (-1 => 6) at 4th step:    passes in front of  Point    6
 (-1 => 6) at 6th step:    visits              Vertex   6
 (1 => -6) at 3th step:    visits              Point    6
 (1 => -3) at 3th step:    passes in front of  Point    6
 (1 => -2) at 3th step:    passes in front of  Point    6
 (1 => -2) at 5th step:    passes in front of  Vertex   6
 (1 => 3) at 3th step:     passes in front of  Point    6
 (1 => 3) at 5th step:     passes in front of  Vertex   6
 (1 => 6) at 3th step:     passes in front of  Point    6
 (1 => 6) at 5th step:     visits              Vertex   6
(16 rows)
    - Example :
 - 
     
Which path (if any) passes in front of point \(6\) or vertex \(6\) with left side driving topology.
 
SELECT ('('  start_pid  ' => '  end_pid ') at '  path_seq  'th step:')::TEXT AS path_at,
        CASE WHEN edge = -1 THEN ' visits'
            ELSE ' passes in front of'
        END as status,
        CASE WHEN node < 0 THEN 'Point'
            ELSE 'Vertex'
        END as is_a,
        abs(node) as id
    FROM pgr_withPoints(
        'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
        'SELECT pid, edge_id, fraction, side from pointsOfInterest',
        ARRAY[1,-1], ARRAY[-2,-3,-6,3,6],
        driving_side := 'l',
        details := true)
    WHERE node IN (-6,6);
         path_at                status          is_a   id
-------------------------+---------------------+--------+----
 (-1 => -6) at 3th step:   visits              Point    6
 (-1 => -3) at 3th step:   passes in front of  Point    6
 (-1 => -2) at 3th step:   passes in front of  Point    6
 (-1 => -2) at 5th step:   passes in front of  Vertex   6
 (-1 => 3) at 3th step:    passes in front of  Point    6
 (-1 => 3) at 5th step:    passes in front of  Vertex   6
 (-1 => 6) at 3th step:    passes in front of  Point    6
 (-1 => 6) at 5th step:    visits              Vertex   6
 (1 => -6) at 4th step:    visits              Point    6
 (1 => -3) at 4th step:    passes in front of  Point    6
 (1 => -2) at 4th step:    passes in front of  Point    6
 (1 => -2) at 6th step:    passes in front of  Vertex   6
 (1 => 3) at 4th step:     passes in front of  Point    6
 (1 => 3) at 6th step:     passes in front of  Vertex   6
 (1 => 6) at 4th step:     passes in front of  Point    6
 (1 => 6) at 6th step:     visits              Vertex   6
(16 rows)
    - Example :
 - 
     
From point \(1\) and vertex \(2\) to point \(3\) to vertex \(7\) on an undirected graph, with details.
 
SELECT * FROM pgr_withPoints(
    'SELECT id, source, target, cost, reverse_cost FROM edge_table ORDER BY id',
    'SELECT pid, edge_id, fraction, side from pointsOfInterest',
    ARRAY[-1,2], ARRAY[-3,7],
    directed := false,
    details := true);
 seq  path_seq  start_pid  end_pid  node  edge  cost  agg_cost
-----+----------+-----------+---------+------+------+------+----------
   1         1         -1       -3    -1     1   0.6         0
   2         2         -1       -3     2     4   0.7       0.6
   3         3         -1       -3    -6     4   0.3       1.3
   4         4         -1       -3     5    10     1       1.6
   5         5         -1       -3    10    12   0.6       2.6
   6         6         -1       -3    -3    -1     0       3.2
   7         1         -1        7    -1     1   0.6         0
   8         2         -1        7     2     4   0.7       0.6
   9         3         -1        7    -6     4   0.3       1.3
  10         4         -1        7     5     7     1       1.6
  11         5         -1        7     8     6   0.7       2.6
  12         6         -1        7    -4     6   0.3       3.3
  13         7         -1        7     7    -1     0       3.6
  14         1          2       -3     2     4   0.7         0
  15         2          2       -3    -6     4   0.3       0.7
  16         3          2       -3     5    10     1         1
  17         4          2       -3    10    12   0.6         2
  18         5          2       -3    -3    -1     0       2.6
  19         1          2        7     2     4   0.7         0
  20         2          2        7    -6     4   0.3       0.7
  21         3          2        7     5     7     1         1
  22         4          2        7     8     6   0.7         2
  23         5          2        7    -4     6   0.3       2.7
  24         6          2        7     7    -1     0         3
(24 rows)
    The queries use the Sample Data network
See Also
Indices and tables