Hvordan laste vegnett fra NVDB inn i QGIS med 6 linjer Python

I dag ble Kartverkets og Statens vegvesens skattekister åpnet, et frislipp mange har ventet på lenge. Vi hadde gleden av å presentere en ny prototype for dataleveranser av vegnett, hvor vegnettet kan hentes på GeoJSON-format gjennom en REST-basert webtjeneste: http://vegnett.vegdata.no/ Prototypen er lagt i graven

Kombinasjonen GeoJSON og REST kan gi mange muligheter i GIS-verktøy, spesielt de som har integrasjon mot språk som Python. Dette innlegget beskriver hvor enkelt og raskt det er å importere vegnettet inn klienten Quantum GIS (QGIS), som er basert på åpen kildekode.

APIet som tilbyr vegnett har foreløpig ikke mange paremetere, siden det kun er en prototype. En bruker har følgende valg:

  • Hent vegnettet innenfor hele Norge, innenfor et bestemt fylke, eller innenfor en bestemt kommune.
  • Hent vegnettet innenfor én eller flere vegkategorier: Europaveg (E), RIksveg (R), Fylkesveg (F), Kommunalveg (K), Privatveg (P), Skogsbilveg (S)

For å importere vegnettet inn i QGIS, er det ønskelig å lage en funksjon i Python som oppretter et nytt vektorlag. Funksjonen skal ha tre innparametere:

  1. Lokasjon
  2. Vegkategorier
  3. Lagnavn
def lag(sted, vegkategori, navn):
    api = 'http://vegnett.vegdata.no/nvdb/api/vegnett/' 
    uri = api+sted+'.json?kategori='+vegkategori

    lag = QgsVectorLayer(uri, navn, "ogr")
    QgsMapLayerRegistry.instance().addMapLayer(lag)

UTDATERT – denne vegnetts-prototypen eksisterer ikke lengre. Vegnettsendepunktet til NVDB api V1 kan brukes i stedet. Eksempel 

Merk at NVDB api’et V2 har fått nytt vegnett-endepunkt.

Ovenfor er den ferdige funksjonen, med 5 linjer Python-kode, pluss et mellomrom for å øke lesbarheten. De tre øverste linjene er selvforklarende.

Den nest nedeste linjen laster et vektorlag fra APIet, ved hjelp av OGR-biblioteket: http://www.qgis.org/en/docs/pyqgis_developer_cookbook/loadlayer.html

Den nederste linjen registrerer laget i QGIS sitt brukergrensesnitt: http://www.qgis.org/en/docs/pyqgis_developer_cookbook/canvas.html

Funksjonen kan kalles på følgende måte:

lag('17/19', 'ERF', 'Levanger ERF')

Koden ovenfor laster ned alle europa-, riks- og fylkesveger i Levanger kommune. Lokasjon angis ved hjelp av fylke- og kommunenummer. For en rask referanse, kan dere benytte samme liste som APIet prototypen benytter: http://vegnett.vegdata.no/js/lokasjon.js

Nedenfor er et utsnitt fra QGIS etter at koden ovenfor er kjørt.

vegnett-prototype

Med den grunnleggende funksjonen i boks, er det lett å utvide med mer avanserte spørringer etter data. Funksjonen nedenfor henter hele vegnettet i en bestemt fylke eller kommune, og oppretter samtidig ett lag for hver vegkategori.

def lag_kategorier(sted, navn):
    vegkategorier = ['e', 'r', 'f', 'k', 'p', 's']

    for kategori in vegkategorier:
        lag(sted, kategori, navn+' '+kategori)