def firefeltrapport(mittfilter={}): """ Finner alle firefeltsveger i Norge, evt innafor angitt søkekriterie Bruker søkeobjektet nvdbapiv3.nvdbVegnett fra biblioteket https://github.com/LtGlahn/nvdbapi-V3 ARGUMENTS None KEYWORDS: mittfilter: Dictionary med søkefilter RETURNS geodataframe med resultatet """ v = nvdbapiv3.nvdbVegnett() # Legger til filter på kun fase = V (eksistende veg), såfremt det ikke kommer i konflikt med anna filter if not 'vegsystemreferanse' in mittfilter.keys(): mittfilter['vegsystemreferanse'] = 'Ev,Rv,Fv,Kv,Sv,Pv' if not 'kryssystem' in mittfilter.keys(): mittfilter['kryssystem'] = 'false' if not 'sideanlegg' in mittfilter.keys(): mittfilter['sideanlegg'] = 'false' v.filter(mittfilter) # Kun kjørende, og kun øverste topologinivå, og ikke adskiltelop=MOT v.filter({ 'trafikantgruppe': 'K', 'detaljniva': 'VT,VTKB', 'adskiltelop': 'med,nei' }) data = [] vegsegment = v.nesteForekomst() while vegsegment: if sjekkfelt(vegsegment, felttype='firefelt'): vegsegment['feltoversikt'] = ','.join(vegsegment['feltoversikt']) vegsegment['geometri'] = vegsegment['geometri']['wkt'] vegsegment['vref'] = vegsegment['vegsystemreferanse']['kortform'] vegsegment['vegnr'] = vegsegment['vref'].split()[0] vegsegment['vegkategori'] = vegsegment['vref'][0] vegsegment['adskilte løp'] = vegsegment['vegsystemreferanse'][ 'strekning']['adskilte_løp'] data.append(vegsegment) vegsegment = v.nesteForekomst() if len(data) > 1: mindf = pd.DataFrame(data) mindf['geometry'] = mindf['geometri'].apply(wkt.loads) mindf.drop('geometri', 1, inplace=True) mindf.drop('kontraktsområder', 1, inplace=True) mindf.drop('riksvegruter', 1, inplace=True) mindf.drop('href', 1, inplace=True) mindf.drop('metadata', 1, inplace=True) mindf.drop('kortform', 1, inplace=True) mindf.drop('veglenkenummer', 1, inplace=True) mindf.drop('segmentnummer', 1, inplace=True) mindf.drop('startnode', 1, inplace=True) mindf.drop('sluttnode', 1, inplace=True) mindf.drop('referanse', 1, inplace=True) mindf.drop('målemetode', 1, inplace=True) mindf.drop('måledato', 1, inplace=True) minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973) return minGdf else: return None
def nvdb2gpkg(objekttyper, filnavn='datadump', mittfilter=None, vegnett=True, vegsegmenter=False, geometri=True): """ Lagrer NVDB vegnett og angitte objekttyper til geopackage ARGUMENTS objekttyper: Liste med objekttyper du vil lagre KEYWORDS mittfilter=None : Dictionary med filter til søkeobjekt i nvdbapiv3.py, for eksempel { 'kommune' : 5001 } Samme filter brukes på både vegnett og fagdata vegnett=True : Bool, default=True. Angir om vi skal ta med data om vegnett eller ikke vegsegmenter=False : Bool, default=False. Angir om vi skal repetere objektet delt inn etter vegsegementer geometri=True : Bool, default=True. Angir om vi skal hente geometri fra egengeometri (hvis det finnes) Hvis du ønsker å presentere vegobjekt ut fra objektets stedfesting langs veg så bruker du kombinasjonen vegsegmenter=True, geometri=False. Ett enkelt objekt blir da repetert for hvert vegsegment som det er tilknyttet (stedfestet til). Standardverdiene vegsegmenter=False, geometri=True er valgt ut fra antagelsen om at du ønsker en rad per objekt, uten duplisering. RETURNS None """ if not '.gpkg' in filnavn: filnavn = filnavn + '_' + datetime.today().strftime( '%Y-%m-%d') + '.gpkg' if not isinstance(objekttyper, list): objekttyper = [objekttyper] for enObjTypeId in objekttyper: enObjTypeId = int(enObjTypeId) sok = nvdbapiv3.nvdbFagdata(enObjTypeId) if mittfilter: sok.filter(mittfilter) stat = sok.statistikk() objtypenavn = sok.objektTypeDef['navn'] print('Henter', stat['antall'], 'forekomster av objekttype', sok.objektTypeId, objtypenavn) lagnavn = 'type' + str(enObjTypeId) + '_' + nvdbapiv3.esriSikkerTekst( objtypenavn.lower()) rec = sok.to_records(vegsegmenter=vegsegmenter, geometri=geometri) # Lagringsrutine skilt ut med funksjonen records2gpkg, IKKE TESTET (men bør gå greit) if len(rec) > 0: records2gpkg(rec, filnavn, lagnavn) else: print('Ingen forekomster av', objtypenavn, 'for filter', mittfilter) if vegnett: veg = nvdbapiv3.nvdbVegnett() if mittfilter: junk = mittfilter.pop('egenskap', None) junk = mittfilter.pop('overlapp', None) veg.filter(mittfilter) print('Henter vegnett') rec = veg.to_records() mindf = pd.DataFrame(rec) mindf['geometry'] = mindf['geometri'].apply(wkt.loads) mindf.drop('geometri', 1, inplace=True) minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973) minGdf.to_file(filnavn, layer='vegnett', driver="GPKG")
def nvdb2gpkg(objekttyper, filnavn='datadump', mittfilter=None): """ Lagrer NVDB vegnett og angitte objekttyper til geopackage ARGUMENTS objekttyper: Liste med objekttyper du vil lagre KEYWORDS mittfilter=None : Dictionary med filter til søkeobjekt i nvdbapiv3.py, for eksempel { 'kommune' : 5001 } Samme filter brukes på både vegnett og fagdata RETURNS None """ if not '.gpkg' in filnavn: filnavn = filnavn + datetime.today().strftime('%Y-%m-%d') + '.gpkg' if not isinstance(objekttyper, list): objekttyper = [objekttyper] for enObjTypeId in objekttyper: enObjTypeId = int(enObjTypeId) sok = nvdbapiv3.nvdbFagdata(enObjTypeId) if mittfilter: sok.filter(mittfilter) stat = sok.statistikk() objtypenavn = sok.objektTypeDef['navn'] print('Henter', stat['antall'], 'forekomster av objekttype', sok.objektTypeId, objtypenavn) lagnavn = 'type' + str(enObjTypeId) + '_' + nvdbapiv3.esriSikkerTekst( objtypenavn.lower()) rec = sok.to_records(vegsegmenter=False, geometri=True) if len(rec) > 0: mindf = pd.DataFrame(rec) # Må trickse litt for å unngå navnekollisjon kolonner = list(mindf.columns) lowerkolonner = [x.lower() for x in kolonner] # Duplicate element indices in list # Using list comprehension + list slicing # https://www.geeksforgeeks.org/python-duplicate-element-indices-in-list/ res = [ idx for idx, val in enumerate(lowerkolonner) if val in lowerkolonner[:idx] ] for ii, dublett in enumerate(res): mindf.rename(columns={ mindf.columns[dublett]: kolonner[dublett] + '_' + str(ii + 1) }, inplace=True) mindf['geometry'] = mindf['geometri'].apply(wkt.loads) minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973) # må droppe kolonne vegsegmenter hvis du har vegsegmenter=False if 'vegsegmenter' in minGdf.columns: minGdf.drop('vegsegmenter', 1, inplace=True) minGdf.drop('geometri', 1, inplace=True) minGdf.to_file(filnavn, layer=lagnavn, driver="GPKG") else: print('Ingen forekomster av', objtypenavn, 'for filter', mittfilter) veg = nvdbapiv3.nvdbVegnett() if mittfilter: veg.filter(mittfilter) print('Henter vegnett') rec = veg.to_records() mindf = pd.DataFrame(rec) mindf['geometry'] = mindf['geometri'].apply(wkt.loads) mindf.drop('geometri', 1, inplace=True) minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973) minGdf.to_file(filnavn, layer='vegnett', driver="GPKG")
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 nvdbsok2qgis, og er dokumentert der. """ # 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.filter( { '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 'veglenkesekvensid' 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) ) print( f*g ) 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")
def vegnett2gdf(mittfilter={}): """ Lager geodataframe ut fra spørring (søkeobjekt nvdbVegnett) Bruker søkeobjektet nvdbapiv3.nvdbVegnett fra biblioteket https://github.com/LtGlahn/nvdbapi-V3 ARGUMENTS None KEYWORDS: mittfilter: Dictionary med søkefilter RETURNS Geodataframe med resutaltet """ v = nvdbapiv3.nvdbVegnett() if not 'vegsystemreferanse' in mittfilter.keys(): mittfilter['vegsystemreferanse'] = 'Ev,Rv,Fv,Kv,Sv,Pv' v.filter(mittfilter) data = [] # vegsegment = v.nesteForekomst() for vegsegment in v: # if sjekkfelt( vegsegment, felttype='firefelt'): if 'feltoversikt' in vegsegment: vegsegment['feltoversikt'] = ','.join(vegsegment['feltoversikt']) vegsegment['geometri'] = vegsegment['geometri']['wkt'] vegsegment['vref'] = vegsegment['vegsystemreferanse']['kortform'] vegsegment['vegnr'] = vegsegment['vref'].split()[0] vegsegment['adskilte løp'] = vegsegment['vegsystemreferanse'][ 'strekning']['adskilte_løp'] vegsegment['vegkategori'] = vegsegment['vref'][0] vegsegment['trafikantgruppe'] = vegsegment['vegsystemreferanse'][ 'strekning']['trafikantgruppe'] data.append(vegsegment) if len(data) > 1: mindf = pd.DataFrame(data) mindf['geometry'] = mindf['geometri'].apply(wkt.loads) mindf.drop('geometri', 1, inplace=True) mindf.drop('kontraktsområder', 1, inplace=True) mindf.drop('riksvegruter', 1, inplace=True) mindf.drop('href', 1, inplace=True) mindf.drop('metadata', 1, inplace=True) mindf.drop('kortform', 1, inplace=True) mindf.drop('veglenkenummer', 1, inplace=True) mindf.drop('segmentnummer', 1, inplace=True) mindf.drop('startnode', 1, inplace=True) mindf.drop('sluttnode', 1, inplace=True) mindf.drop('referanse', 1, inplace=True) mindf.drop('målemetode', 1, inplace=True) mindf.drop('måledato', 1, inplace=True) minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973) return minGdf else: return None