Programmering mot API

Her legger vi ut eksempler og forklaringer på hvordan man kan hente ut data fra api’et. Vi er veldig glade i programmeringsspråket Python, men legger gjerne ut eksempler på bruk av api’et i andre språk eller verktøy.For eksempel det utrolig geniale verktøyet FME.

FME Wourld tour presentasjon 2014.05.06 og en del FME workspace eksempler: https://github.com/LtGlahn/vegdatalabs_fme (v1)

EDIT 2016: Et par enkle FME-workspaces mot V2 av NVDB api. Knut Jetlunds (@jetgeo) FME-rutiner for GML-skriving av vegnett og fagdata hentet fra NVDB api V2.

Vi bruker også emneknaggen NVDB api for en del bloggposter med tips & tricks.

V2 av NVDB api’et.

Versjon 2 av NVDB api har en rekke forbedringer fra V1, og er enklere og mer konsistent oppbygd. Det er enklere å jobbe mot – og i tillegg har du mer raffinerte søk, for eksempel overlappsfilter. For uttak av store datamengder er pagineringsfunskjonen vesentlig enklere i bruk.

Vi har en del eksempelkode rundt om kring, for eksempel python: Et par helt enkle rett-fram eksempler og en mer objektorientert tilnærming. Våre flinke utviklere har laget en fin klient i java.

Finn lenke til API-søk i Vegkart

Klikk på «treff» – teksten – og vips, så har du lenken for å hente data direkte fra NVDB api.

En av de geniale tingene med Vegkart er at alt du via nedlastingsknappen får fram api-kallet som er brukt i Vegkart-søket dit.Det vil si at du jobber interaktivt i Vegkart inntil du er fornøyd, og vips – med to klikk får du et fiks ferdig eksempel på  søk etter vegobjekter i API’et.

Trykk der det står NN Treff for å få frem nedlastingslenken.

 

Versjon 1 av NVDB api

Første eksempel V1: Søk etter objekt (python)

Denne funksjonen bruker api’ets søkefunksjon for å hente data av oppgitt type(r). Kall til tjenenesten må inneholde en liste med ett eller flere objekt(er) som det skal søkes på, ref dokumentasjonen på søkeobjekt.

Søket kan også avgrenses på geografisk område (boundingbox, kommune eller fylke) ved å oppgi  et såkalt lokasjonsobjekt (valgfritt).

Søket kan filtreres på vegkategori og vegnummer ved hjelp av objektfilter (valgfritt).

import requests
import json

def sok( objektTyper, lokasjon=''):
    # Se https://www.vegvesen.no/nvdb/api/sok for definisjon av
    # objektliste (obligatorisk) og lokasjon (valgfritt).

    url = 'https://www.vegvesen.no/nvdb/api/sok'
    if lokasjon: # Valgfritt
        sok = { 'lokasjon' : lokasjon,
                'objektTyper' : objektTyper
                }
    else:
        sok = { 'objektTyper' : objektTyper }

    headers = { 'Accept' : 
                   'application/vnd.vegvesen.nvdb-v1+json' }

    sok = json.dumps(sok)

    # Fornuftig feilhaandtering maa tilpasses rammeverket 
    # som bruker funksjonen
    try:
        r = requests.get( url, params = { 'kriterie' : sok }, 
                         headers = headers,  verify = False )
                            # verify=False pga sertifikatfeil 
                            # akkurat naa (fikses snart?)
    except Exception, e:
       print str(e)
       return False

    # Har vi faatt det vi vil ha?
    if (r.status_code != 200) or (r.headers['content-type'] !=
                       'application/vnd.vegvesen.nvdb-v1+json'):
        print "Not the right kind of response: ", \
              r.status_code, " ", r.headers['content-type']
        return False
    else:
        return r.json()

Eksempler:

data1 = sok( [{'id': 45, 'antall': 1}] )
import json
print json.dumps(data1, indent=4 )

data2 = sok( [{'id': 45, 'antall': 20}], lokasjon= { \ 
"srid": "UTM33", "bbox": \
"-37501.587503176,6563593.78965,-33723,6566647.08"} )

Sertifikatsjekk

Vegvesenets sertifikattilbyder er (foreløbig, evt ikke alltid) ikke inkludert i den gratispakken med sertifikater som følger med SSL-bibliotekene i verktøy som curl, python og wget, og til tider også nettleseren Firefox. For curl sin del er problemet beskrevet mer i detalj her: http://curl.haxx.se/docs/sslcerts.html. Paradokset er at nettleseren ofte vil ha mer oppdatert sertifikatinformasjon enn f.eks. din python-installasjon.

Dette problemet kan løses på to måter:

  1. Deaktiver sertifikatsjekk. I våre python-script er dette gjort ved nøkkelordene verify=False i kall til requests-funksjonene. 
  2. Få tak i oppgradert informasjon over godkjente sertifikattilbydere og bruk denne i ditt favorittverktøy. Til dels systemavhengig, kan være enkelt eller plundrete.