../../_images/logo_pgrouting.png ../../_images/OSGeo_community.png

pgRouting Quickstart

pgRouting ist eine Erweiterung, die Routing und andere Netzwerkanalysefunktionen zu PostGIS/PostgreSQL -Datenbanken hinzufügt.

Aktivieren von pgRouting in einer Datenbank

In diesem Beispiel erstellen wir eine Datenbank mit dem Namen city_routing und aktivieren pgRouting in der Datenbank.

  • Öffnen Sie ein Terminalfenster über System Tools ‣ QTerminal und öffnen Sie psql: (psql ist ein kommandozeilen basierter Datenbankclient, der mit PostgreSQL ausgeliefert wird)

psql

In der psql Befehlseingabe geben Sie ein:

CREATE DATABASE city_routing;
\connect city_routing;
CREATE EXTENSION pgrouting CASCADE;

Sie können Ihre Installation überprüfen, indem Sie Folgendes ausführen:

SELECT * FROM pgr_version();
pgr_version
-------------
 3.1.0
(1 row)

Die Version sollte 3.1.0 oder höher sein

Beenden der Datenbank

\q

OSM-Daten mit osm2pgrouting laden

osm2pgrouting ist ein Befehlszeilenwerkzeug zum Laden von .osm-Dateien in das pgRouting-kompatible Format.

Prüfen Sie die installierte Version

osm2pgrouting --version

Die Ausgabe zeigt

This is osm2pgrouting Version 2.3.6

Laden Sie nun die Daten aus der osm-Datei:

bzcat data/osm/feature_city.osm.bz2 > /tmp/feature_city.osm
osm2pgrouting \
  -f /tmp/feature_city.osm \
  -h localhost \
  -U user \
  -d city_routing \
  -p 5432 \
  -W user \
  --conf=/usr/share/osm2pgrouting/mapconfig_for_cars.xml
rm /tmp/feature_city.osm

Die Ausgabe sollte ungefähr wie folgt aussehen:

Execution starts at: Thu Jan 21 16:25:38 2021

***************************************************
           COMMAND LINE CONFIGURATION             *
***************************************************
Filename = /tmp/feature_city.osm
Configuration file = /usr/share/osm2pgrouting/mapconfig_for_cars.xml
host = localhost
port = 5432
dbname = city_routing
username = user
schema=
prefix =
suffix =
Don't drop tables
Don't create indexes
Don't add OSM nodes
***************************************************
Testing database connection: city_routing
database connection successful: city_routing
Connecting to the database
connection success

Creating tables...
TABLE: ways_vertices_pgr created ... OK.
TABLE: ways created ... OK.
TABLE: pointsofinterest created ... OK.
TABLE: configuration created ... OK.
Opening configuration file: /usr/share/osm2pgrouting/mapconfig_for_cars.xml
    Parsing configuration

Exporting configuration ...
  - Done
Counting lines ...
  - Done
Opening data file: /tmp/feature_city.osm        total lines: 844044
    Parsing data


End Of file


    Finish Parsing data

Adding auxiliary tables to database...

Export Ways ...
    Processing 37373 ways:
[**************************|                        ] (53%) Total processed: 20000       Vertices inserted: 8126        Split ways inserted 10253
[**************************************************|] (100%) Total processed: 37373      Vertices inserted: 1423        Split ways inserted 3385

Creating indexes ...

Processing Points of Interest ...
#########################
size of streets: 37373
Execution started at: Thu Jan 21 16:25:38 2021
Execution ended at:   Thu Jan 21 16:25:42 2021
Elapsed time: 4.645 Seconds.
User CPU time: -> 2.36362 seconds
#########################

Überprüfen der importierten Daten

Bauen Sie eine Verbindung zu der Datenbank city_routing auf

psql city_routing

Über den Befehl:\d werden alle verfügbaren Tabellen und Sequenzen auflisten.

                  List of relations
 Schema |           Name           |   Type   | Owner
--------+--------------------------+----------+-------
 public | configuration            | table    | user
 public | configuration_id_seq     | sequence | user
 public | geography_columns        | view     | user
 public | geometry_columns         | view     | user
 public | pointsofinterest         | table    | user
 public | pointsofinterest_pid_seq | sequence | user
 public | spatial_ref_sys          | table    | user
 public | ways                     | table    | user
 public | ways_gid_seq             | sequence | user
 public | ways_vertices_pgr        | table    | user
 public | ways_vertices_pgr_id_seq | sequence | user
(11 rows)

osm2pgrouting lädt die OSM-Bezeichner osm_id und generiert auch einen eindeutigen Bezeichner für alle Daten: id auf den Knoten, gid an den Kanten.

SELECT id, osm_id
FROM ways_vertices_pgr
WHERE id IN(100,600);

Die Ergebnisse sind:

 id  |  osm_id
-----+----------
 100 | 81622364
 600 | 82708785
(2 rows)

Inner Query

Die meisten der pgRouting-Funktionen haben einen Parameter, der eine SQL-Anweisung darstellt, er wird als inner query bezeichnet

Die innere SQL-Anweisung muss immer die Feldnamen id, source, target haben und cost mit reverse_cost als optional haben.

Eine innere Abfrage, die gid als Identifizierungsnummer für die Segmente verwendet

SELECT gid as id,
       source, target,
       cost, reverse_cost
FROM ways

Innere Abfrage, die gid als Bezeichner der Segmente verwendet und Länge als cost ohne die optionale reverse_cost.

SELECT gid as id,
       source, target,
       length AS cost
FROM ways

pgr_Dijkstra

Führen Sie die Dijkstra-Funktion für den kürzesten Pfad (Dijkstra shortest path) basierend auf der Zeit in Sekunden aus, um ein Segment in einem ungerichteten Graphen zu durchlaufen, und verwenden Sie id als Bezeichner eines Knotens.

SELECT *
FROM pgr_dijkstra(
  'SELECT gid as id,
          source, target,
          cost_s AS cost, reverse_cost_s AS reverse_cost
  FROM ways',
  100, 600,
  directed => false
);

Die Ergebnisse sind:

 seq | path_seq | node | edge  |      cost          |       agg_cost
-----+----------+------+-------+--------------------+--------------------
   1 |        1 |  100 |  6199 |  8.994104012024671 |                  0
   2 |        2 | 4360 |   152 | 2.8524015038110697 |  8.994104012024671
   3 |        3 |  101 |   511 | 2.4123361340227754 |  11.84650551583574
   4 |        4 |  322 |   707 |   3.63955931676029 | 14.258841649858514
   5 |        5 |  448 |   705 | 2.9567136964053367 | 17.898400966618805
   6 |        6 |  445 |   662 |  4.185190538775397 | 20.855114663024143
   7 |        7 |  415 |   663 | 1.2667248968947813 |  25.04030520179954
   8 |        8 |  442 |   699 |  6.371427985640729 |  26.30703009869432
   9 |        9 |  593 |   913 | 2.5897354220718807 |  32.67845808433505
  10 |       10 |  438 |   693 | 5.5261229396496585 |  35.26819350640693
  11 |       11 | 1573 |  2421 |  7.003475952839719 |  40.79431644605659
  12 |       12 |  619 | 10389 | 3.8659203494409344 |  47.79779239889631
  13 |       13 |  600 |    -1 |                  0 |  51.66371274833725
(13 rows)

Eine Abfrage, die den OSM-Bezeichner verwendet, wird:

SELECT *
FROM pgr_dijkstra(
  'SELECT gid as id,
          source_osm AS source, target_osm AS target,
          cost_s AS cost, reverse_cost_s AS reverse_cost
  FROM ways',
  81622364, 82708785,
  directed => false
);

Da die Abfrage die Felder source_osm und target_osm verwendet, werden in der Abfrage Aliase vergeben, um die erforderlichen Namen source und target zu haben.

Die Ausgabe ist:

 seq | path_seq |    node    | edge  |        cost        |      agg_cost
-----+----------+------------+-------+--------------------+--------------------
   1 |        1 |   81622364 |  6199 |  8.994104012024671 |                  0
   2 |        2 | 1177972556 |   152 | 2.8524015038110697 |  8.994104012024671
   3 |        3 |   81622365 |   511 | 2.4123361340227754 |  11.84650551583574
   4 |        4 |   81917858 |   707 |   3.63955931676029 | 14.258841649858514
   5 |        5 |   82582021 |   705 | 2.9567136964053367 | 17.898400966618805
   6 |        6 |   82581909 |   662 |  4.185190538775397 | 20.855114663024143
   7 |        7 |   82571671 |   663 | 1.2667248968947813 |  25.04030520179954
   8 |        8 |   82581612 |   699 |  6.371427985640729 |  26.30703009869432
   9 |        9 |   82708510 |   913 | 2.5897354220718807 |  32.67845808433505
  10 |       10 |   82580320 |   693 | 5.5261229396496585 |  35.26819350640693
  11 |       11 |   97825917 |  2421 |  7.003475952839719 |  40.79431644605659
  12 |       12 |   82714784 | 10389 | 3.8659203494409344 |  47.79779239889631
  13 |       13 |   82708785 |    -1 |                  0 |  51.66371274833725
(13 rows)

Die Kosten sind die gleichen wie bei der ersten Abfrage

Eine Abfrage, um die Geometrie des Weges zu ermitteln.

Die Ergebnisse von pgr_dijkstra müssen mit den Werten der Tabelle ways kombiniert werden.

SELECT seq, edge, rpad(b.the_geom::text,60,' ') AS "the_geom (truncated)"
FROM pgr_dijkstra(
  'SELECT gid as id,
          source, target,
          cost_s AS cost, reverse_cost_s AS reverse_cost
  FROM ways',
  100, 600,
  directed => false
) AS a
JOIN ways AS b ON (a.edge = b.gid) ORDER BY seq;

Die Ergebnisse sind hier zur besseren Darstellung abgeschnitten, die Geometrien sind viel länger als angezeigt.

 seq | edge  |                     the_geom (truncated)
-----+-------+--------------------------------------------------------------
   1 |  6199 | 0102000020E6100000050000009F3825C56C3C4DC0D8367B56884A41C011
   2 |   152 | 0102000020E610000003000000B586F7C19E3C4DC016A0127C784A41C034
   3 |   511 | 0102000020E610000002000000EFF7D566AD3C4DC09C267D6B714A41C04A
   4 |   707 | 0102000020E6100000060000004A247612B63C4DC0FA1F05F4674A41C052
   5 |   705 | 0102000020E610000003000000964E35C4C23C4DC0D81E076F594A41C095
   6 |   662 | 0102000020E610000002000000504FC4C7CC3C4DC00858AB764D4A41C01F
   7 |   663 | 0102000020E610000002000000408C6BD7DF3C4DC013ACBBC3374A41C01F
   8 |   699 | 0102000020E61000000300000082FD7C00F73C4DC0E44FAFEF1E4A41C017
   9 |   913 | 0102000020E610000002000000650D28E5FF3C4DC03D02C985144A41C082
  10 |   693 | 0102000020E610000002000000C761D5C5123D4DC060E05E3EFE4941C065
  11 |  2421 | 0102000020E610000003000000675F1ED72B3D4DC0A45F11B2E24941C05F
  12 | 10389 | 0102000020E6100000020000006CA9CD49393D4DC08E548440D34941C067
(12 rows)

Über den Befehl \q können Sie psql verlassen.

Was kommt als Nächstes?