Exemplo n.º 1
0
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}
Exemplo n.º 3
0
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',
Exemplo n.º 6
0
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={
Exemplo n.º 8
0
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")
Exemplo n.º 9
0
#  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)']]
Exemplo n.º 10
0
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)']]
Exemplo n.º 15
0
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)
Exemplo n.º 16
0
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
Exemplo n.º 17
0
                # 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']:
Exemplo n.º 18
0
            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')
Exemplo n.º 19
0
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'))
Exemplo n.º 20
0
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')
Exemplo n.º 23
0
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')
Exemplo n.º 25
0
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} ")
Exemplo n.º 26
0
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")  
Exemplo n.º 27
0
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')