Ukázky síťových analýz

Otázky

1. Nalezení nejkratší cesty (pěší) od Fakulty stavební ČVUT v Praze (22210156) na koleje Strahov - blok 8 (22150731) s využitím algoritmu Dijkstra.
-
2. Nalezení nejkratší cesty (cyklo) od Fakulty stavební ČVUT v Praze (22210156) na koleje Strahov - blok 8 (22150731).
-
3. Nalezení nejkratší a nejrychlejší cesty (auto) z Letiště Václava Havla na Hlavní nádraži v Praze.
-

odkaz

Řešení

1. Nalezení nejkratší cesty (pěší) od Fakulty stavební ČVUT v Praze (22210156) na koleje Strahov - blok 8 (22150731) s využitím algoritmu Dijkstra.
-
SELECT seq, node, edge, cost FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, st_length(geom) as cost FROM pesi6',
5131, 434, false);

1a. Nalezení nejbližších uzlů sítě

SELECT id FROM pesi6_vertices_pgr AS p,
(
 SELECT geom FROM ruian_praha.adresnimista WHERE kod = 22210156
) AS a ORDER BY st_distance(p.the_geom, a.geom) limit 1;
SELECT id FROM pesi6_vertices_pgr AS p,
(
 SELECT geom FROM ruian_praha.adresnimista WHERE kod = 22150731
) AS a ORDER BY st_distance(p.the_geom, a.geom) limit 1;

Vytvoříme pomocnou funkci

CREATE OR REPLACE FUNCTION find_node(adr integer)
  RETURNS integer AS
$func$
BEGIN
RETURN (
 SELECT id FROM pesi6_vertices_pgr AS p,
 (
  SELECT geom FROM ruian_praha.adresnimista WHERE kod = adr
 ) AS a ORDER BY st_distance(p.the_geom, a.geom) limit 1
 );
END
$func$ LANGUAGE plpgsql;
SELECT find_node(22210156);

1b. Přiřazení nákladů

ALTER TABLE pesi6 ADD COLUMN cost double precision;
UPDATE pesi6 SET cost = st_length(geom);

1c. Nalezení nejkratší cesty

SELECT seq, node, edge, cost FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, cost FROM pesi6',
find_node(22210156), find_node(22150731), false);

1d. Vytvoření geometrie nejkratší cesty

CREATE TABLE pesi_fsv_strahov AS
SELECT seq, node, edge, a.cost, b.geom AS geom FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, cost FROM pesi6',
 find_node(22210156), find_node(22150731), false) AS a
LEFT JOIN pesi6 AS b
ON (a.edge = b.gid);
2. Nalezení nejkratší cesty (cyklo) od Fakulty stavební ČVUT v Praze (22210156) na koleje Strahov - blok 8 (22150731).
-
SELECT id FROM cyklo6_vertices_pgr AS p,
(
 SELECT geom FROM ruian_praha.adresnimista WHERE kod = 22210156
) AS a order by st_distance(p.the_geom, a.geom) limit 1;
SELECT id FROM cyklo6_vertices_pgr AS p,
(
 SELECT geom FROM ruian_praha.adresnimista WHERE kod = 22150731
) AS a order by st_distance(p.the_geom, a.geom) limit 1;

2a. Vylepšená verze funkce

CREATE OR REPLACE FUNCTION find_node2(adr integer, tbl regclass, OUT result integer) AS
$func$
BEGIN
EXECUTE format('
SELECT id FROM %s_vertices_pgr AS p,
(
SELECT geom FROM ruian_praha.adresnimista WHERE kod = %s
) AS a ORDER BY st_distance(p.the_geom, a.geom) limit 1', tbl, adr)
INTO result;
END
$func$ LANGUAGE plpgsql;
SELECT find_node2(22210156, 'pesi6');
SELECT find_node2(22210156, 'cyklo6');

2b. Přiřazení nákladů

ALTER TABLE cyklo6 ADD COLUMN cost double precision;
UPDATE cyklo6 SET cost = st_length(geom);

2c. Nalezení nejkratší cesty (node: 50, edge: 188)

SELECT seq, node, edge, cost FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, cost FROM cyklo6',
find_node2(22150731, 'cyklo6'), find_node2(22210156, 'cyklo6'), false);

vs

SELECT pgr_nodenetwork('cyklo6', 0.1, 'gid', 'geom');
SELECT seq, node, edge, cost FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, cost FROM cyklo6',
find_node2(22291385, 'cyklo6'), find_node2(22210156, 'cyklo6'), false);

2d. Vytvoření geometrie nejkratší cesty

CREATE TABLE cyklo_fsv_strahov AS
SELECT seq, node, edge, a.cost, b.geom AS geom FROM pgr_dijkstra(
 'SELECT gid AS id, source, target, cost FROM pesi6',
 find_node(22210156), find_node(22150731), false) AS a
LEFT JOIN pesi6 AS b
ON (a.edge = b.gid);
3. Nalezení nejkratší a nejrychlejší cesty (auto) z Letiště Václava Havla na Hlavní nádraži v Praze.
-
CREATE OR REPLACE FUNCTION find_node3(ulice varchar, cislo_domovni int, cislo_orient int,
                                     OUT result integer)
AS $func$
BEGIN
EXECUTE format('
  SELECT o.id FROM
  ruian_praha.adresnimista a,
  ruian_praha.ulice u,
  routing.ways_vertices_pgr o
  WHERE a.cislodomovni = %s AND a.cisloorientacni = %s AND u.nazev = ''%s''
  AND a.ulicekod = u.kod
  AND ST_DWithin(geom5514, a.geom, 30) limit 1',
  cislo_domovni, cislo_orient, ulice)
INTO result;
END
$func$ LANGUAGE plpgsql;
ALTER TABLE routing.ways_vertices_pgr ADD COLUMN geom5514 geometry(point, 5514);
UPDATE routing.ways_vertices_pgr SET geom5514 = st_transform(geom, 5514);

3a. Nalezení uzlů

SELECT find_node3('Aviatická', 1017, 2);
SELECT find_node3('Wilsonova', 300, 8);

3b. Nejkratší cesta

SELECT a.*, b.geom AS geom FROM pgr_dijkstra('
 SELECT gid AS id,
 source,
 target,
 CASE WHEN cost > 0 THEN length_m ELSE -1 END AS cost,
 CASE WHEN reverse_cost > 0 THEN length_m ELSE -1 END AS reverse_cost
 FROM routing.ways',
 find_node3('Aviatická', 1017, 2),
 find_node3('Wilsonova', 300, 8),
 directed := true) AS a
LEFT JOIN routing.ways AS b
ON (a.edge = b.gid) ORDER BY seq;

3c. Nejrychlejší cesta

SELECT a.*, b.geom AS geom FROM pgr_dijkstra('
 SELECT gid AS id,
 source,
 target,
 cost_s AS cost,
 reverse_cost_s AS reverse_cost
 FROM routing.ways JOIN routing.configuration
 USING (tag_id)',
 find_node3('Aviatická', 1017, 2),
 find_node3('Wilsonova', 300, 8),
 directed := true) AS a
LEFT JOIN routing.ways AS b
ON (a.edge = b.gid) ORDER BY seq;

```