def hentNvdbdata(objType, nvdbFilter): sok = nvdbapiv3.nvdbFagdata(objType) sok.filter(nvdbFilter) data = pd.DataFrame(sok.to_records()) if len(data) == 0: data = pd.DataFrame(columns=[ 'objekttype', 'nvdbId', 'versjon', 'startdato', 'veglenkesekvensid', 'detaljnivå', 'typeVeg', 'kommune', 'fylke', 'vref', 'vegkategori', 'fase', 'nummer', 'startposisjon', 'sluttposisjon', 'segmentlengde', 'adskilte_lop', 'trafikantgruppe', 'geometri' ]) data.rename(columns={ 'vegkategori': 'Vegkategori', 'nvdbId': 'Objekt Id', 'nummer': 'vegnummer' }, inplace=True) # Lengde for punktdata, ellers tryner det if not 'segmentlengde' in data: data['segmentlengde'] = np.nan return data
def getLayers(task, item, qtGui): """ Raises an exception to abort the task. Returns a result if success. The result will be passed, together with the exception (None in the case of success), to the on_finished method. If there is an exception, there will be no result. """ item_text = item item_id = getID(item) item = nvdbFagdata(item_id) if qtGui.kommuneCheck.isChecked(): kommuneID = getKommuneID(str(qtGui.kommuneBox.currentText())) item.filter({'kommune': kommuneID}) elif qtGui.kontraktCheck.isChecked(): item.filter({'kontraktsomrade': str(qtGui.kontraktBox.currentText())}) else: fylkeID = getFylkeID(str(qtGui.fylkeBox.currentText())) item.filter({'fylke': fylkeID}) if returnSelectedVegreferanse() != "Alle": item.filter({'vegsystemreferanse': [returnSelectedVegreferanse()[0]]}) if task.isCanceled(): stopped(task) return None # raise an exception to abort the task if task == "Ikke test denne": raise Exception('no pls') return {'name': task, 'item': item, 'item_text': item_text}
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 getLayersFromPreset(task, item, areaType, area, road): item_text = item item_id = getID(item) item = nvdbFagdata(item_id) if areaType == "kommune": kommuneID = getKommuneID(area) item.filter({'kommune': kommuneID}) elif areaType == "kontraktsomrade": item.filter({'kontraktsomrade': area}) else: fylkeID = getFylkeID(area) item.filter({'fylke': fylkeID}) if road != "Alle": item.filter({'vegsystemreferanse': road[0]}) if task.isCanceled(): stopped(task) return None # raise an exception to abort the task if task == "Ikke test denne": raise Exception('no pls') return {'name': task, 'item': item, 'item_text': item_text}
import lastnedvegnett import skrivdataframe import nvdbapiv3 t0 = datetime.now() mittfilter = lastnedvegnett.filtersjekk() mittfilter['vegsystemreferanse'] = 'Fv' junk = mittfilter.pop('historisk', None) # myGdf = lastnedvegnett.vegnetthelelandet( mittfilter=mittfilter ) # myGdf.to_file( 'vegnetthelelandet.gpkg', layer='norge', driver='GPKG') # myGdf = gpd.read_file( 'vegnetthelelandet.gpkg', layer='norge') # lastnedvegnett.rapport01_gdf2excel( myGdf, filnavn='../kostraleveranse2020/Kostra 01 - Vegnett hele landet.xlsx', metadata=mittfilter) sok = nvdbapiv3.nvdbFagdata(595) sok.filter(mittfilter) data = sok.to_records() mydf = pd.DataFrame(data) lengde = mydf.groupby(['fylke', 'vegkategori', 'nummer']).agg({ 'segmentlengde': 'sum' }).reset_index() lengde['Veg'] = 'FV' + lengde['nummer'].astype(str) lengde['Lengde (m)'] = lengde['segmentlengde'] lengde = lengde[['fylke', 'Veg', 'Lengde (m)']] skrivdataframe.skrivdf2xlsx( lengde, 'Kostra 02 - Fylkesveg med motorveg og motortrafikkveg.xlsx',
import sqlite3 from shapely import wkt from shapely.ops import unary_union import pandas as pd import geopandas as gpd from datetime import datetime import STARTHER import nvdbapiv3 from apiforbindelse import apiforbindelse if __name__ == '__main__': jb = nvdbapiv3.nvdbFagdata( 100) # jb.filter( { 'overlapp' : '900'}) dfjb = pd.DataFrame( jb.to_records( )) bk = nvdbapiv3.nvdbFagdata( 900) bk.filter( { 'overlapp' : '100'}) dfbk = pd.DataFrame( bk.to_records( ) ) dfbk_2 = dfbk[['objekttype', 'nvdbId', 'Bruksklasse', 'Bruksklasse vinter', 'Maks vogntoglengde', 'Maks totalvekt', 'Merknad', 'veglenkesekvensid', 'startposisjon', 'sluttposisjon']].copy( ) # Døper om så vi unngår navnekollisjon mellom data om bruksklasse og jernbaneoverganger dfbk_2.rename( columns={ 'objekttype' : 'BKobjekttype', 'nvdbId' : 'bkNvdbId', 'veglenkesekvensid' : 'bk_vid', 'startposisjon' : 'bkstart', 'sluttposisjon' : 'bkslutt' }, inplace=True)
import numpy as np import STARTHER import lastnedvegnett import skrivdataframe import nvdbapiv3 import nvdbgeotricks t0 = datetime.now() # egenskapfilter_bk904_u10t = 'egenskap(10901)=18186 OR egenskap(10901)=18187 OR egenskap(10901)=18188 OR egenskap(10901)=18189 OR egenskap(10901)=18190' # overlappfilter = '904(10901=18186 OR 10901=18187 OR 10901=18188 OR 10901=18189 OR 10901=18190)' mittfilter = lastnedvegnett.kostraFagdataFilter( mittfilter={'egenskap': '1263=7304 OR 1263=7305'}) sok = nvdbapiv3.nvdbFagdata(60) sok.filter(mittfilter) bruGdf = nvdbgeotricks.records2gdf(sok.to_records()) # Oppsummerer bru. Her må vi ta hensyn til at noen av bruene mangler egenskapen "Lengde" bruGdf_medLengde = bruGdf[~bruGdf['Lengde'].isnull()].drop_duplicates( subset='nvdbId') bruGdf_uLengde = bruGdf[bruGdf['Lengde'].isnull()].copy() bruGdf_uLengde['Lengde'] = bruGdf_uLengde['segmentlengde'] bru_alleharLengde = pd.concat([bruGdf_medLengde, bruGdf_uLengde]) telling = bru_alleharLengde.groupby(['fylke']).agg({ 'nvdbId': 'nunique', 'Lengde': 'sum' }).reset_index() telling.rename(columns={
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")
# EnumInSetProvider(904, 10913, 18256, 18254, 18255) # # 19,50 18253 < Ikke denna, men resten # 15,00 18254 # 12,40 18255 # Spesiell begrensning 18256 egenskapfilter = 'egenskap(10913)=18254 OR egenskap(10913)=18255 OR egenskap(10913)=18256' mittfilter = lastnedvegnett.kostraFagdataFilter(mittfilter={}) mittfilter['vegsystemreferanse'] = 'Fv' mittfilter['egenskap'] = egenskapfilter mittfilter['adskiltelop'] = 'med,nei' mittfilter['sideanlegg'] = 'false' sok = nvdbapiv3.nvdbFagdata(904) sok.filter(mittfilter) myGdf = nvdbgeotricks.records2gdf(sok.to_records()) myGdf_G = myGdf[myGdf['trafikantgruppe'] == 'G'].copy() myGdf = myGdf[myGdf['trafikantgruppe'] == 'K'] # For debugging lengde = myGdf.groupby(['fylke', 'vegkategori', 'nummer']).agg({ 'segmentlengde': 'sum' }).reset_index() lengde['Veg'] = 'FV' + lengde['nummer'].astype(str) lengde['Lengde (m)'] = lengde['segmentlengde'] lengde = lengde[['fylke', 'Veg', 'Lengde (m)']]
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 loadStats(self): names = self.getLayerNames() data = getLastSearch() valueList, itemList, amountList, lenghtList, areaList, areaTotalList = [], [], [], [], [], [] valueList, itemList, amountList, lenghtList, areaList, areaTotalList = [], [], [], [], [], [] for i in names: item_id = getID(i) item = nvdbFagdata(item_id) if data[1] == "kommune": kommuneID = getKommuneID(data[0]) item.filter({'kommune': kommuneID}) elif data[1] == "kontraktsomrade": item.filter({'kontraktsomrade': data[0]}) else: fylkeID = getFylkeID(data[0]) item.filter({'fylke': fylkeID}) if data[2] != "Alle": item.filter({'vegsystemreferanse': [data[2][0]]}) for v in item.statistikk().items(): valueList.append(v) itemList.append(item) for itemobj in itemList: while itemobj is not None: area = itemobj.nesteNvdbFagObjekt() if area is None: break else: areaList.append(area.egenskapverdi('Areal')) continue else: print("TEST") break for i in range(len(valueList)): v = valueList[i] if v[0] == "antall": amountList.append(v[1]) else: lenghtList.append(v[1]) for i in range(len(amountList)): areaTotal = 0 for u in range(amountList[i]): if areaList[u] is not None: if isinstance(areaList[u], str): pass else: areaTotal += areaList[u] else: pass areaTotalList.append(areaTotal) areaList = areaList[amountList[i]:] # Row count self.dlg.statsTable.setRowCount(len(names) + 1) # Column count self.dlg.statsTable.setColumnCount(4) self.dlg.statsTable.setItem(0, 0, QTableWidgetItem("Navn")) self.dlg.statsTable.setItem(0, 1, QTableWidgetItem("Mengde")) self.dlg.statsTable.setItem(0, 2, QTableWidgetItem("Lengde")) self.dlg.statsTable.setItem(0, 3, QTableWidgetItem("Areal")) for i in range(len(names) + 1): if i == len(names): break self.dlg.statsTable.setItem(i + 1, 0, QTableWidgetItem(names[i])) self.dlg.statsTable.setItem(i + 1, 1, QTableWidgetItem(str(amountList[i]))) self.dlg.statsTable.setItem( i + 1, 2, QTableWidgetItem(str(round(int(lenghtList[i]))))) self.dlg.statsTable.setItem( i + 1, 3, QTableWidgetItem(str(round(int(areaTotalList[i]))))) # Table will fit the screen horizontally self.dlg.statsTable.horizontalHeader().setStretchLastSection(True) self.dlg.statsTable.horizontalHeader().setSectionResizeMode( QHeaderView.Stretch) self.successMessage("Viser statistikk for layers innenfor " + data[1] + ":") self.successMessage(data[0]) self.successMessage("Vegsystemreferanse:") self.successMessage(data[2])
def getStats(self): objList = [ str(self.dlg.listWidget_layers.item(i).text()) for i in range(self.dlg.listWidget_layers.count()) ] valueList, indexList, antallList, lengdeList, areallist, itemlist, arealsum, data, namelist, statslist, rnonelist = [], [], [], [], [], [], [], [], [], [], [] colnavn = namedtuple('colnavn', ['Objekt', 'Antall', 'Lengde', 'Areal']) today = date.today().strftime("_%d%m%y") output_dir_path = self.dlg.lineEdit_dir_m.text().strip() userin_file_name = self.dlg.lineEdit_fileNameM.text().strip() if userin_file_name and output_dir_path: output_dir = (output_dir_path + '/' + 'Mengder_' + today) try: os.makedirs(output_dir) except OSError: self.errorMessage("Klarte ikke å lage nye mappe") else: filename = os.path.join(output_dir + '/' + userin_file_name + '.csv') print(filename) with open(filename, 'w', newline='', encoding='utf8') as fm: writer = csv.writer(fm, delimiter=',') writer.writerow(colnavn._fields) for itemname in objList: namelist.append(itemname) item_id = getID(itemname) item = nvdbFagdata(item_id) if self.dlg.kommuneCheck.isChecked(): kommuneID = getKommuneID( str(self.dlg.kommuneBox.currentText())) item.filter({'kommune': kommuneID}) elif self.dlg.kontraktCheck.isChecked(): kontraktID = str( self.dlg.kontraktBox.currentText()) item.filter({'kontraktsomrade': kontraktID}) else: fylkeID = getFylkeID( str(self.dlg.fylkeBox.currentText())) item.filter({'fylke': fylkeID}) if returnSelectedVegreferanse() != "Alle": item.filter({ 'vegsystemreferanse': [returnSelectedVegreferanse()[0]] }) for v in item.statistikk().items(): valueList.append(v) itemlist.append(item) for itemobj in itemlist: while itemobj is not None: areal = itemobj.nesteNvdbFagObjekt() if areal is None: break else: areallist.append(areal.egenskapverdi('Areal')) continue else: break for i in valueList: indexList.append(i) for a in range(0, len(indexList), 2): antallList.append(valueList[a]) for l in range(1, len(indexList), 2): lengdeList.append(valueList[l]) start = 0 i = 0 for antall, lengde in zip(antallList, lengdeList): # print('{} {}'.format(antall[1], lengde[1])) for a in range(1, len(antall)): value = antall[a] arealsum = areallist[start:start + value] start += value rnone = [0 if x is None else x for x in arealsum] rnonelist.append(sum(rnone)) if rnone is not None: a = sum(rnone) data.append(namelist[i]) i += 1 data.append(antall[1]) data.append(lengde[1]) data.append(a) writer.writerow(data) data.clear() else: pass fm.close() self.successMessage('Utskrift fullført!') elif not userin_file_name: self.errorMessage("Du må gi filen et navn!") elif not output_dir_path: self.errorMessage("Du må velge en filsti!") statslist = [namelist, antallList, lengdeList, rnonelist] return statslist
t0 = datetime.now() # EnumInSetProvider(105, 2021, 2726, 2728, 11576, 2730, 19885)//TODO: la til 5km/t i listen. Skjekk om det er riktig! # # # Eks bygge spørring: egenskap(10278)>=2000 AND egenskap(1313)<=100 egenskapfilter = 'egenskap(2021)=2726 OR egenskap(2021)=2728 OR egenskap(2021)=11576 OR egenskap(2021)=2730 OR egenskap(2021)=19885' mittfilter = lastnedvegnett.kostraFagdataFilter(mittfilter={}) mittfilter['vegsystemreferanse'] = 'Fv' mittfilter['egenskap'] = egenskapfilter mittfilter['adskiltelop'] = 'med,nei' mittfilter['sideanlegg'] = 'false' sok = nvdbapiv3.nvdbFagdata(105) sok.filter(mittfilter) myGdf = nvdbgeotricks.records2gdf(sok.to_records()) myGdf_G = myGdf[myGdf['trafikantgruppe'] == 'G'].copy() myGdf = myGdf[myGdf['trafikantgruppe'] == 'K'] # For debugging lengde = myGdf.groupby(['fylke', 'vegkategori', 'nummer']).agg({ 'segmentlengde': 'sum' }).reset_index() lengde['Veg'] = 'FV' + lengde['nummer'].astype(str) lengde['Lengde (m)'] = lengde['segmentlengde'] lengde = lengde[['fylke', 'Veg', 'Lengde (m)']]
from datetime import datetime from copy import deepcopy import geopandas as gpd import pandas as pd import numpy as np import STARTHER import lastnedvegnett import skrivdataframe import nvdbapiv3 t0 = datetime.now() skjermfilter = lastnedvegnett.kostraFagdataFilter( mittfilter={ 'egenskap' : '1247=1994'} ) skjermsok = nvdbapiv3.nvdbFagdata( 3 ) skjermsok.filter( skjermfilter ) skjerm = pd.DataFrame( skjermsok.to_records( ) ) skjermlengde = skjerm.groupby( ['fylke' ]).agg( { 'nvdbId': 'nunique', 'segmentlengde' : 'sum' } ).reset_index() skjermlengde.rename( columns={ 'nvdbId' : 'Antall', 'segmentlengde' : 'Lengde (m)' }, inplace=True ) vollfilter = lastnedvegnett.kostraFagdataFilter( mittfilter={ 'egenskap' : '1286=1996'} ) vollsok = nvdbapiv3.nvdbFagdata( 234 ) vollsok.filter( vollfilter ) voll = pd.DataFrame( vollsok.to_records( ) ) volllengde = voll.groupby( ['fylke' ]).agg( { 'nvdbId': 'nunique', 'segmentlengde' : 'sum' } ).reset_index() volllengde.rename( columns={ 'nvdbId' : 'Antall', 'segmentlengde' : 'Lengde (m)' }, inplace=True ) # lengde['Veg'] = 'FV' + lengde['nummer'].astype(str) # lengde['Lengde (m)'] = lengde['segmentlengde'] # lengde = lengde[[ 'fylke', 'Veg', 'Lengde (m)']]
def tunnelrapport(mittfilter=None): """ Setter sammen tunnel, tunnelløp og en del fagdata Bruk nøkkelord mittfilter=dictionary med NVDB api LES filtermuligheter for å snevre inn søket eks: mittfilter={ 'vegsystemreferanse' : 'Rv', fylke=30 } returnerer TO dataframes, en med full rapport og en komprimert (per unike tunnelobjekt) """ filteret = {} # Kopierer mittfilter for å unngå sideefekter if mittfilter: filteret = deepcopy(mittfilter) # Henter tunnell og tunnelløp, spleiser dem sammen: tun = nvdbapiv3.nvdbFagdata(581) tunlop = nvdbapiv3.nvdbFagdata(67) if mittfilter: tun.filter(filteret) tunlop.filter(filteret) tunDf = pd.DataFrame(tun.to_records()) tunlopDf = pd.DataFrame(tunlop.to_records()) # Spleiser tunnel og tunnelløp basert på mor-datter relasjon mellomresultat1 = nvdbgeotricks.finnDatter(tunDf, tunlopDf, prefixMor='t581_', prefixDatter='t67_') # Må droppe relasjoner-kolonnen ettersom dette er en dictionary-struktur som ikke takles av sqlite3- mellomresultat1.drop(columns=['t581_relasjoner', 't67_relasjoner'], inplace=True) # Henter øvrige fagdata: s105 = nvdbapiv3.nvdbFagdata(105) # Fartsgrense s540 = nvdbapiv3.nvdbFagdata(540) # Trafikkmengde if mittfilter: s105.filter(filteret) s540.filter(filteret) # Legger til overlappfilter s105.filter({'overlapp': '67'}) s540.filter({'overlapp': '67'}) # lager dataaframes df105 = pd.DataFrame(s105.to_records(relasjoner=False)) df540 = pd.DataFrame(s540.to_records(relasjoner=False)) mellomresultat1.reset_index(inplace=True) mellomresultat2 = nvdbgeotricks.finnoverlapp(mellomresultat1, df105, prefixA='t67_', prefixB='t105_') mellomresultat3 = nvdbgeotricks.finnoverlapp(mellomresultat2, df540, prefixA='t67_', prefixB='t540_') mellomresultat3.reset_index() sletteliste = [ 'index', 't581_objekttype', 't581_versjon', 't581_startdato', 't581_veglenkeType', 't581_vegkategori', 't581_veglenkesekvensid', 't581_detaljnivå', 't581_typeVeg', 't581_fase', 't581_nummer', 't67_objekttype', 't67_versjon', 't67_startdato', 't67_veglenkeType', 't67_vegkategori', 't67_fase', 't67_nummer', 't67_adskilte_lop', 't67_trafikantgruppe', 't67_veglenkesekvensid', 't67_detaljnivå', 't67_typeVeg', 't581_relativPosisjon', 't581_adskilte_lop', 't581_trafikantgruppe', 't105_objekttype', 't105_nvdbId', 't105_versjon', 't105_startdato', 't105_Gyldig fra dato', 't105_veglenkesekvensid', 't105_detaljnivå', 't105_typeVeg', 't105_kommune', 't105_fylke', 't105_vref', 't105_veglenkeType', 't105_vegkategori', 't105_fase', 't105_nummer', 't105_startposisjon', 't105_sluttposisjon', 't105_segmentlengde', 't105_adskilte_lop', 't105_trafikantgruppe', 't105_geometri', 't105_Vedtaksnummer', 't105_Arkivnummer', 't540_objekttype', 't540_nvdbId', 't540_versjon', 't540_startdato', 't540_Historisk_Ansvarlig ID', 't540_Grunnlag for ÅDT', 't540_veglenkesekvensid', 't540_detaljnivå', 't540_typeVeg', 't540_kommune', 't540_fylke', 't540_vref', 't540_veglenkeType', 't540_vegkategori', 't540_fase', 't540_nummer', 't540_startposisjon', 't540_sluttposisjon', 't540_segmentlengde', 't540_adskilte_lop', 't540_trafikantgruppe', 't540_geometri', 't540_Historisk_ForholdÅDT', 't540_Historisk_Tellepunkt, sekundært', 't540_Historisk_Koplingsår', 't540_Historisk_Mfaktor', 't540_ÅDT, start', 't540_ÅDT, slutt', 't540_Historisk_Tellepunkt, primært', 't540_Historisk_ForholdLange', 't540_Oppdatert fra' ] nysletteliste = [] forkast = [] for slett in sletteliste: if slett in mellomresultat3.columns: nysletteliste.append(slett) else: forkast.append(slett) if len(forkast) > 0: print('Kan ikke slette disse kolonnene fra tunnelrapport:\n', forkast) if len(nysletteliste) > 0: mellomresultat3.drop(columns=nysletteliste, inplace=True) komprimertKolonner = [ 't581_nvdbId', 't67_Høyde', 't67_Åpningsår', 't67_Lengde', 't67_Merknad', 't67_Navn', 't67_Bredde', 't67_Tunnelprofil', 't67_Type tunnelløp', 't67_Kategori', 't67_Ekstra belysning inngangssone', 't67_Areal tverrsnitt', 't67_Rehabiliteringsår', 't67_Malte tunnelvegger', 't67_Prosjektreferanse', 't67_Brutus_Id', 't105_Fartsgrense', 't540_År, gjelder for', 't540_ÅDT, total', 't540_ÅDT, andel lange kjøretøy' ] komprimert = mellomresultat3.drop_duplicates( subset=komprimertKolonner).copy() slett = [ 't67_nvdbId', 't67_kommune', 't67_fylke', 't67_vref', 't67_startposisjon', 't67_sluttposisjon', 't67_segmentlengde', 't67_geometri' ] komprimert.drop(columns=slett, inplace=True) return (mellomresultat3, komprimert)
def brutusBKoverlapp(mittfilter=None, offisiell=False, kunEnTypeBK=None): """ Finner de bruksklasse-objektene som overlapper med bruer. finner overlapp mellom bruenes vegsegmenter og vegsegmenter for BK-typene "Normaltransport", "Spesialtransport" og "12/100 vegnett" Bruk evt nøkkelord kunEnTypeBK for å plukke ut en av disse. Bruk nøkkelord offisiell=True for å hente uoffisielle BK-verdier (krever innlogging) Brusøket kan snevres inn med nøkkelord mittfilter={}, ref dokumentasjon for spørring etter vegobjekter https://nvdbapiles-v3.atlas.vegvesen.no/dokumentasjon/openapi/#/Vegobjekter/get_vegobjekter__vegobjekttypeid_ ARGUMENTS: None KEYWORDS mittfilter=None (default) Valgfritt dictionary med eventuelle filtre for bruenes egenskaper, veg- eller områdefilter m.m. Se nvdbapiv3.nvdbFagdata eller API dokumentasjon https://nvdbapiles-v3.atlas.vegvesen.no/dokumentasjon/openapi/#/Vegobjekter/get_vegobjekter__vegobjekttypeid_ offisiell=False (default) | True. Angir om vi skal bruke offisielle eller uoffisielle bruksklassedata (krever innlogging) kunEnTypeBK = None (default) eller en tekststreng som angir hvilke type bruksklasse vi skal hente. Lovlige verdier: None : Henter alle BK-variantene 'normal' : Kun Bruksklasse, normaltransport 'spesial' : Kun Bruksklasse, Spesialtransport 'tolv65' : Kun Bruksklasse, 12/65 mobilkran m.m. 'tolv100' : Kun Bruksklasse, 12/100 vegnett RETURNS geopandas geodataframe """ filteret = {} # Kopierer mittfilter for å unngå sideefekter if mittfilter: filteret = deepcopy(mittfilter) # Kun Brukategori = vegbru if 'egenskap' in filteret: filteret['egenskap'] = '1263=7304 and ' + filteret['egenskap'] else: filteret['egenskap'] = '1263=7304' brusok = nvdbapiv3.nvdbFagdata(60) # brusok.filter( filteret ) bruer = pd.DataFrame(brusok.to_records(relasjoner=False)) bruer = bruer[bruer['trafikantgruppe'] == 'K'] # BRUKSLAST/TOTALVEKT i utdraget. I UTDRAG. Antar vi bruker BK normaltransport. Skal sammenligne BK og totalvekt. # Veggruppe - fra spesialtransport I UTDRAG Spesialtransport # SV12/65 godkjent J/N I UTDRAG BK 12/65 (finnes eller finnes ikke) # SV12/00 godjkent J/N I UTDRAG BK 12/100 (finnes / finnes ikke) # SV 12/100 restriksjoner (sakte/sentrisk etc) - nikx # SV 12/100 avstand - niks if offisiell: normalprefiks = 'bk904_' spesialprefix = 'bk902_' tolv65prefix = 'bk891_' tolv100prefix = 'bk893_' normalsok = nvdbapiv3.nvdbFagdata(904) #Normal spesialsok = nvdbapiv3.nvdbFagdata(902) #Spesial tolv65sok = nvdbapiv3.nvdbFagdata(891) # 12/65 tolv100sok = nvdbapiv3.nvdbFagdata(893) # 12/100 vegnett else: normalprefiks = 'bk905_' spesialprefix = 'bk903_' tolv65prefix = 'bk892_' tolv100prefix = 'bk894_' normalsok = nvdbapiv3.nvdbFagdata(905) spesialsok = nvdbapiv3.nvdbFagdata(903) tolv65sok = nvdbapiv3.nvdbFagdata(892) tolv100sok = nvdbapiv3.nvdbFagdata(894) normalsok.forbindelse.login(miljo='prodles', username='******') spesialsok.forbindelse = normalsok.forbindelse tolv65sok.forbindelse = normalsok.forbindelse tolv100sok.forbindelse = normalsok.forbindelse normalsok.filter({'overlapp': '60'}) spesialsok.filter({'overlapp': '60'}) tolv65sok.filter({'overlapp': '60'}) tolv100sok.filter({'overlapp': '60'}) normal = pd.DataFrame(normalsok.to_records(relasjoner=False)) spesial = pd.DataFrame(spesialsok.to_records(relasjoner=False)) tolv65 = pd.DataFrame(tolv65sok.to_records(relasjoner=False)) tolv100 = pd.DataFrame(tolv100sok.to_records(relasjoner=False)) normal['bktall'] = normal['Bruksklasse'].apply( lambda x: splitBruksklasse_vekt(x)[0]) normal['bkvekt'] = normal['Bruksklasse'].apply( lambda x: splitBruksklasse_vekt(x)[1]) # normal['Maks vogntoglengde'] = normal['Maks vogntoglengde'].apply( lambda x : float( x.replace( ',', '.') ) if '.' in x ) # 'Vegliste gjelder alltid', sletteliste = [ 'objekttype', 'nvdbId', 'versjon', 'startdato', 'detaljnivå', 'typeVeg', 'kommune', 'fylke', 'veglenkeType', 'segmentlengde', 'geometri', 'vegkategori', 'fase', 'vegnummer', 'adskilte_lop', 'trafikantgruppe', 'Strekningsbeskrivelse' ] slettelliste_normal = ['Bruksklasse vinter'] normal.drop(columns=sletteliste + slettelliste_normal, inplace=True) spesial.drop(columns=sletteliste + slettelliste_normal, inplace=True) tolv65.drop(columns=sletteliste, inplace=True) tolv100.drop(columns=sletteliste, inplace=True) bruprefix = 'bru_' bruer = bruer.add_prefix(bruprefix) brucol_nvdbId = bruprefix + 'nvdbId' sluttresultat = None # Overlapp bruer - normaltransport if kunEnTypeBK == None or kunEnTypeBK == 'normal': mellomresultat2 = nvdbgeotricks.finnoverlapp(bruer, normal, prefixA=bruprefix, prefixB=normalprefiks, join='left') mellomresultat2.drop(columns=[ normalprefiks + 'veglenkesekvensid', normalprefiks + 'startposisjon', normalprefiks + 'sluttposisjon' ], inplace=True) sluttresultat = mellomresultat2.copy() else: mellomresultat2 = bruer # Overlapp bruer - spesial if kunEnTypeBK == None or kunEnTypeBK == 'spesial': mellomresultat4 = nvdbgeotricks.finnoverlapp(mellomresultat2, spesial, prefixA=bruprefix, prefixB=spesialprefix, join='left') mellomresultat4.drop(columns=[ spesialprefix + 'veglenkesekvensid', spesialprefix + 'startposisjon', spesialprefix + 'sluttposisjon' ], inplace=True) sluttresultat = mellomresultat4.copy() else: mellomresultat4 = bruer # Overlapp bruer - 12/65 if kunEnTypeBK == None or kunEnTypeBK == 'tolv65': mellomresultat6 = nvdbgeotricks.finnoverlapp(mellomresultat4, tolv65, prefixA=bruprefix, prefixB=tolv65prefix, join='left') mellomresultat6.drop(columns=[ tolv65prefix + 'veglenkesekvensid', tolv65prefix + 'startposisjon', tolv65prefix + 'sluttposisjon' ], inplace=True) sluttresultat = mellomresultat6.copy() else: mellomresultat6 = bruer # Overlapp bruer - 12/100 if kunEnTypeBK == None or kunEnTypeBK == 'tolv100': mellomresultat8 = nvdbgeotricks.finnoverlapp(mellomresultat6, tolv100, prefixA=bruprefix, prefixB=tolv100prefix, join='left') mellomresultat8.drop(columns=[ tolv100prefix + 'veglenkesekvensid', tolv100prefix + 'startposisjon', tolv100prefix + 'sluttposisjon' ], inplace=True) sluttresultat = mellomresultat8.copy() # Lager geodataframe bruer['geometry'] = bruer['bru_geometri'].apply(lambda x: wkt.loads(x)) bruer = gpd.GeoDataFrame(bruer, geometry='geometry', crs=5973) sluttresultat['geometry'] = sluttresultat['bru_geometri'].apply( lambda x: wkt.loads(x)) minGdf = gpd.GeoDataFrame(sluttresultat, geometry='geometry', crs=5973) return minGdf
# Traverserer rekursivt alle barn som dette objektet måtte ha if 'relasjoner' in etObjekt and 'barn' in etObjekt[ 'relasjoner']: returListe.extend( finnLysarmatur(etObjekt['relasjoner']['barn'], egenskaper=egenskaper)) return returListe alleElanlegg = [] alleLysArmaturer = [] if __name__ == '__main__': elsok = nvdbapiv3.nvdbFagdata(461) # elsok.filter( { 'kartutsnitt' : '129068.662,6819071.488,307292.352,6909072.335' }) # Stort kartutsnitt # elsok.filter( { 'kartutsnitt' : '198660.802,6752983.43,262372.596,6784775.827' }) # elsok.filter( { 'kartutsnitt' : '231915.469,6754412.201,232089.515,6754500.093' }) # Bitteliten flekk med 1 anlegg elsok.filter({'kommune': 3048}) for elAnleggTreff in elsok: elanlegg = elsok.forbindelse.les(elAnleggTreff['href'], params={ 'dybde': 4, 'inkluder': 'alle' }).json() # Finner ut om vi har morobjekt tunnelløp? if 'relasjoner' in elanlegg and 'foreldre' in elanlegg['relasjoner']:
if len(foreldreliste) > 0: return foreldreliste[0] else: print(f"Fant ingen mor-relasjon?? {foreldre} ") else: print("Fant ingen foreldrerelasjoner") return np.nan if __name__ == '__main__': # Henter tunneller, der sykkelforbud bor tunsok = nvdbapiv3.nvdbFagdata(581) tunnelmor_alle = pd.DataFrame(tunsok.to_records()) tunnelmordf = tunnelmor_alle[['nvdbId', 'Sykkelforbud', 'Navn']].copy() tunnelmordf.rename(columns={ 'Navn': 'tunnelmor_navn', 'nvdbId': 'tunnelmor_nvdbId' }, inplace=True) # Henter tunnelløp som skal arve sykkelforbud-data tlopsok = nvdbapiv3.nvdbFagdata(67) tlopdf = pd.DataFrame(tlopsok.to_records(relasjoner=True)) tlopdf['tunnelmor_nvdbId'] = tlopdf['relasjoner'].apply( lambda x: finnmorobjekt(x)) resultat = pd.merge(tlopdf, tunnelmordf, on='tunnelmor_nvdbId', how='left')
import STARTHER import nvdbapiv3 if __name__ == '__main__': print("Sjekker at vi kan bruke NVDB api") b = nvdbapiv3.nvdbFagdata(45) b1 = b.nesteNvdbFagObjekt() print(b1.id, b1.egenskapverdi('navn bomstasjon'), b1.egenskapverdi('takst liten bil'))
from copy import deepcopy import pdb from shapely import wkt from shapely.ops import unary_union import pandas as pd import geopandas as gpd from datetime import datetime import lokal_STARTHER import nvdbapiv3 import fiksBK_feilvegkat if __name__ == '__main__': t0 = datetime.now( ) minefilter = { 'kartutsnitt' : '230367.375,6627530.373,232732.755,6630768.879' } tm = nvdbapiv3.nvdbFagdata(540 ) tm.filter( { 'tidspunkt' : '2019-12-31' }) # tm.filter( minefilter) mindf = pd.DataFrame( tm.to_records( ) ) mindf['geometry'] = mindf['geometri'].apply( wkt.loads ) minGdf = gpd.GeoDataFrame( mindf, geometry='geometry', crs=25833 ) minGdf.to_file( 'trafikkmengde.gpkg', layer='trafikkmengde2019-12-31', driver="GPKG") tidsbruk = datetime.now( ) - t0 print( "tidsbruk:", tidsbruk.total_seconds( ), "sekunder")
from datetime import datetime from copy import deepcopy import geopandas as gpd import pandas as pd import numpy as np import STARTHER import lastnedvegnett import skrivdataframe import nvdbapiv3 t0 = datetime.now() sterkfilter = lastnedvegnett.kostraFagdataFilter( mittfilter={'egenskap': '9500=13384'}) vegmerksok = nvdbapiv3.nvdbFagdata(836) vegmerksok.filter(sterkfilter) vegmerk = pd.DataFrame(vegmerksok.to_records()) vegmerklendge = vegmerk.groupby(['fylke']).agg({ 'nvdbId': 'nunique', 'segmentlengde': 'sum' }).reset_index() vegmerklendge.rename(columns={ 'nvdbId': 'Antall', 'segmentlengde': 'Lengde (m)' }, inplace=True) skrivdataframe.skrivdf2xlsx( vegmerklendge, '../../output/Kostra 23 - Fylkesveg med forsterket midtoppmerking.xlsx',
import STARTHER import lastnedvegnett import skrivdataframe import nvdbapiv3 import nvdbgeotricks t0 = datetime.now() # Tunneller (evt tunnelløp) som overlapper med høydebegrensning under 4m overlappfilter = '591(5277<4)' mittfilter = lastnedvegnett.kostraFagdataFilter( mittfilter={'overlapp': overlappfilter}) # Henter tunneler sok = nvdbapiv3.nvdbFagdata(581) sok.filter(mittfilter) tunnelGdf = nvdbgeotricks.records2gdf(sok.to_records()) tunnelGdf.to_file('tunneldebug.gpkg', layer='tunnelpunkt_u_4m', driver='GPKG') # Dessverre er det noen tunneller som mangler egnenskapen "Lengde, offisiell" # Vi skal supplere manglende data fra tunnelløp # aller først deler vi tunnel-datasettet i to manglerLengde = tunnelGdf[tunnelGdf['Lengde, offisiell'].isnull()].copy() harLengde = tunnelGdf[~tunnelGdf['Lengde, offisiell'].isnull()] # Først få tak i tunnelløp sok = nvdbapiv3.nvdbFagdata(67) sok.filter(mittfilter) tLopGdf = nvdbgeotricks.records2gdf(sok.to_records()) tLopGdf.to_file('tunneldebug.gpkg', layer='tunnelpunkt_u_4m', 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")
import numpy as np from copy import deepcopy import STARTHER import lastnedvegnett import skrivdataframe import nvdbapiv3 import nvdbgeotricks t0 = datetime.now() mittfilter = lastnedvegnett.kostraFagdataFilter() mittfilter['egenskap'] = '1216=3615' mittfilter['overlapp'] = '540(4623>=5000)' sok = nvdbapiv3.nvdbFagdata(241) sok.filter(mittfilter) myGdf = nvdbgeotricks.records2gdf(sok.to_records()) myGdf.to_file('debug_grus.gpkg', layer='grus aadt over 5000', driver='GPKG') # Debugger, henter det inverse søket. filter2 = lastnedvegnett.kostraFagdataFilter(mittfilter={}) filter2['overlapp'] = '241(1216=3615)' filter2['egenskap'] = '4623>=5000' sok = nvdbapiv3.nvdbFagdata(540) sok.filter(filter2) aadt_Gdf = nvdbgeotricks.records2gdf(sok.to_records()) aadt_Gdf.to_file('debug_grus.gpkg', layer='AADT over 5000 grus', driver='GPKG')
def url2kart(url, iface=None, sokeobjekt=False, ignorerbbox=False, **kwargs): """ Leser URL for et kall til å hente vegobjekter fra NVDB api V3 og føyer dataene fra API'et til qgis kartet Det viktiste bruksområdet er vegkart-søk, hvor du kan jobbe fram et vegkart-søk du liker, kopiere lenken til API-kallet og lime inn her. ARGUMENTS url : Kall for å hente vegobjekter fra NVDB api KEYWORDS iface: Send med et såkalt iface-objekt fra qgis hvis du ønsker å bruke din egen qgis kartflate som avgrensning i stedet for den som er i vegkart-søket. I så fall bruker vi funksjonen nvdb2kart. Ellers brukes nvdbsok2qgis med kartutsnitt-avgrensing fra vegkart (evt uten bbox hvis nøkkeolord ignorerbbox=True) sokeobjekt: Sett til True hvis du ønsker å få søkeobjektet inn i QGIS-kommandolinjen, f.eks. for å manipulere mere på dem, sette eller fjerne filter etc. ignorerbbox: Sett til True om du ønsker å fjerne "kartutsnitt"-parameteren fra søket (dvs hente alle tilgjengelige data, uten bbox). Ignoreres hvis iface - parametere brukes samtidig. **kwargs: Alle andre nøkkeolrd er sendt videre til funksjonene nvdbsok2qgis eller nvdb2kart RETURNS None, evt et søkeobjekt av typen nvdbapiv3.nvdbFagdata fra https://github.com/LtGlahn/nvdbapi-V3 (nøkkelord sokeobjekt=True) """ url = urllib.parse.unquote(url) myparams = '' if '?' in url: (root, myparams) = url.split('?') else: root = url params = {} if len(myparams) >= 3 and '=' in myparams: params = { x.split('=')[0]: '='.join(x.split('=')[1:]) for x in myparams.split('&') } # Oversetter bitene av http://ULR?&key=value&key2=val2 nøkkelordene til dictionary # Litt komplekst uttrykk, her er forklaringen # Lengst til høyre: Deler myparams opp i biter basert på separator & # Lengst til venstre: dictionary - navnet = det som står til venstre for likhetstegnet # dvs første treff på x.split('=') # Konstruksjonen i midten: '='.join( x.split('=')[1:] ) # Et egenskap=verdi kan ha en verdi satt sammen med likhetstegn. Konstruksjonen # '='.join( x.split('=')[1:] ) føyer dem sammen igjen til en tekststreng. # Dermed blir uttrykk som egenskap=(4589='Konsul Lor*') til # { 'egenskap' : "(4589='Konsul Lor*')" } # Overstyrer inkluder-parameter params['inkluder'] = 'alle' if isinstance(params, dict) and ignorerbbox: junk = params.pop('kartutsnitt', None) # Finner rot-url: roots = root.split('/') if roots[-2] == 'vegobjekter' and roots[-1].isdigit(): sok = nvdbFagdata(int(roots[-1])) if isinstance(params, dict): sok.filter(params) # Setter riktig api-url sok.forbindelse.apiurl = 'https://' + roots[2] if sokeobjekt: return sok # Sender til qgis - kartflate, enten med kartflate som filter, eller ikke if iface: nvdb2kart(sok, iface, **kwargs) else: nvdbsok2qgis(sok, **kwargs) else: print(f"Klarer ikke dekode som NVDB api søk etter vegobjekter {root} ")
from shapely import wkt from shapely.ops import unary_union import pandas as pd import geopandas as gpd from datetime import datetime import STARTHER import nvdbapiv3 from apiforbindelse import apiforbindelse import nvdbutilities if __name__ == '__main__': t0 = datetime.now( ) # minefilter = { 'kommune' : 3453 } vegobjekttype = 577 tm = nvdbapiv3.nvdbFagdata( vegobjekttype ) data = tm.to_records( vegsegmenter=False ) mindf = pd.DataFrame( data ) filnavn = 'dump577_5okt.gpkg' mindf['geometry'] = mindf['geometri'].apply( wkt.loads ) minGdf = gpd.GeoDataFrame( mindf, geometry='geometry', crs=25833 ) # må droppe kolonne vegsegmenter hvis du har vegsegmenter=False minGdf.drop( 'vegsegmenter', 1, inplace=True) minGdf.to_file( filnavn, layer='vf577', driver="GPKG")
if not [k for k in sys.path if 'nvdbapi' in k]: print("Legger NVDB api til søkestien") sys.path.append(os.getcwd() + '/nvdbapi-V2') import nvdbapi import nvdbapiv3 # HVa skal vi hente? objtypeId = 938 # Hvor skal vi lagre det? mappe = 'skjermedeobjekt/' Path(mappe).mkdir(parents=True, exist_ok=True) # sokv2 = nvdbapi.nvdbFagdata(objtypeId) sokv3 = nvdbapiv3.nvdbFagdata(objtypeId) sokv3.miljo('test') df_opnedata = pd.DataFrame(sokv3.to_records()) sokv3skjerm = nvdbapiv3.nvdbFagdata(objtypeId) # sokv3skjerm.miljo( 'test') #sokv3skjerm.forbindelse.login( pw='skr.vNvdb3mye') sokv3skjerm.forbindelse.login() df_skjermededata = pd.DataFrame(sokv3skjerm.to_records()) print('Åpne data - skal IKKE inneholde "Graveformål"') print(df_opnedata.dtypes) print('\n=====\nSkjermede data - SKAL inneholde "Graveformål')