예제 #1
0
def firefeltrapport(mittfilter={}):
    """
    Finner alle firefeltsveger i Norge, evt innafor angitt søkekriterie 

    Bruker søkeobjektet nvdbapiv3.nvdbVegnett fra biblioteket https://github.com/LtGlahn/nvdbapi-V3

    ARGUMENTS
        None 

    KEYWORDS:
        mittfilter: Dictionary med søkefilter 

    RETURNS
        geodataframe med resultatet
    """

    v = nvdbapiv3.nvdbVegnett()

    # Legger til filter på kun fase = V (eksistende veg), såfremt det ikke kommer i konflikt med anna filter
    if not 'vegsystemreferanse' in mittfilter.keys():
        mittfilter['vegsystemreferanse'] = 'Ev,Rv,Fv,Kv,Sv,Pv'

    if not 'kryssystem' in mittfilter.keys():
        mittfilter['kryssystem'] = 'false'

    if not 'sideanlegg' in mittfilter.keys():
        mittfilter['sideanlegg'] = 'false'

    v.filter(mittfilter)

    # Kun kjørende, og kun øverste topologinivå, og ikke adskiltelop=MOT
    v.filter({
        'trafikantgruppe': 'K',
        'detaljniva': 'VT,VTKB',
        'adskiltelop': 'med,nei'
    })

    data = []
    vegsegment = v.nesteForekomst()
    while vegsegment:

        if sjekkfelt(vegsegment, felttype='firefelt'):
            vegsegment['feltoversikt'] = ','.join(vegsegment['feltoversikt'])
            vegsegment['geometri'] = vegsegment['geometri']['wkt']
            vegsegment['vref'] = vegsegment['vegsystemreferanse']['kortform']
            vegsegment['vegnr'] = vegsegment['vref'].split()[0]
            vegsegment['vegkategori'] = vegsegment['vref'][0]
            vegsegment['adskilte løp'] = vegsegment['vegsystemreferanse'][
                'strekning']['adskilte_løp']

            data.append(vegsegment)

        vegsegment = v.nesteForekomst()

    if len(data) > 1:
        mindf = pd.DataFrame(data)
        mindf['geometry'] = mindf['geometri'].apply(wkt.loads)
        mindf.drop('geometri', 1, inplace=True)
        mindf.drop('kontraktsområder', 1, inplace=True)
        mindf.drop('riksvegruter', 1, inplace=True)
        mindf.drop('href', 1, inplace=True)
        mindf.drop('metadata', 1, inplace=True)
        mindf.drop('kortform', 1, inplace=True)
        mindf.drop('veglenkenummer', 1, inplace=True)
        mindf.drop('segmentnummer', 1, inplace=True)
        mindf.drop('startnode', 1, inplace=True)
        mindf.drop('sluttnode', 1, inplace=True)
        mindf.drop('referanse', 1, inplace=True)
        mindf.drop('målemetode', 1, inplace=True)
        mindf.drop('måledato', 1, inplace=True)
        minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973)
        return minGdf
    else:
        return None
예제 #2
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")
예제 #3
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")
예제 #4
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 vegnett2gdf(mittfilter={}):
    """
    Lager geodataframe ut fra spørring (søkeobjekt nvdbVegnett)

    Bruker søkeobjektet nvdbapiv3.nvdbVegnett fra biblioteket https://github.com/LtGlahn/nvdbapi-V3

    ARGUMENTS
        None 

    KEYWORDS: 
        mittfilter: Dictionary med søkefilter 

    RETURNS
        Geodataframe med resutaltet
    """

    v = nvdbapiv3.nvdbVegnett()

    if not 'vegsystemreferanse' in mittfilter.keys():
        mittfilter['vegsystemreferanse'] = 'Ev,Rv,Fv,Kv,Sv,Pv'

    v.filter(mittfilter)

    data = []
    # vegsegment = v.nesteForekomst()
    for vegsegment in v:

        # if sjekkfelt( vegsegment, felttype='firefelt'):
        if 'feltoversikt' in vegsegment:
            vegsegment['feltoversikt'] = ','.join(vegsegment['feltoversikt'])
        vegsegment['geometri'] = vegsegment['geometri']['wkt']
        vegsegment['vref'] = vegsegment['vegsystemreferanse']['kortform']
        vegsegment['vegnr'] = vegsegment['vref'].split()[0]
        vegsegment['adskilte løp'] = vegsegment['vegsystemreferanse'][
            'strekning']['adskilte_løp']
        vegsegment['vegkategori'] = vegsegment['vref'][0]
        vegsegment['trafikantgruppe'] = vegsegment['vegsystemreferanse'][
            'strekning']['trafikantgruppe']

        data.append(vegsegment)

    if len(data) > 1:
        mindf = pd.DataFrame(data)
        mindf['geometry'] = mindf['geometri'].apply(wkt.loads)
        mindf.drop('geometri', 1, inplace=True)
        mindf.drop('kontraktsområder', 1, inplace=True)
        mindf.drop('riksvegruter', 1, inplace=True)
        mindf.drop('href', 1, inplace=True)
        mindf.drop('metadata', 1, inplace=True)
        mindf.drop('kortform', 1, inplace=True)
        mindf.drop('veglenkenummer', 1, inplace=True)
        mindf.drop('segmentnummer', 1, inplace=True)
        mindf.drop('startnode', 1, inplace=True)
        mindf.drop('sluttnode', 1, inplace=True)
        mindf.drop('referanse', 1, inplace=True)
        mindf.drop('målemetode', 1, inplace=True)
        mindf.drop('måledato', 1, inplace=True)
        minGdf = gpd.GeoDataFrame(mindf, geometry='geometry', crs=5973)
        return minGdf
    else:
        return None