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. |
---|
- |
Ř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;
1b. Přiřazení nákladů
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;
2b. Přiřazení nákladů
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 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ů
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;
```