def dumpkontraktsomr(): """ Dumper et har (hardkodede) kontraktsområder """ komr = ['9302 Haugesund 2020-2025', '9304 Bergen', '9305 Sunnfjord'] objliste = [ 540, # Trafikkmengde 105, # Fartsgrense 810, # Vinterdriftsklasse 482, # trafikkregistreringsstasjon 153, # Værstasjon 64, # Ferjeleie 39, # Rasteplass 48, # Fortau 199, # Trær 15, # Grasdekker 274, # Blomsterbeplanting 511, # Busker 300, # Naturområde (ingen treff i Haugesund kontrakt) 517, # Artsrik vegkant 800, # Fremmede arter 67, # Tunnelløp 846, # Skredsikring, bremsekjegler 850 # Skredsikring, forbygning ] for enkontrakt in komr: filnavn = nvdbapiv3.esriSikkerTekst(enkontrakt) nvdb2gpkg(objliste, filnavn=filnavn, mittfilter={'kontraktsomrade': enkontrakt})
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")