Package: nvdbapi-v3
Jobb interaktivt mot NVDB api V3Jobb interaktivt og objektorientert mot NVDB api V3!Les først gjennomhttps://nvdbapiles-v3.atlas.vegvesen.no/dokumentasjon/for nyttige tips og innblikk i logikken.Rutinene håndterer all kommunikasjon mot NVDB API, inklusive paginering (d.v.s. vi henter passe
store "bøtter" med data av gangen) Du føyer til dine egne søkefiltere, og du kan sjekke antall
treff før du laster ned data.Vi oppforder alle til å gi oss relevant kontaktinfo i form av http headere
X-Client og X-Kontaktperson. Dermed har vi bedre statistikk over hvem som bruker API'et til hva,
og kan også nå ut til brukerne ved problemer. Denne informasjonen lese fra filanvdbapi-clientinfo.json; bruk gjerne malennvdbapi-clientinfo-template.jsonsom utgangspunkt.Installer og kom i gangSøk og datanedlasting mednvdbapi-v3og spørringer mot NVDB api LES medapiforbindelseer publisert som enpypi-modul, og kan installeres medpip install nvdbapi-v3Merk bindestreken! Etter installasjon må du importerenvdbapiv3, uten bindestrek. Eksempel:import nvdbapiv3
sokeobjekt = nvdbapiv3.nvdbFagdata( 45)
liste_med_dict = sokeobjekt.to_records()Men - dette reposethttps://github.com/LtGlahn/nvdbapi-V3inneholder også en ganske mye kode for dataanalyse, bearbeiding etc. Dette er IKKE tatt med i pypi-modulen. Noe av grunnen er at dataanalytikere liker å velge verktøy selv. I tillegg reduserer vi risiko for versjonskonflikt drastisk ved at pypi-modulen har færrest mulig avhengigheter ut over standardbiblioteket til python - og installasjonen med pip går veldig mye kjappere. Så dersom du synes koden min for GIS-analyser er nyttig så må dulaste ned reposetog så installere f.eksgeopandaspå egen hånd.PrinsipperEtsøkeobjekthåndterer all mikk-makk rundt spørringer mot NVDB api, paginering etc.Vi har to typer søkeobjekternvdbVegnett - henter vegnett (lenksekvenser og tilhørende lenker)nvdbFagdata - henter en av de 400 fagdatatypene vi har definert iNVDB datakatalogSøkeobjektene har funksjoner for å avgrense søk, og hente ut alle data som tilfredssstiller søket.Noen funksjoner(f.eks. nvdb2geojson)tar et slik søkeobjekt og transformerer til andre datastrukturer, tabulære data m.m.Fra søkeobjektet kan du iterere over alle NVDB-objekter som tilfredsstiller søket ditt:Enten som JSON-objektrett fra NVDB apiEller som etnvdbFagObjekt, som har en del fiffige funksjoner for å hente ut egenskapverdier m.m.I tillegg til søkeobjekten har vi en del hjelpefunksjonerfinnid: Henter vegobjekt og/eller lenkesekvens med angitt IDnvdbfagdata2records: Flater ut NVDB-vegobjekt (direkte fra NVDB api) til enklere (forutsigbar) dictionary-strukturegenskaper2records: Oversetter liste med egenskapverdier til dictionarynvdbVegnettSøkeobjekt for å hente segmentert vegnett fra NVDB api.nvdbFagdata(objektTypeId)Søkeobjekt for å hente fagdata (ikke vegnett, men øvrige data om vegen). Totalt har vi definert i underkant av 400 ulike objekttyper
idatakatalogen.nvdbFagdata utvider klassen nvdbVegnett, og arver metoder og egenskaper fra denne.argumentet objektTypeID (heltall) angir hvilke objekttype vi jobber med, definert idatakatalogenFelles metoder for nvdbVegnett og nvdbFagdatarefresh()Sletter alle nedlastede data, og nullstiller telleverket i paginering.filter( FILTERARG )FILTERARG er en python dictionary med relevante filtre. SøkeobjektenenvdbVegnettognvdbFagdatastøtter begge geografiske filtre (fylke, kommune, kartutsnitt, vegsystemreferanse), men kunnvdbFagdatahar avanserte egenskapsfilter og overlappfilter. OgnvdbVegnettstøtter en del filter som kun er relevant for vegnett (typeeveg, adskilte løp etc).
Sedokumentasjon NVDB api V3Eksempelv = nvdbVegnett()
v.filter( { 'kommune' : 5001 } )
v.filter( { 'vegsystemreferanse' : 'ev6s76d1' } )
# Filteret har nå verdien { 'vegsystemreferanse' : 'ev6s76d1', 'kommune' : 5001 }nesteForekomst()Gir deg ett NVDB objekt (vegnett eller fagdata), i henhold til dine søkekriterier (filtre). Alle detaljer med datanedlasting fra API håndteres internt.v = nvdbFagdata(807) # Døgnhvileplass
p = v.nesteForekomst()
while p: 
	print o['id']
	o = v.nesteForekomst()nestePaginering()Bruker paginering til å neste "bøtte" med data fra NVDB forekomst, i henhold
til alle dine søkekriterier (filtre).Returerer True hvis dette ga gyldige data, og False når vi har hentet alle objektene.Du må selv kopiere data over fra listendata['objekter']p = nvdbFagdata( 809) # Døgnhvileplass 
p.paginering['antall'] = 3 # Jukser litt med antall forekomster per bøtte. 
TF = p.nestePaginering()
minliste = []
while TF: 
    minliste.extend( p.data['objekter'] )
	TF = p.nestePaginering()info()Skriver til konsoll alle filtere, pagineringsdetaljer, antall objekter i arbeidsminnet. FornvdbFagdatahenter vi også statistikk fra NVDB api om antall treff og lengde for dette søket.Flere metoder for nvdbFagdatanesteNvdbFagObjekt()Objektorientert tilnærming - returnerer neste forekomst av NVDB objektet som en instans av
klassennvdbFagObjektstatistikk()Spør NVDB api hvor mange forekomster som finnes med angitte filtre. Returnerer dict med antall treff
og  strekningslengde (antall meter). Strekningslengde er 0 for punktobjekter.egenskaper( egenskapsTypeID):Skriver ut definisjonen av angitt egenskapstype (ID, heltall).
Hvis ingen ID oppgis skriver vi ut en liste med ID, navn og type
for alle egenskapstyper for denne objekttypen.I stedet for ID (heltall) kan du også oppgi en tekststreng som sjekkes mot
navnet på egenskapstypene.Denne funksjonen er nyttig for å finne riktig verdi på egenskap- og overlappfiltere.p = nvdbFagdata( 809) # Døgnhvileplass 
p.egenskaper()
p.egenskaper(9270) # Vaskeplass for trailere
p.egenskaper( 'ask') # Fritekst-søk, matcher ID 9270Eksempler, avanserte søk med nvdbFagdataSøk etter NVDB fagdata (vegobjekter) har en del avanserte muligheter.Søk etter egenskapverdiTekststreng med filtre for egenskapsverdier. Se dokumentasjon foregenskapsfiltrep = nvdbFagdata( 809) # Døgnhvileplass 
p.filter( {  'egenskap': '9246=12886 AND 9273=12940') 
p.filter()
>>  {'egenskap': '9246=12886 AND 9273=12940'} 
p.filter( '' ) # Nullstiller alle filtre.OverlappsøkHenter fagdata som overlapper med annen objekttype (og denne kan evt også ha eget filter). Se dokumentasjon foroverlappfilteru = nvdbFagdata(570) # Trafikkulykker
u.filter( { 'overlapp' : '105(2021=2738)' }) #  Trafikkulykker med fartsgrense = 80 km/tTODO: Sjekk ut syntaks for overlapp mot flere objekttyper samtidig.Egenskaper nvdbVegnett og nvdbFagdataVariabelVerdidataHolder nedlastede data (i listenobjekter) og metadatafilterHolder alle filtreheadershttp headere som følger alle kall mot APIsisteanropSiste kall som gikk mot NVDB APIobjektTypeIDID til objekttypen (ikke nvdbVegnett)objektTypeDefDatakatalogdefinisjon for objekttypen (ikke nvdbVegnett)antallAntall objekter i NVDB som tilfredsstiller kriteriene, hentes fra statistikkspørring mot API (ikke nvdbVegnett)strekningslengdeTotal lengde på objektene i NVDB som tilfredsstiller søkekriteriene, hentes fra statistikkspørring mot API (ikke nvdbVegnett)nvdbFagObjektKlasse for objektorientert behandling av fagdata. Har for eksempel gode metoder for å
spørre etter egenskapverdier.egenskap( id_or_navn, empty=None)Returnerer egenskapstype (dataverdi pluss metadata). Via nøkkelordet empty kan man angi ønsket retur hvis egenskapen ikke finnes.Argumentetid_or_navnkan være heltall (datakatalog ID, mest skuddsikkert) eller (deler av) navnet på egenskapstypen.egenskapverdi( id_or_navn, empty=None)Som funksjonen "egenskap", men returnerer kun egenskapsverdien (selve dataverdien).eksempel:tunnellop=nvdbapi.nvdbFagdata(67)ettLop=tunnellop.nesteNvdbFagObjekt()# Henter egenskapen "Navn" for dette tunnelløpetettLop.egenskap('Navn')# Henter kun egenskapsverdienettLop.egenskapsverdi('Navn')# Bruker datakatalog ID i stedet for navn (mer skuddsikkert)ettLop.egenskapsverdi(1081)# Forkortelser eller deler av egenskapsnavnet er OK#(merk: Ingen sjekk på om frasen matcher flere egenskapsnavn, du får det første treffet)ettLop.egenskap('MERK')# Gir første case *in*sensitive treff på frasen "merk" i egenskapsnavnet.# Angi at du vil ha tom streng (""), ikke None hvis egenskapstypen ikke finnes# (Nei, vi sjekker ikke om dette er en lovlig egenskap for denne objekttypen etter datakatalogen)tomStreng=ettLop.egenskapsverdi('finnes ikke',empty='')enumverdi( _id_or_navn, empty=None)Som funksjonen "egenskapsverdi", men returnerer enmu_id - ikke dataverdien. Vil returnere None (eller din "empty"-verdi)
hvis du bruker funksjonen på egenskaper som IKKE er enum (flervalg,tekst eller flervalg, tall).wktReturnerer koordinatene til objektets geometri somWell Known Textrelasjon(relasjon=None)Returnerer en liste med alle relasjoner (default, uten argumenter), eller
med nøkkelordetrelasjon=verdireturneres en liste med subsett
av relasjoner. Mulige verdier for nøkkeordrelasjonerbarn,foreldre,egenskapsIDelleregenskapsnavntil din favoritt objekttype.eksempel:tunnellop=nvdbapi.nvdbFagdata(67)ettLop=tunnellop.nesteNvdbFagObjekt()# Henter mor-tunnellen, 3 ulike metodermor=ettLop.relasjon(relasjon='foreldre')mor=ettLop.relasjon(relasjon='Tunnel')mor=ettLop.relasjon(relasjon='581')# Henter datterobjekt Tunnelportal,tp=ettlop.relasjon(relasjon='Tunnelport')# Delvis matchtp=ettlop.relasjon(relasjon='Tunnelportal')# Eksakt matchtp=ettlop.relasjon(relasjon=69)# henter alle barnbarn=ettlop.relasjon(relasjon='barn')finnid - finn fagdata eller vegnett ut fra NVDB IdHjelpefunksjonenfinnid(objektid)søker etter NVDB objekter og lenkesekvens med angitt objektid.fart = nvdbapi.finnid(85288328, kunfagdata=True) # python-dict
fartobj = nvdbFagObjekt(fart)   # Objektorientert representasjon, se definisjonen nvdbFagobjekt


v = nvdbapi.finnid(521218, kunvegnett=True)   # Liste med lenker som finnes på lenkesekvens 521218For fagdata returneres en DICT for angjeldende objekt. Denne kan gjøres om til et nvdbFagObjekt.For vegnett returneres en liste med de veglenke-delene som inngår i denne lenkesekvensen.