shortest path search with pgrouting -...
TRANSCRIPT
![Page 1: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/1.jpg)
Shortest Path Search with pgRouting
Daniel Kastl
![Page 2: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/2.jpg)
What is pgRouting?
![Page 3: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/3.jpg)
An Extension for
PostgreSQL / PostGIS, ...
![Page 4: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/4.jpg)
An Open Source project, ...
![Page 5: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/5.jpg)
A Library providing, ...
![Page 6: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/6.jpg)
Shortest Path
![Page 7: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/7.jpg)
DD and TSP
![Page 8: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/8.jpg)
DARP
![Page 9: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/9.jpg)
@justjkk
@jay_mahadeokar
![Page 10: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/10.jpg)
APSP and TDSP
![Page 11: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/11.jpg)
Multi-Modal
![Page 12: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/12.jpg)
https://github.com/pgRouting/pgrouting
![Page 13: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/13.jpg)
SQL Function
SELECT * FROM shortest_path('
SELECT gid as id,
source::integer,
target::integer,
length::float8 as cost
FROM ways',
605, 359, false, false);
![Page 14: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/14.jpg)
Query Result
vertex_id | edge_id | cost
-----------+---------+--------------------
605 | 599 | 0.19925085940845
604 | 598 | 0.100258103875674
603 | 597 | 0.201123583387407
602 | 596 | 0.204847680679676
601 | 595 | 0.158334540345002
4293 | 9602 | 0.0183273901669081
... | ... | ...
![Page 15: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/15.jpg)
Most users need pgRouting for
Road Networks
How do they look like?
![Page 16: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/16.jpg)
Like this ...
![Page 17: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/17.jpg)
… or like this ...
![Page 18: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/18.jpg)
… or sometimes like this.
![Page 19: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/19.jpg)
What makes them real?
Traffic lights Signs Road marking
![Page 20: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/20.jpg)
How can pgRouting help here?
![Page 21: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/21.jpg)
gid,source,target,cost,reverse_cost,x1, y1,x2, y2,rule,to_cost
source
target
![Page 22: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/22.jpg)
Traffic lights slow down
… so costs must increase.
![Page 23: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/23.jpg)
A
BC
D
cost(A)=cost(A)+30seccost(B)=cost(B)+30seccost(C)=cost(C)+30seccost(D)=cost(D)+30sec
1min
![Page 24: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/24.jpg)
Signs inform about
restrictions and rules
![Page 25: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/25.jpg)
![Page 26: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/26.jpg)
cost(A) = length(A)reverse_cost(A) = ∞
A
![Page 27: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/27.jpg)
Sometimes
the costs
have different
meaning.
![Page 28: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/28.jpg)
cost(A)=length(A)/2reverse_cost(A)=length(A)*2
cost(B)=length(B)*3reverse_cost(B)=length(B)/3
A
B
![Page 29: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/29.jpg)
Turn restrictions
obviously
restrict turns.
![Page 30: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/30.jpg)
A
BC
D
cost(A)=cost(A)+1mincost(B)=cost(B)+1mincost(C)=cost(C)+1mincost(D)=cost(D)+1min
1min
A
BC
D
rule(A) = "D"to_cost(A, D) = ∞
![Page 31: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/31.jpg)
Road type
can be used
for cost
calculation.
![Page 32: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/32.jpg)
Not only road types
but also conditions
![Page 33: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/33.jpg)
http://upload.wikimedia.org/wikipedia/commons/e/e4/Jughandle_signage.jpg
Jughandle intersection
![Page 34: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/34.jpg)
@ckrahe
![Page 35: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/35.jpg)
And you know
what is great about pgRouting?
![Page 36: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/36.jpg)
All costs are dynamic!… which is the opposite to pre-calculated
![Page 37: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/37.jpg)
If the road is closed ...
![Page 38: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/38.jpg)
… or there is an accident, ...
![Page 39: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/39.jpg)
… there is a sign with
restrictions limited
to a certain time, ...
![Page 40: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/40.jpg)
… bad weather conditions ...
![Page 41: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/41.jpg)
… or any other obstacle, ...
![Page 42: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/42.jpg)
You don't need to
rebuild and reload
your network
![Page 43: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/43.jpg)
… and wait forever.
![Page 44: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/44.jpg)
You only need to adjust the cost
for this particular road,
and the next search will go another way.
![Page 45: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/45.jpg)
Cost can be virtually anything
![Page 46: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/46.jpg)
OpenStreetMap data
![Page 47: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/47.jpg)
pgRouting can be used for
different kinds of networks
![Page 48: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/48.jpg)
Canals and
Rivers
![Page 49: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/49.jpg)
Hiking trails
![Page 50: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/50.jpg)
… or any other
kind of networks.
![Page 51: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/51.jpg)
pgRouting Demo
http://websi.openvrp.com
http://map.veloland.ch
http://www.ridethecity.com
http://www.pgrouting.org/gallery.html
![Page 52: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/52.jpg)
Plans until FOSS4G 2012
● Integrate new functions
● All-Pair-Shortest-Path
● Time-Dependent-Shortest-Path
● Multi-Modal
● Two-way A-Star, ...
● Drop CGAL dependency
● PostgreSQL 9.x & PostGIS 2.0 support
● Source cleanup
![Page 54: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/54.jpg)
![Page 55: Shortest Path Search with pgRouting - FOSS4G2011.foss4g.org/sites/2011.foss4g.org/files/slides/FOSS4... · 2011-09-23 · Plans until FOSS4G 2012 Integrate new functions All-Pair-Shortest-Path](https://reader033.vdocuments.site/reader033/viewer/2022042003/5e6e9d4bda23b859c4785027/html5/thumbnails/55.jpg)
Photos from sxc.hu and flickr under Creative Commons Licence.