Isokron-bestemmelse

Septima

Af Gregers Petersen, Septima / @GregersP

Hvad skal jeg bræge om?

  • Routing
  • Isokroner i pgRouting og QGIS
  • Case
  • Spørgsmål

Routing

Netværk
...er "billigste" sti i et netværk

Routing

Mellem adresser
...gøres typisk mellem to adresser

Routing

Sikke mange adresser
...til alle adresser?

Routing

Hvor er adresserne
...til "adresser" (områder), der ikke findes?

Routing

10 min fra Cheminova
...kan regnes på netværket

pgRouting

pgRouting

Databasebaseret


SELECT seq, id1 AS node, id2 AS edge, cost FROM pgr_dijkstra('
			SELECT gid AS id,
				source::integer,
				target::integer,
				length::double precision AS cost
				FROM ways',
	30, 60, false, false);

seq | node | edge |        cost
-----+------+------+---------------------
   0 |   30 |   53 |  0.0591267653820616
   1 |   44 |   52 |  0.0665408320949312
   2 |   14 |   15 |  0.0809556879332114
   ...
   6 |   10 | 6869 |  0.0164274192597773
   7 |   59 |   72 |  0.0109385169537801
   8 |   60 |   -1 |                   0
(9 rows)

Dynamisk

Gamle damer

Mange rute-algoritmer

Dijkstras algorithm A-star algorithm

Dataindlæsning (FOT)


CREATE TABLE fotdata_routing.netvaerk
(
id SERIAL PRIMARY KEY,            -- intern id
geom geometry,                    -- geometrien
komkode character varying(4),     -- kommunekode
vejkode character varying(4),     -- vej kode
vej_type character varying(14),   -- vejtypen
vejklasse character varying(22),  -- vejklassen
source integer,                   -- til brug i topologien
target integer,                   -- til brug i topologien
laengde double precision,         -- til hurtig beregning på afstand
rejsetidsekunder double precision -- til hurtig Beregning på tid	
);

-- Insert fra FOT vejmidte_brudt (brudt ved alle samlinger)

Hastigheder


-- Opdater med køretider - for forskellige klasser:

UPDATE fotdata_routing.netvaerk SET rejsetidsekunder = 
        laengde / (50 * 1000/3600 ); -- fra skiltet km/t -> meter / sek
UPDATE fotdata_routing.netvaerk SET rejsetidsekunder = 
        laengde / (80 * 1000/3600 ) WHERE vejklasse LIKE 'Europavej';

-- ... sætter bl.a. lav hastighed på stier
-- Her kunne vi lave en masse andre tider baseret på klasser, byzoner osv

Den rigtige magi/topologi


-- Tilføj routing-capabilities med pgRoutings "create topology"-funktion
-- 1: Hvor ligger data
-- 2: Snaptolerance
-- 3: Hvad hedder geometrifeltet
-- 4: Hvad hedder ID-feltet
-- 5: Hvad hedder feltet med FRA-knude-id
-- 6: Hvad hedder feltet med TIL-knude-id
select pgr_createTopology('fotdata_routing.netvaerk', 0.01, 
                           the_geom:='geom', id:='id', 
                           source:='source', target:='target');


-- NOTICE:  -------------> TOPOLOGY CREATED FOR  2121154 edges
-- ...
-- Total query runtime: 7235868 ms.
-- (to timer)

Hvor langt på 10km


SELECT * from pgr_drivingDistance(
      'SELECT id, source, target, laengde AS cost
                    FROM fotdata_routing.netvaerk', --her kunne vi filtrere
      681906,   -- Østerlund 14, 9870
      10000,    -- max 10000 i cost  (længde i meter i UTM)
      false,false) AS route
    JOIN
            fotdata_routing.knuder -- View med alle knuder
    ON 
            knuder.id = route.id1 -- Hent de knuder vi kan nå
Cost kan være alt (tid, grønne områder, antal lyskryds)!

QGIS-plugin

pgRouting toolbox
Husk "Show Experimental Plugins" i Plugins -> Settings

Find en parkeringsplads

Find en parkeringsplads

Ønske: "antal parkeringspladser indenfor x minutters gang"

Har: talte parkeringspladser på strækninger og teknisk kort

Proces

  • Analyse af data (hvordan kan de bruges, fejl osv)
  • Sammenstilling (strækninger != TK-veje)
  • Beregning (pgRouting + SQL-magi)
  • Plugin/webservice (Spatial Suite)

Isokronen

400m fra Frederiksberggade 28
http://sps-demo.septima.dk/cbkort?profile=parkering

Tak

Gregers Petersen - gregers@septima.dk - Tlf: +45 9132 6945 - septima.dk
Spørgsmål?

Kilder

Billeder fra Wikipedia/Wikimedia commons - klik på hvert billede for at se brugsret