def enkeltSkredFagObj(): skredO = nvdbapi.nvdbFagdata(445) skredO.addfilter_geo( { 'vegreferanse' : '1400 fv241 hp1'} ) #skredO.addfilter_egenskap('2326=4198') #ettobjekt = skredO.egenskapverdi() return ettobjekt
def lastned(objtypeId, mappe, v2filter): sokv2 = nvdbapi.nvdbFagdata(objtypeId) sokv3 = nvdbapiv3.nvdbFagdata(objtypeId) # Hvilket miljø bruker vi? # sokv2.apiurl = 'https://www.test.vegvesen.no/nvdb/api/v2' # sokv3.miljo( 'test') Path(mappe).mkdir(parents=True, exist_ok=True) sokv2.addfilter_geo(v2filter) (allev2, manglerv2) = mengdeuttak(sokv2, antall=1e12) vref = v2filter.pop('vegreferanse') v3filter = deepcopy(v2filter) if vref: v3filter['vegsystemreferanse'] = vref sokv3.addfilter_geo(v3filter) (allev3, manglerv3) = mengdeuttak(sokv3, antall=1e12) oo = '_' + str(objtypeId) + '_' + vref with open(mappe + 'mangler_geometriv3' + oo + '.json', 'w', encoding='utf-8') as f: json.dump(manglerv3, f, ensure_ascii=False, indent=4) with open(mappe + 'mengdeuttak_v3' + oo + '.json', 'w', encoding='utf-8') as f: json.dump(allev3, f, ensure_ascii=False, indent=4) with open(mappe + 'mangler_geometriv2' + oo + '.json', 'w', encoding='utf-8') as f: json.dump(manglerv2, f, ensure_ascii=False, indent=4) with open(mappe + 'mengdeuttak_v2' + oo + '.json', 'w', encoding='utf-8') as f: json.dump(allev2, f, ensure_ascii=False, indent=4) minlogg = sammenlign(allev3, allev2, sokefilter=v3filter) print(minlogg) return minlogg
def enkeltSkred(): #a = nvdbapi.nvdbFagdata(445) #a.addfilter_geo( { 'vegreferanse' : 'fv241', 'fylke' : 14} ) #a.addfilter_egenskap('2326=4198') ##skredObj.addfilter_egenskap('2326=4198') #stat = a.statistikk() #print(stat) #b = a.nesteNvdbFagObjekt() #print(b.egenskaper()) n = nvdbapi.nvdbFagdata(445) n.addfilter_geo( {'vegreferanse' : '1400 fv241 obj = rstat.json()'}) n.addfilter_egenskap('2326=4198') skred = n.nesteForekomst() print(skred) print(n.statistikk()) return 'ok'
def hentSkred(veg='Fv241', fylke=14): skredtypenr = [4198, 4199, 5351, 4200, 4201, 4202, 4203, 13103] skredtype = {4198 : 'Stein', 4199: 'Jord/løsmasse', 5351: 'Is/stein', 4200: 'Snø', 4201: 'Is', 4202: 'Flomskred (vann+stein+jord)', 4203: 'Sørpeskred (vann+snø+stein)', 13103: 'Utglidning av veg'} liste = [] skred = nvdbapi.nvdbFagdata(445) skred.addfilter_geo( { 'vegreferanse' : veg, 'fylke' : fylke}) #print(skred.egenskaper()) #skred.addfilter_egenskap('2326=4198') #stat = skred.statistikk() #liste.append((skredtype[skredtypenr[0]], stat['antall'])) sNum = 0 data = [] for i in skredtypenr: #print(i) #print(skredtype[i]) skred.addfilter_egenskap('2326=' + str(skredtypenr[sNum])) stat = skred.statistikk() data.append([skredtype[i], stat['antall']]) sNum = sNum + 1 return data
def hentfelt(veglenke, posisjon): # Bug, må ha strekning fra-til, ikke match på punkt: delta = 0.0000000001 if posisjon - delta < 0: a = posisjon b = posisjon + 2 * delta elif posisjon + delta > 1: a = posisjon - 2 * delta b = posisjon else: a = posisjon - delta b = posisjon + delta felt = nvdbapi.nvdbFagdata(616) geofilter = {'veglenke': str(a) + '-' + str(b) + '@' + str(veglenke)} felt.addfilter_geo(geofilter) mittfelt = felt.nesteNvdbFagObjekt() if mittfelt: data = mittfelt.egenskapverdi('felt', empty='') else: data = '1#2' print("Fant ingen feltstrekning for: " + geofilter['veglenke']) # Sjekker om det finnes flere: test = felt.nesteNvdbFagObjekt() while test: blurp = mittfelt.egenskapverdi('felt') if blurp == data: print('Fant flere feltstrekningobj ' + geofilter['veglenke']) else: print('Fant flere feltstrekningobj DATA MISMATCH' + geofilter['veglenke']) test = felt.nesteNvdbFagObjekt() return data
#tettsted[ tettsted.Areal_km2 > 50].sort_values('Areal_km2', ascending=False ) # Dette er storbyene våre. Hvem er de minste tettstedene? # In[25]: #tettsted.sort_values('Areal_km2' ).head() # # Les data fra Nasjonal vegdatabank # In[6]: turistveger = nvdbapi.nvdbFagdata(777) turistveger_geojson = nvdb2geojson.fagdata2geojson( turistveger) turist2 = gpd.GeoDataFrame.from_features( turistveger_geojson['features']) # # Finn turistveger i tettsteder # # http://geopandas.org/mergingdata.html , spatial joins. Først må vi sette # koordinatsystem. Merk at du bygger koordinatsystem i geopandas med linje kode. # http://geopandas.org/projections.html#re-projecting # # # In[8]: tettsted.crs = {'init': 'epsg:25833'}
for bom in data: #curs.execute( 'INSERT INTO bomstasjoner( geom, id, Navn, anlId, bomId, ekteretning, felt, innkrevingsretning, kompassretn, muligeFelt, status, veg, veglenke, veglenkepos )' # 'VALUES( ST_SetSRID(%(geom)s::geometry, %(srid)s), %(id)s, %(Navn)s, %(anlId)s, %(bomId)s, %(ekteretning)s, %(felt), %(innkrevingsretning), %(kompassretn), %(muligeFelt), %(status), %(veg), %(veglenke), %(veglenkepos) )' , # bom) # conn.commit() curs.execute( 'INSERT INTO bomstasjoner( geom, id, navn, anlid, bomid, ekteretning, felt, innkrevingsretning, vegnettretn, metreringretn, kompassretn, muligefelt, status, veg, veglenke, veglenkepos)' 'VALUES( ST_SetSRID(%(geom)s::geometry, %(srid)s), %(id)s, %(Navn)s, %(anlId)s, %(bomId)s, %(ekteretning)s, %(felt)s, %(innkrevingsretning)s, %(vegnettretn)s, %(metreringretn)s, %(kompassretn)s, %(muligeFelt)s, %(status)s, %(veg)s, %(veglenke)s, %(veglenkepos)s )', bom) conn.commit() ### Start her! data = [] bomstasjoner = nvdbapi.nvdbFagdata(45) # Henter bomstasjoner med gyldige verdier for bomst.id og bompengeanlegg.id # bomstasjoner.addfilter_egenskap( '9596!=null AND 9595!=null' ) # bomstasjoner.addfilter_egenskap( '9595=15 AND 9596=8') print(['Filtre: ', bomstasjoner.allfilters()]) bomst = bomstasjoner.nesteNvdbFagObjekt() while bomst: print(bomst.egenskapverdi('Navn bomstasjon')) tmp = {'felt': ''} tmp['id'] = bomst.id
def fagdata2geojson(fagdata, maxcount=False, vegsegmenter=True, ignoreregenskaper=False, ignorervegref=False, strictGeometryType=True): """Konverterer NVDB fagdata til geojson feature collection NB utm sone 33 UTM sone 33 (epsg:25833) er ikke standard geojson lenger, men vi angir det likevel i header. Args: fagdata : nvdbFagObjekt fra nvdbapi.py (søkeobjekt som henter data fra NVDB api) Keywords: maxcount (0) Integer : Barnesikring, default av. Skru på ved å angi heltall større enn 0. vegsegmenter (True) Boolean : Lag et objekt per vegsegment hvis stedfestet på mer enn ett vegsegment Se forklaring under. ignoreegenskaper (False) Boolean : Dropp egenskapsverdier ignorevegref (False) Boolean : Dropp vegreferanse-detaljer strictGeometryType (True) Boolean : Krev at geometritypen er slik som definert i datakatalogen. Medfører f.eks at vi ignorerer linjer som har degenerert til punkt (pga kort utstrekning) Returns: Python Dict geojson feature collections Eksempel f = ndbFagdata(105) # Fartsgrense f.addfilter_geo( { 'kommune' : 1601, 'vegreferanse' : 'Ev6' }) gjson = fagdata2geojson( f) Mange vegobjekter er stedfestet på mer enn en veglenke/veglenkedel. I NVDB API er dette synlig ved at objektet går over mer enn ett vegsegment (ved å føye til parameter &inkluder=vegsegmenter i spørringen). Disse objektene vil typisk ha en MULTIPOINT/MULTILINESTRING-geometri, satt sammen av POINT/LINESTRING-verdiene fra alle vegsegmentene. Altså får du en blanding av LINE- og MULTILINE-string i resultatsettet. Default (vegsegmenter=True) er at vi oppretter en unik geojson-feature per vegsegment. NVDB ID og egenskapsverdier blir like, og i tillegg numererer vi segmentene og oppgir hvor mange segmenter som inngår i det opprinnelige NVDB-fagobjektet. (egenskapene "vegsegment nr", "antall vegsegment") Fordeler * Unike vegreferanser per geojson-feature(vegnummer, hp og meterverdier) * Unike veglenke-ID og veglenkeposisjon per geojson-feature * Ingen MULTIPONT/MULTILINESTRING-geometri Ulemper * Mister informasjon om egengeometri Alternativt kan man angi nøkkelord vegsegmenter=False. Da får man potensielt en multi-geometri. Fordelen er at man får evt egengeometri (der det finnes) """ mygeojson = geojsontemplate() if isinstance(fagdata, nvdbapi.nvdbFagdata): if strictGeometryType: geometrityper = fagdata.objektTypeDef['stedfesting'] else: geometrityper = '' f*g = fagdata.nesteForekomst() count = 0 stopp = False while f*g and not stopp: # Sjekker om vi har tomme data (typisk fagdata på historisk vegnett) if len(f*g['vegsegmenter']) > 0: mygeojson = __addfag2geojson( f*g, mygeojson, vegsegmenter=vegsegmenter, ignoreregenskaper=ignoreregenskaper, ignorervegref=ignorervegref, geometrityper=geometrityper) else: print('Ignorerer tomt objekt ' + f*g['href']) count += 1 if maxcount and count >= maxcount: stopp = True f*g = fagdata.nesteForekomst() elif isinstance(fagdata, dict) and 'egenskaper' in fagdata.keys(): mittobj = nvdbapi.nvdbFagdata(fagdata['metadata']['type']['id']) if strictGeometryType: geometrityper = mittobj.objektTypeDef['stedfesting'] else: geometrityper = '' mygeojson = __addfag2geojson(fagdata, mygeojson, vegsegmenter=vegsegmenter, ignoreregenskaper=ignoreregenskaper, ignorervegref=ignorervegref, geometrityper=geometrityper) else: warn("Sorry, gjenkjente ikke dette som NVDB fagdata") return mygeojson
# download the appropriate wheel for your python version and platform # (python 2.x or 3.x, 32 or 64 bit architecture of your PYTHON INSTALLATION # (on 64 bit machines you may choose 32 or 64 bit installations of python , # so beware)) def reverseShapelyCoords_dropZ(shapelygeom): """ Reverses the axis order (X,Y => Y,X) and drops the Z coordinate from input shapely geometry object """ if type(shapelygeom) == 'shapely.geometry.multilinestring.MultiLineString': pass turistveger = nvdbapi.nvdbFagdata(777) turistveger.respons['srid'] = 4326 # lat/lon coordinates myGeojson = { "type": "FeatureCollection", "features": [] } turistveg1 = turistveger.nesteNvdbFagObjekt() while turistveg1: egenskaper = { 'navn' : turistveg1.egenskapverdi('Navn'), 'linkturistveg' : turistveg1.egenskapverdi('Link turistveg'), 'status' : turistveg1.egenskapverdi('Status') }
def nvdb2kart(nvdbref, iface, kunfagdata=True, kunvegnett=False, miljo='prod', lagnavn=None, **kwargs): """ Legger noe fra NVDB til kartflaten. Dette kan være en ID til nvdb veglenke(r) eller fagobjekt, eller et søkeobjekt (nvdbFagdata eller nvdbVegnett). Et søkeobjekt vil bli avgrenset til QGIS kartflate. (Hvis dette ikke er ønsket - send direkte til funksjonen nvdb2qgis) Nøkkelordene kunfagdata, kunvegnett og miljø sendes til funksjonen nvdbapi.finnid. Resten av nøkkeordene sendes til funksjonen """ # Konverterer string => int if isinstance(nvdbref, str): try: nvdbref = int(nvdbref) except ValueError: pass if (isinstance( nvdbref, nvdbFagdata) or \ isinstance( nvdbref, nvdbVegnett)): ext = iface.mapCanvas().extent() kartutsnitt = str(ext.xMinimum()) + ',' + \ str(ext.yMinimum()) + ',' + str(ext.xMaximum()) + \ ',' + str(ext.yMaximum()) nvdbref.addfilter_geo({'kartutsnitt': kartutsnitt}) nvdbsok2qgis(nvdbref, **kwargs) elif isinstance(nvdbref, int): f*g = finnid(nvdbref, kunfagdata=kunfagdata, kunvegnett=kunvegnett, miljo=miljo) if f*g: if isinstance(f*g, dict) and 'id' in f*g.keys(): sokeobj = nvdbFagdata(f*g['metadata']['type']['id']) sokeobj.data['objekter'].append(f*g) sokeobj.antall = 1 if not lagnavn: lagnavn = str(f*g['metadata']['type']['id']) + \ '_' + str( nvdbref) elif isinstance( f*g, list) and len(f*g) > 0 and \ isinstance( f*g[0], dict) and 'veglenkeid' in f*g[0].keys(): sokeobj = nvdbVegnett() sokeobj.data['objekter'] = f*g sokeobj.antall = len(f*g) lagnavn = 'veglenke_' + str(nvdbref) else: print("fant ingen data???", str(nvdbref)) return sokeobj.paginering['dummy'] = True sokeobj.paginering['hvilken'] = 0 # Sender til kartet nvdbsok2qgis(sokeobj, lagnavn=lagnavn, **kwargs) else: print("kjente ikke igjen", nvdbref, "som NVDB referanse eller søkeobjekt")