1 | = pgRouting with Dijkstra algorithm = |
---|
2 | |
---|
3 | Dijkstra algorithm was the first algorithm implemented in pgRouting. |
---|
4 | It doesn't require more attributes than source and target ID, and it can |
---|
5 | distinguish between directed and undirected graphs. You can specify if your |
---|
6 | network has "reverse cost" or not. |
---|
7 | |
---|
8 | {{{ |
---|
9 | shortest_path( sql text, |
---|
10 | source_id integer, |
---|
11 | target_id integer, |
---|
12 | directed boolean, |
---|
13 | has_reverse_cost boolean ) |
---|
14 | }}} |
---|
15 | |
---|
16 | Note: |
---|
17 | * Source and target IDs are vertex IDs. |
---|
18 | * Undirected graphs ("directed false") ignores "has_reverse_cost" setting |
---|
19 | |
---|
20 | |
---|
21 | == Shortest Path Dijkstra core function == |
---|
22 | |
---|
23 | Each algorithm has its core function (implementation), which is the base for its |
---|
24 | wrapper functions. |
---|
25 | |
---|
26 | {{{ |
---|
27 | SELECT * FROM shortest_path(' |
---|
28 | SELECT gid as id, |
---|
29 | source::integer, |
---|
30 | target::integer, |
---|
31 | length::double precision as cost |
---|
32 | FROM ways', |
---|
33 | 10, 20, false, false); |
---|
34 | |
---|
35 | }}} |
---|
36 | |
---|
37 | {{{ |
---|
38 | vertex_id | edge_id | cost |
---|
39 | -----------+---------+--------------------- |
---|
40 | 10 | 293 | 0.0059596293824534 |
---|
41 | 9 | 4632 | 0.0846731039249787 |
---|
42 | 3974 | 4633 | 0.0765635090514303 |
---|
43 | 2107 | 4634 | 0.0763951531894937 |
---|
44 | ... | ... | ... |
---|
45 | 20 | -1 | 0 |
---|
46 | (63 rows) |
---|
47 | }}} |
---|
48 | |
---|
49 | == Dijkstra Wrapper functions == |
---|
50 | |
---|
51 | Wrapper functions extend the core functions with transformations, bounding box |
---|
52 | limitations, etc.. |
---|
53 | |
---|
54 | === Wrapper WITHOUT bounding box === |
---|
55 | |
---|
56 | Wrappers can change the format and ordering of the result. They often set |
---|
57 | default function parameters and make the usage of pgRouting more simple. |
---|
58 | |
---|
59 | {{{ |
---|
60 | SELECT gid, AsText(the_geom) AS the_geom |
---|
61 | FROM dijkstra_sp('ways', 10, 20); |
---|
62 | }}} |
---|
63 | |
---|
64 | {{{ |
---|
65 | gid | the_geom |
---|
66 | --------+--------------------------------------------------------------- |
---|
67 | 293 | MULTILINESTRING((18.4074149 -33.9443308,18.4074019 -33.9443833)) |
---|
68 | 4632 | MULTILINESTRING((18.4074149 -33.9443308,18.4077388 -33.9436183)) |
---|
69 | 4633 | MULTILINESTRING((18.4077388 -33.9436183,18.4080293 -33.9429733)) |
---|
70 | ... | ... |
---|
71 | 762 | MULTILINESTRING((18.4241422 -33.9179275,18.4237423 -33.9182966)) |
---|
72 | 761 | MULTILINESTRING((18.4243523 -33.9177154,18.4241422 -33.9179275)) |
---|
73 | (62 rows) |
---|
74 | }}} |
---|
75 | |
---|
76 | === Wrapper WITH bounding box === |
---|
77 | |
---|
78 | You can limit your search area by adding a bounding box. This will improve |
---|
79 | performance especially for large networks. |
---|
80 | |
---|
81 | {{{ |
---|
82 | SELECT gid, AsText(the_geom) AS the_geom |
---|
83 | FROM dijkstra_sp_delta('ways', 10, 20, 0.1); |
---|
84 | }}} |
---|
85 | gid | the_geom |
---|
86 | --------+--------------------------------------------------------------- |
---|
87 | 293 | MULTILINESTRING((18.4074149 -33.9443308,18.4074019 -33.9443833)) |
---|
88 | 4632 | MULTILINESTRING((18.4074149 -33.9443308,18.4077388 -33.9436183)) |
---|
89 | 4633 | MULTILINESTRING((18.4077388 -33.9436183,18.4080293 -33.9429733)) |
---|
90 | ... | ... |
---|
91 | 762 | MULTILINESTRING((18.4241422 -33.9179275,18.4237423 -33.9182966)) |
---|
92 | 761 | MULTILINESTRING((18.4243523 -33.9177154,18.4241422 -33.9179275)) |
---|
93 | (62 rows) |
---|
94 | |
---|
95 | Note: The projection of OSM data is "degree", so we set a bounding box |
---|
96 | containing start and end vertex plus a 0.1 degree buffer for example. |
---|