OSM vejnettet i spil

Den lige vej eller ej

Det er ikke altid at den lige vej, der er den mest givende. Og mit første bekendtskab med ruteberegninger i Open Source, blev bestemt ikke lige – men givende.

Og apropos vej, så handler dette indlæg om, at lave et kort, der viser hvor langt man kan køre fra et givet sted på henholdsvis ½ og 1 time.

Fra jeg fik stillet opgaven har researchen taget mig vidt omkring. Rammerne for opgaven var i første omgang at finde en løsning der kunne vises i Qgis, og at data skulle være umiddelbart tilgængelige – dvs. gratis.

GIS starter efter min mening altid med data, og datakvaliteten er den altafgørende faktor i forhold til kvaliteten af det resultat der opnås. Så jeg gik på jagt efter data.

Tilgængelige OpenStreetMap data

OpenStreetMap data (OSM) er frit tilgængelige som download fra f.eks. denne web-side: http://download.geofabrik.de/

Data er inddelt i forskellige regioner og lande, og er faktisk tilgængelige for alle verdensdele. Jeg vurderede at shape-formatet var det nemmest tilgængelige, men det skulle senere vise sig, at jeg tog fejl. I hvert fald i forhold til præcis denne opgave.

Vejnettet i det downloadede shape-format var ikke fuldstændigt i forhold til udfyldelse af attributter. Godt nok så vejnettet geometrisk ret godt ud, men i ruteberegningssammenhæng er det f.eks. væsentligt, at data om hastighed er fuldgyldigt. Men det samlede shape-datasæt indeholder dog flere forskellige featureklasser til brug for f.eks. topografiske kort, så datasættet er stadigvæk brugbart i til andre formål.

Jeg forsøgte at rette op på datakvaliteten ved at analysere det på kryds og tværs og forbedre det i forhold til ruteoptimering. Jeg var klar over, at jeg skulle frem til en eller anden form for oplysning, der kunne afspejle omkostningen ved tilbagelægning af den enkelte vejstrækning.

Da jeg mente at datasættet var klar til at komme videre, kastede jeg mig ud i den næste forudsætning. At finde nogle ruteoptimeringsrutiner.

pgRouting

Jeg startede med at lede i Qgis plugins kasse, og fandt ret hurtigt ud af, at kodeordet hed pgRouting. Det vil sige ruteoptimering på basis at beregningsrutiner direkte i en PostGIS-database. Deraf “pg”. Det bragte mig ud i mange interessante database-problematikker, og jeg må sige at jeg lærte en del om PostGIS. Jeg var klar over, at jeg måtte finde løsningen til opgaven her.

Men ak – trods massiv googling, kom jeg ikke i mål med det downloadede datasæt, men blev en del erfaringer rigere.

Og så pludselig nærmest snublede jeg over den mest indlysende løsning: OSM-datasættet findes også som datasæt, der er forberedt specifikt til ruteoptimering i PostGIS. Jeg kendte ikke på forhånd formatet, så derfor var jeg i første omgang veget behændigt udenom. Der findes oveni købet specifikke rutiner til at downloade og gemme data i en PostGIS-database.

Så nu skulle jeg blot igennem følgende få rutiner, før jeg havde et brugbart rutenetværk:

  • download OSM-data i pbf-format
  • download java
  • download java rutine til at lægge data i databasen

Efter at have overstået et par tuer på vejen, havde jeg nu vejnettet for hele Danmark i PostGIS-databasen.

Det fordelagtige ved pbf-datasættet er, at der på forhånd er beregnet tidsomkostning for alle vejstrækninger og at der og er taget hensyn til ensretning. Det er her i disse attributdata (se indsat billede) i felterne cost og reverse cost. Ensretning indebærer en meget høj tidsomkost på 1000000 timer. Så er den del ligesom taget ud af ligningen.

Nu bliver det så desværre lidt “nørdet”, for der findes ikke super brugervenlige beregningsrutiner. Der findes ganske vist et plugin, der hedder “pgRouting Layer”, men det er fejlbehæftet, så det virkede ikke i min Qgis-installation. Derfor måtte jeg ty til beregning direkte i databasen, og så lave et view, som kunne vises i Qgis.

PostGIS beregningerne

Selvom sql-kode kan være lidt nørdet, så er der også noget smukt over det, når koden på en enkel måde, kan løse en kompliceret beregning.

Alle knudepunkter i rutenetværket har en unik node. For centrum af Billund har jeg brugt node nr. 8016. (simpelt opslag i Qgis). Jeg har valgt køretid på 1 time. Ved at definere følgende view i PostGIS databasen, kan jeg få vist de knudepunkter i rutenetværket, som kan nås indenfor en time. Beregningsrutinen hedder pgr_drivingsdistance.

create or replace view public.temp as
 SELECT seq, id1 AS node, id2 AS edge, cost, the_geom
 FROM pgr_drivingdistance(
 'SELECT id, source, target, cost FROM Public."OSMdk"',
 8016, 1.00, false, false
 ) as di
 JOIN Public."OSMdk_vertices_pgr" as pt
 ON di.id1 = pt.id;

Som nævnt giver det en række punkter, som kan vises i Qgis, og ved hjælp af en almindelig buffer-beregning, kan man lave dette smukke kort.

Efter mine erfaringer for kørsel til og fra min hjemby, passer det meget godt med virkelighedens køretider.

En spændende opgave som bragte mig vidt omkring. Lidt for vidt, men sådan kan det jo gå. 🙂