Körtidsanalyser

Tjorn

Vägnätet på Tjörn enligt NVDB.

Det här inlägget började som min egen dokumentation över arbetet med att göra körtidsanalyser och ruttoptimering. Med tiden har det vuxit och kanske finns det fler som har behov av liknande analyser, så det är lika bra att lägga ut dokumentationen på nätet.

Med jämna mellanrum får vi förfrågningar om att hjälpa till med projekt som involverar att analysera vägnät och körtider. Det kan handlar om att hjälpa till att besvara frågor av typen:

  • Vilken är den kortaste/snabbaste väg mellan A och B?
  • Hur långt kommer man med bil/cykel på 5/10/20 minuter från vårdcentralen?
  • Vilka ytor täcker vi med 30 minuters bilfärd från regionens alla sjukhus?

Eftersom vi redan använder PostgreSQL, PostGIS och QGIS valde jag att testa om pgRouting kan passa för vår del. I arbetet använder jag alltså dessa verktyg:

  • PostgreSQL inkl. PostGIS och pgRouting
  • pgAdmin
  • QGIS
  • FME

Jag planerar att lista alla steg jag gör för att göra ett par analyser och i detta första inlägg går jag igenom att hämta, ladda och testa vägnätet i databasen. Arbetsgången är:

  1. Hämta vägnätet NVDB. Regionen består av 49 kommuner, men under denna inledande fas valde jag ut en kommun som testområde. I första vändan valde jag bara egenskapen hastighetsgräns vid uttaget.
  2. Granskning av vägnätet i QGIS. Se att det ser någorlunda komplett ut och att önskade attribut finns med.
  3. Skapa en databas i PostGIS för vägnätet.
  4. De krav som jag har uppfattat ställs på vägnätet är:
    1. Attribut som ska finnas
      1. id (integer)
      2. source (integer)
      3. target (integer)
    2. Geometrier
      1. Använd geometry, dvs ej geography
      2. Lagras som LineString
      3. Använd enkla 2D-data, dvs utan Z- och M-värden
  5. Skriva vägnätet till PostGIS mha FME. När jag gjorde det lyckades jag först inte få till rätt geometrityp för geom, men jag fick tips om följande för att korrigera det:
    ALTER TABLE public.roads
    ALTER COLUMN geom TYPE geometry(LineString,3006) USING ST_Force2D(geom);
  6. För att bygga nätverkstopologi använder man funktionen pgr_createTopology:
    SELECT pgr_createTopology('public.roads', 0.0001, 'geom', 'id');

    Denna funktion skapar noder där väglänkar möts och går igenom vilken start- och slutnod respektive väglänk har. När jag kikar på resultatet i QGIS ser det lovande ut:

    pgr_createTopology resultat

    Vägnät och noder efter att pgr_createTopology har körts. Start- och slutnod (source och target) ser ut att stämma.

  7. Låt pgRouting undersöka kvaliteten på vägnät och noder mha funktionen pgr_analyzeGraph:
    SELECT pgr_analyzeGraph('public.roads', 0.0001, 'geom');

    Efter ett par sekunder fick jag “OK” som svar.

Därmed ligger vägnät med topologi för pgRouting i databasen och det börjar bli dags att göra ett par enklare analyser. Jag återkommer till det i kommande inlägg.

Lämna ett svar

E-postadressen publiceras inte. Obligatoriska fält är märkta *