def spjoin_bronbestanden_aan_bemalingsgebieden(polygon_lis, inp_drinkwater_bag,
                                               inp_ve_belasting, inp_plancap,
                                               inp_polygon, PLANCAP_OVERLAP,
                                               STATS_DRINKWATER, STATS_VE,
                                               STATS_PLANCAP):
    # joining DRINKWATER_BAG to POLYGONS
    print_log("spatialjoin DRINKWATER_BAG to POLYGONS...", "i")
    processing.runalg("qgis:joinattributesbylocation", inp_polygon,
                      inp_drinkwater_bag, u'intersects', 0, 1, 'sum', 1,
                      STATS_DRINKWATER)
    stats_drinkwater = QgsVectorLayer(STATS_DRINKWATER, "stats_drinkwater",
                                      "ogr")
    stats_drinkwater = add_layer(stats_drinkwater)

    # extra stapje om om te reken van liter/hr naar m3/hr voor part. en zakelijk drinkwater in STAT-tabel.
    add_field_from_dict_label(stats_drinkwater, "stap2tmp", d_velden_tmp)
    bereken_veld(stats_drinkwater, "SUMPAR_M3U", d_velden_tmp)
    bereken_veld(stats_drinkwater, "SUMZAK_M3U", d_velden_tmp)

    # check for overlap between PLANCAP_RIGO and inp_polygon
    print_log("spatialjoin PLANCAP_RIGO to POLYGONS...", "i")
    processing.runalg("qgis:joinattributesbylocation", inp_plancap,
                      inp_polygon, u'intersects', 0, 1, 'sum', 1,
                      PLANCAP_OVERLAP)
    plancap_overlap = QgsVectorLayer(PLANCAP_OVERLAP, "plancap_overlap", "ogr")
    plancap_overlap = add_layer(plancap_overlap, False)
    controleer_spjoin_plancap(plancap_overlap, "count")

    # joining PLANCAP_RIGO to POLYGONS
    processing.runalg("qgis:joinattributesbylocation", inp_polygon,
                      inp_plancap, u'intersects', 0, 1, 'sum', 1,
                      STATS_PLANCAP)
    stats_plancap = QgsVectorLayer(STATS_PLANCAP, "stats_plancap", "ogr")
    stats_plancap = add_layer(stats_plancap)

    # joining VE to POLYGONS
    if inp_ve_belasting.name() == "no data":
        stats_ve = None
        print_log(
            "'no data' geselecteerd als input voor vervuilingseenheden. Berekeningen met VE's worden overgeslagen",
            "w", g_iface)
    else:
        print_log("spatialjoin VE_BELASTING to POLYGONS...", "i")
        processing.runalg("qgis:joinattributesbylocation", inp_polygon,
                          inp_ve_belasting, u'intersects', 0, 1, 'sum', 1,
                          STATS_VE)
        stats_ve = QgsVectorLayer(STATS_VE, "stats_ve", "ogr")
        stats_ve = add_layer(stats_ve)

    return stats_drinkwater, stats_ve, stats_plancap
Example #2
0
def controleer_hoofdbemalingsgebieden(polygon_lis):
    """Controleer of hoofdbemalingsgebieden overlappen."""
    # Intersect_analysis (in_features, out_feature_class, {join_attributes}, {cluster_tolerance}, {output_type})
    ##arcpy.Intersect_analysis (POLYGON_LIS, POLYGON_LIS_OVERLAP)
    processing.runalg("saga:polygonselfintersection", polygon_lis,
                      "VAN_KNOOPN", POLYGON_LIS_OVERLAP)
    polygon_lis_overlap = QgsVectorLayer(POLYGON_LIS_OVERLAP,
                                         "bemalingsgebieden overlap", "ogr")
    ##QgsMapLayerRegistry.instance().addMapLayer(polygon_lis_overlap)

    expr = QgsExpression("\"VAN_KNOOPN\" {}".format("IS NULL"))
    it = polygon_lis_overlap.getFeatures(
        QgsFeatureRequest(expr))  # iterator object
    polygon_lis_overlap.setSelectedFeatures([i.id() for i in it])
    if polygon_lis_overlap.selectedFeatureCount() > 0:
        polygon_lis_overlap = add_layer(polygon_lis_overlap, False)
        print_log(
            "{} bemalingsgebieden met overlap! Zie selectie in layer 'bemalingsgebieden overlap'"
            .format(polygon_lis_overlap.selectedFeatureCount() * 2),
            'w',
            iface=g_iface)
        for feature in polygon_lis_overlap.selectedFeatures():
            print_log(
                "\toverlap tussen bemalingsgebieden {}".format(feature["ID"]),
                "i")
    else:
        print_log("geen overlap gevonden tussen bemalingsgebieden", "i")
        QgsMapLayerRegistry.instance().removeMapLayer(
            polygon_lis_overlap.name())

    return polygon_lis_overlap
Example #3
0
def genereer_knooppunten(iface, inp_polygon, sel_afvoerrelaties):
    '''Genereert knooppunten op basis van afvoerrelaties (lijn-bestand) waarbij 1 knooppunt per bemalingsgebied is toegestaan.
       Alleen knooppunten die afvoeren naar een andere bemalingsgebied worden meegenomen.
       Van ieder knooppunt wordt het eindpunt bepaald, oftewel het overnamepunt.
       De knooppunten worden ruimtelijk gekoppeld aan bemalingsgebieden.
       resultaat: vlakkenbestand POLYGON_LIS met velden K_LOOST_OP en ONTVANGT_VAN.
       '''

    # afvoerrelaties selecteren die niet binnen 1 bemalingsgebied vallen
    sel_afvoerrelaties.selectAll()
    processing.runalg("qgis:selectbylocation", sel_afvoerrelaties, inp_polygon,
                      u'within', 0, 2)
    print_log(
        "{} features selected".format(
            sel_afvoerrelaties.selectedFeatureCount()), 'd')

    point_layer = QgsVectorLayer("Point?crs=epsg:28992", "knooppunten",
                                 "memory")
    pr = point_layer.dataProvider()
    point_layer.dataProvider().addAttributes([
        QgsField("VAN_KNOOPN", QVariant.String),
        QgsField("BEGIN_EIND", QVariant.Int)
    ])
    point_layer.updateFields()

    feat = QgsFeature(point_layer.pendingFields())

    for i, feature in enumerate(
            sel_afvoerrelaties.selectedFeatures()):  #  .getFeatures()
        geom = feature.geometry().asPolyline()
        start_point = QgsPoint(geom[0])
        end_point = QgsPoint(geom[-1])
        feat.setGeometry(QgsGeometry.fromPoint(start_point))
        feat.setAttribute("VAN_KNOOPN", feature['VAN_KNOOPN'])
        feat.setAttribute("BEGIN_EIND", 0)

        pr.addFeatures([feat])
        ##point_layer.changeAttributeValue(i, 0, "hoi")
        ##i += 1
        feat.setGeometry(QgsGeometry.fromPoint(end_point))
        feat.setAttribute("VAN_KNOOPN", feature['VAN_KNOOPN'])
        feat.setAttribute("BEGIN_EIND", 1)
        ##point_layer.changeAttributeValue(i, 1, 99)
        pr.addFeatures([feat])
    ##point_layer.updateFields()

    point_layer = add_layer(point_layer)
    ##QgsMapLayerRegistry.instance().addMapLayer(point_layer)

    return point_layer
Example #4
0
def create_new_inp_polygon(inp_polygon):
    '''Copy shapefile, delete all fields except OBJECTID.
    If OBJECTID does not excist: add field and calculate.'''
    # copy shapefile
    INP_POLYGON_COPY = os.path.join(gdb, "inp_polygon_copy.shp")
    QgsVectorFileWriter.writeAsVectorFormat(
        inp_polygon, INP_POLYGON_COPY, "utf-8",
        QgsCoordinateReferenceSystem(28992), "ESRI Shapefile")
    vl = QgsVectorLayer(INP_POLYGON_COPY, "inp_polygon_copy", "ogr")
    add_layer(vl)

    # remove old fields except OBJECTID
    fields = vl.dataProvider().fields()
    fList = []
    for fld in fields:
        ##if fld.name() <> 'OBJECTID': # condition removed. can cause problems if OBJECTID is not unique
        fList.append(vl.fieldNameIndex(fld.name()))  # hoe index opvragen?

    vl.dataProvider().deleteAttributes(fList)
    vl.updateFields()

    # add new OBJECTID
    if vl.fieldNameIndex('OBJECTID') == -1:
        # add OBJECTID
        fld = QgsField('OBJECTID', QVariant.Int)
        vl.dataProvider().addAttributes([fld])
        vl.updateFields()

        # set OBJECTID
        vl.startEditing()
        for i, feature in enumerate(vl.getFeatures()):
            feature['OBJECTID'] = i
            vl.updateFeature(feature)
            ##pr.changeAttributeValues({feature.id(): {pr.fieldNameMap()['OBJECTID']: 1}})
        vl.commitChanges()

    return vl
def main(iface, layers, workspace, d_velden_):
    """Hoofdmenu:
    1.) Kopie maken INPUT_POLYGON_LIS
    2.) Spatial joins tussen POLYGON_LIS en de externe gegevens bronnen.
    3.) Velden toevoegen en gegevens overnemen
    4.) Bereken onderbemaling voor DRINKWATER, PLANCAP en VE's
    5.) alle None vervangen door 0
    6.) berekeningen uitvoeren
    7.) resultaat omzetten naar template (als "template" bestaat)
    8.) add results to map
    """
    global g_iface, INP_SKIP_SPJOIN, gdb, l_src_None_naar_0_omzetten, d_velden_tmp, d_velden
    d_velden = d_velden_
    g_iface = iface

    INP_SKIP_SPJOIN = False

    # laod from settings
    gdb = workspace
    l_src_None_naar_0_omzetten = settings.l_fld_None_naar_0_omzetten  # velden waarvan waardes worden omgezet van None naar 0
    d_velden_tmp = settings.d_velden_tmp  # tijdelijke velden

    # layers
    inp_knooppunten, inp_afvoerrelaties, inp_drinkwater_bag, inp_ve_belasting, inp_plancap, inp_verhard_opp, inp_polygon = layers
    for i, layer in enumerate(layers):
        print_log("input {}:\t{}".format(i, layer.name()), "d")

    # tussenresultaten
    EINDRESULTAAT = os.path.join(gdb, "eindresultaat.shp")
    POLYGON_LIS = os.path.join(gdb, "POLYGON_LIS.shp")
    DRINKWATER_POLYGON_LIS = os.path.join(gdb,
                                          "SpJoin_DRINKWATER2POLYGON_LIS.shp")
    PLANCAP_POLYGON_LIS = os.path.join(gdb, "SpJoin_PLANCAP2POLYGON_LIS.shp")
    VE_POLYGON_LIS = os.path.join(gdb, "SpJoin_VE2POLYGON_LIS.shp")
    PLANCAP_OVERLAP = os.path.join(gdb, "PLANCAP_OVERLAP.shp")
    STATS_DRINKWATER = os.path.join(gdb, "STATS_DRINKWATER.shp")
    STATS_PLANCAP = os.path.join(gdb, "STATS_PLANCAP.shp")
    STATS_VE = os.path.join(gdb, "STATS_VE.shp")
    EXP_VERHARD_OPP = os.path.join(gdb, "EXP_VERHARD_OPP.shp")
    VERHARD_OPP_INTERSECT = os.path.join(gdb, "VERHARD_OPP_INTERSECT.shp")
    STATS_VERHARD_OPP = os.path.join(gdb, "STATS_VERHARD_OPP.shp")

    # ##########################################################################
    # 1.) export input INP_POLYGON_LIS to result POLYGON_LIS
    tussenresultaat = QgsVectorLayer(POLYGON_LIS, "tussenresultaat", "ogr")
    if EINDRESULTAAT:
        QgsVectorFileWriter.deleteShapeFile(EINDRESULTAAT)
    QgsVectorFileWriter.writeAsVectorFormat(tussenresultaat, EINDRESULTAAT,
                                            "utf-8", tussenresultaat.crs(),
                                            "ESRI Shapefile")
    polygon_lis = QgsVectorLayer(EINDRESULTAAT, "eindresultaat", "ogr")
    polygon_lis = add_layer(polygon_lis)

    # ##########################################################################
    # 2.) Velden toevoegen en gegevens overnemen
    add_field_from_dict_label(polygon_lis, "st2a", d_velden)

    # ##########################################################################
    # 3.) Spatial joins tussen polygon_lis en de externe gegevens bronnen
    if INP_SKIP_SPJOIN:
        blokje_log(
            "Skip SpatialJoin met externe inputs en gebruik bestaande STAT-tabellen.",
            "i")
        stats_drinkwater = QgsVectorLayer(STATS_DRINKWATER, "stats_drinkwater",
                                          "ogr")
        stats_ve = QgsVectorLayer(STATS_VE, "stats_ve", "ogr")
        stats_plancap = QgsVectorLayer(STATS_PLANCAP, "stats_plancap", "ogr")
        stats_drinkwater = add_layer(stats_drinkwater)
        stats_ve = add_layer(stats_ve)
        stats_plancap = add_layer(stats_plancap)
        # for layer in [stats_drinkwater, stats_ve, stats_plancap]:
        #     layer = add_layer(layer)
    else:
        blokje_log(
            "Start SpatialJoin externe bronnen met hoofdbemalingsgebieden... (1 tot 5 minuten)",
            "i")
        stats_drinkwater, stats_ve, stats_plancap = spjoin_bronbestanden_aan_bemalingsgebieden(
            polygon_lis, inp_drinkwater_bag, inp_ve_belasting, inp_plancap,
            inp_polygon, PLANCAP_OVERLAP, STATS_DRINKWATER, STATS_VE,
            STATS_PLANCAP)

    blokje_log(
        "Velden toevoegen en voorbereiden voor berekening onderbemaling...",
        "i")

    # join stat_fields to polygon_lis
    join_field(polygon_lis, stats_drinkwater, "PAR_RESULT", "SUMPAR_M3U",
               "OBJECTID", "OBJECTID")
    join_field(polygon_lis, stats_drinkwater, "ZAK_RESULT", "SUMZAK_M3U",
               "OBJECTID", "OBJECTID")
    join_field(polygon_lis, stats_drinkwater, "X_WON_GEB", "count", "OBJECTID",
               "OBJECTID")
    join_field(polygon_lis, stats_plancap, "AW_15_24_G", "sumExtra_A",
               "OBJECTID", "OBJECTID")  # SUM_Extra_AFW_2015_tm_2024
    join_field(polygon_lis, stats_plancap, "AW_25_50_G", "sumExtra_1",
               "OBJECTID", "OBJECTID")  # SUM_Extra_AFW_2025_tm_2050
    if stats_ve:
        join_field(polygon_lis, stats_ve, "X_VE_GEB", "sumGRONDSL", "OBJECTID",
                   "OBJECTID")

    # bereken drinkwater per gebied (input voor onderbemalingen) en LEDIG_U (ledigingstijd)
    ##bereken_veld(polygon_lis, "DWR_GEBIED", d_velden)
    bereken_veld_label(polygon_lis, "02_ber", d_velden)

    # ##########################################################################
    # 4.) Bereken onderbemaling voor DRINKWATER en PLANCAP en VE's
    blokje_log("bereken onderbemalingen voor drinkwater, plancap en ve's...",
               "i")
    bereken_onderbemaling(polygon_lis)

    vervang_None_door_0_voor_velden_in_lijst(l_src_None_naar_0_omzetten,
                                             polygon_lis)

    # ##########################################################################
    # 6.) berekeningen uitvoeren
    # bereken dwa prognose & drinkwater per gebied
    # "bereken": "b2a"
    bereken_veld_label(polygon_lis, "04_ber", d_velden)
    bereken_veld_label(polygon_lis, "04a_ber", d_velden)

    # Vergelijk geschat en gemeten zonder
    # "bereken": "b2b"
    bereken_veld_label(polygon_lis, "05_ber", d_velden)

    # bereken verhard opp
    blokje_log("Bepaal verhard oppervlak binnen bemalingsgebieden...", "i")
    bepaal_verhard_oppervlak(polygon_lis, inp_verhard_opp,
                             VERHARD_OPP_INTERSECT)

    vervang_None_door_0_voor_velden_in_lijst([
        "HA_GEM_G", "HA_VGS_G", "HA_HWA_G", "HA_OPW_G", "HA_NAG_G", "HA_OBK_G"
    ], polygon_lis)

    # bereken velden afhankelijk van verhard opp
    bereken_veld_label(polygon_lis, '07_ber', d_velden)
    bereken_veld_label(polygon_lis, '08_ber', d_velden)

    # bepaal onderbemaling2 afhankelijk van verhard opp
    bereken_onderbemaling2(polygon_lis)
    vervang_None_door_0_voor_velden_in_lijst(
        ["POC_B_M3_O", "POC_O_M3_O", "POC_B_M3_G", "POC_O_M3_G"], polygon_lis)
    bereken_veld_label(polygon_lis, '10_ber', d_velden)
    bereken_veld_label(polygon_lis, '11_ber', d_velden)

    # update_datetime UPDATED
    update_datetime(polygon_lis, "UPDATED")

    # add field aliasses
    for fld in d_velden:
        index = polygon_lis.fieldNameIndex(fld)
        if index != -1:
            ##pprint_log("update {} with alias '{}'".format(fld, d_velden[fld]["field_alias"]), "i")
            polygon_lis.addAttributeAlias(index, d_velden[fld]["field_alias"])
def bepaal_verhard_oppervlak(polygon_lis, inp_verhard_opp,
                             VERHARD_OPP_INTERSECT):

    layers = [polygon_lis]
    if inp_verhard_opp.name() == "no data":
        verhard_opp_intersect = None
        print_log(
            "'no data' geselecteerd als input voor verhard oppervlak opgegeven. Berekeningen verhard opp. worden overgeslagen",
            "w", g_iface)
    else:
        print_log(
            "Intersect {}...".format(";".join(
                [polygon_lis.name(),
                 inp_verhard_opp.name()])), "i")
        # eerst totaal verhard opp (ha) bepalen per bemalingsgebied
        if not INP_SKIP_SPJOIN:
            processing.runalg("saga:intersect", inp_verhard_opp, polygon_lis,
                              True, VERHARD_OPP_INTERSECT)
        verhard_opp_intersect = QgsVectorLayer(VERHARD_OPP_INTERSECT,
                                               "verhard_opp_intersect", "ogr")
        verhard_opp_intersect = add_layer(verhard_opp_intersect)
        layers.append(verhard_opp_intersect)
        add_field_from_dict(verhard_opp_intersect, "HA_BEM_G", d_velden_tmp)

    # opp ha berekenen
    for layer in layers:
        print_log("opp ha berekenen voor {}...".format(layer.name()), "i")
        ##d = QgsDistanceArea()
        provider = layer.dataProvider()
        updateMap = {}
        fieldIdx = provider.fields().indexFromName('HA_BEM_G')

        for f in provider.getFeatures():
            opp_ha = f.geometry().area() / 10000
            ##opp_ha = d.measurePolygon(f.geometry().asPolygon()[0])/10000
            updateMap[f.id()] = {fieldIdx: opp_ha}

        provider.changeAttributeValues(updateMap)

    # toevoegen velden voor PI's
    add_field_from_dict_label(polygon_lis, "st3a", d_velden)

    if verhard_opp_intersect == None:
        return  # berekeningen overslaan

    print_log("bereken stats totaal opp ...", "i")
    STATS_VERHARD_OPP_TOT = os.path.join(gdb, "STATS_VERHARD_OPP_TOT.csv")
    if not INP_SKIP_SPJOIN:
        processing.runalg("qgis:statisticsbycategories", VERHARD_OPP_INTERSECT,
                          "HA_BEM_G", "VAN_KNOOPN", STATS_VERHARD_OPP_TOT)
    stats_verh_opp_tot = QgsVectorLayer(STATS_VERHARD_OPP_TOT,
                                        "stats_verh_opp_totaal", "ogr")
    stats_verh_opp_tot = add_layer(stats_verh_opp_tot)

    # overhalen verhard opp (ha) naar eindresultaat
    join_field(polygon_lis, stats_verh_opp_tot, "HA_VER_G", "sum",
               "VAN_KNOOPN", "category")

    # per categorie verhard opp (ha) bepalen per bemalingsgebied
    for aansluiting in ["GEM", "HWA", "NAG", "OBK", "VGS"]:
        STAT_NAME = os.path.join(
            gdb, "{}_{}.csv".format("STATS_VERHARD_OPP", aansluiting))
        where_clause = "\"AANGESL_OP\" = '{}'".format(aansluiting)
        expr = QgsExpression(where_clause)
        it = verhard_opp_intersect.getFeatures(QgsFeatureRequest(expr))
        verhard_opp_intersect.setSelectedFeatures([i.id() for i in it])
        if verhard_opp_intersect.selectedFeatureCount() == 0:
            print_log(
                "geen aansluiting op '{}' gevonden voor verhard opp".format(
                    aansluiting), "w")
            continue
        processing.runalg("qgis:statisticsbycategories", verhard_opp_intersect,
                          "HA_BEM_G", "VAN_KNOOPN", STAT_NAME)
        layer = QgsVectorLayer(STAT_NAME,
                               "{}_{}".format("stats_verh_opp",
                                              aansluiting), "ogr")
        layer = add_layer(layer)

        # velden overhalen naar eindresultaat en PI berekenen
        fld_ha = "HA_{}_G".format(aansluiting)
        join_field(polygon_lis, layer, fld_ha, "sum", "VAN_KNOOPN", "category")
Example #7
0
def koppel_knooppunten_aan_bemalingsgebieden(iface, d_velden, inp_polygon,
                                             knooppunten, inp_knooppunten):
    # knooppunten koppelen aan bemalingsgebieden / gebieden voorzien van code. (sp.join)

    # beginpunten selecteren (sel1)
    expr = QgsExpression("\"BEGIN_EIND\" = {}".format(0))
    it = knooppunten.getFeatures(QgsFeatureRequest(expr))  # iterator object
    knooppunten.setSelectedFeatures([i.id() for i in it])

    print_log("{} selected".format(knooppunten.selectedFeatureCount()), "d")
    # bug 26L error. executing algoritm spatial join #5: export selection to prevent
    QgsVectorFileWriter.writeAsVectorFormat(
        knooppunten, os.path.join(gdb, "knooppunten_sel1.shp"), "utf-8",
        knooppunten.crs(), "ESRI Shapefile", True)
    knooppunten_sel1 = QgsVectorLayer(
        os.path.join(gdb, "knooppunten_sel1.shp"), "knooppunten_sel1", "ogr")
    add_layer(knooppunten_sel1)

    # eindpunten selecteren (sel2)
    expr = QgsExpression("\"BEGIN_EIND\" = {}".format(1))
    it = knooppunten.getFeatures(QgsFeatureRequest(expr))  # iterator object
    knooppunten.setSelectedFeatures([i.id() for i in it])
    print_log("{} selected".format(knooppunten.selectedFeatureCount()), "d")
    # bug 26L error. executing algoritm spatial join #5: export selection to prevent
    QgsVectorFileWriter.writeAsVectorFormat(
        knooppunten, os.path.join(gdb, "knooppunten_sel2.shp"), "utf-8",
        knooppunten.crs(), "ESRI Shapefile", True)
    knooppunten_sel2 = QgsVectorLayer(
        os.path.join(gdb, "knooppunten_sel2.shp"), "knooppunten_sel2", "ogr")
    add_layer(knooppunten_sel2)

    # bemalingsgebieden selecteren die alleen eindpunten bevatten, maar geen beginpunten (eindpunt / rwzi)
    # 1.) selecteer bemalingsgebieden met eindpunten
    processing.runalg("qgis:selectbylocation", inp_polygon, knooppunten_sel2,
                      ['intersects'], 0, 0)
    # 2.) verwijder van selectie alles gebieden met beginpunten
    processing.runalg("qgis:selectbylocation", inp_polygon, knooppunten_sel1,
                      ['intersects'], 0, 2)
    # exporteer als eindgebieden
    EINDGEBIEDEN = os.path.join(gdb, "eindgebieden.shp")
    QgsVectorFileWriter.writeAsVectorFormat(inp_polygon, EINDGEBIEDEN, "utf-8",
                                            inp_polygon.crs(),
                                            "ESRI Shapefile", True)
    eindgebieden = QgsVectorLayer(EINDGEBIEDEN, "eindgebieden", "ogr")
    add_layer(eindgebieden)

    # nu bepalen wat de (juiste) ontbrekende knooppunten zijn om toe te voegen (moet eindpunt zijn van afvoerrelatie)
    # 1.) bepaal eindknooppunten van eindgebieden
    processing.runalg("qgis:selectbylocation", knooppunten_sel2, eindgebieden,
                      ['intersects'], 0, 0)
    # 2.) bepaal welke knooppunten dit zijn in kikker bestand voor juiste code VANKNOOPN
    processing.runalg("qgis:selectbylocation", inp_knooppunten,
                      knooppunten_sel2, ['intersects'], 1, 0)

    # extra knooppunten eindgebied toevoegen aan sel1 (beginpunten)
    pr = knooppunten_sel1.dataProvider()
    feat = QgsFeature(knooppunten_sel1.pendingFields())
    for feature in inp_knooppunten.selectedFeatures():
        feat.setGeometry(feature.geometry())
        feat.setAttribute("VAN_KNOOPN", feature['VAN_KNOOPN'])
        pr.addFeatures([feat])

    # remove selections
    inp_knooppunten.setSelectedFeatures([])
    inp_polygon.setSelectedFeatures([])
    knooppunten_sel1.setSelectedFeatures([])

    # create polygon lis
    processing.runalg("qgis:joinattributesbylocation", inp_polygon,
                      knooppunten_sel1, u'intersects', 0, 0, '', 1,
                      POLYGON_LIS)
    processing.runalg("qgis:joinattributesbylocation", inp_polygon,
                      knooppunten_sel1, u'intersects', 0, 1, 'sum', 1,
                      POLYGON_LIS_SUM)

    polygon_lis_sum = QgsVectorLayer(POLYGON_LIS_SUM, "polygon_kikker_sum",
                                     "ogr")
    polygon_lis = QgsVectorLayer(POLYGON_LIS, "polygon_kikker", "ogr")
    polygon_lis.dataProvider().addAttributes([QgsField('count', QVariant.Int)])
    polygon_lis.updateFields()

    polygon_lis = add_layer(polygon_lis)
    ##fields_to_uppercase(polygon_lis)  # created for sqlite usage which defaults to lowercase...
    polygon_lis_sum = add_layer(polygon_lis_sum)

    # join field met summary gegevens
    join_field(input_table=polygon_lis,
               join_table=polygon_lis_sum,
               field_to_calc="count",
               field_to_copy="count",
               joinfield_input_table="OBJECTID",
               joinfield_join_table="OBJECTID")

    print_log(
        "Bepaal in welk bemalingsgebied het eindpunt van afvoerrelatie ligt...",
        'i')

    knooppunten_sel2.setSelectedFeatures([])
    processing.runalg("qgis:joinattributesbylocation", knooppunten_sel2,
                      polygon_lis, u'intersects', 0, 0, '', 1, EINDKNOOPPUNTEN)

    eindknooppunten = QgsVectorLayer(EINDKNOOPPUNTEN, "eindknooppunten", "ogr")
    eindknooppunten = add_layer(eindknooppunten)
    ##QgsMapLayerRegistry.instance().addMapLayer(eindknooppunten)

    # invullen veld LOOST_OP met code bemalingsgebied.
    add_field_from_dict_label(polygon_lis, "st1a", d_velden)
    join_field(polygon_lis, eindknooppunten, "K_LOOST_OP", "VAN_KNOO_1",
               "VAN_KNOOPN", "VAN_KNOOPN")

    return polygon_lis
Example #8
0
def main(iface, layers, workspace, d_velden_, l_K_ONTV_VAN, inp_polygon):
    """Hoofdmenu:
    1.) Kopie maken INPUT_POLYGON_LIS
    2.) Spatial joins tussen POLYGON_LIS en de externe gegevens bronnen.
    3.) Velden toevoegen en gegevens overnemen
    4.) Bereken onderbemaling voor DRINKWATER, PLANCAP en VE's
    5.) alle None vervangen door 0
    6.) berekeningen uitvoeren
    7.) resultaat omzetten naar template (als "template" bestaat)
    8.) add results to map
    """
    global g_iface, INP_SKIP_SPJOIN, gdb, l_src_None_naar_0_omzetten, d_velden_tmp, d_velden
    d_velden = d_velden_
    g_iface = iface

    INP_SKIP_SPJOIN = False

    # laod from settings
    gdb = workspace
    l_src_None_naar_0_omzetten = settings.l_fld_None_naar_0_omzetten  # velden waarvan waardes worden omgezet van None naar 0
    d_velden_tmp = settings.d_velden_tmp  # tijdelijke velden

    # layers
    inp_knooppunten, inp_afvoerrelaties, inp_drinkwater_bag, inp_ve_belasting, inp_plancap, inp_verhard_opp, old_inp_polygon = layers
    for i, layer in enumerate(layers):
        print_log("input {}:\t{}".format(i, layer.name()), "d")

    # tussenresultaten
    EINDRESULTAAT = os.path.join(gdb, "eindresultaat.shp")
    POLYGON_LIS = os.path.join(gdb, "POLYGON_LIS.shp")
    DRINKWATER_POLYGON_LIS = os.path.join(gdb,
                                          "SpJoin_DRINKWATER2POLYGON_LIS.shp")
    PLANCAP_POLYGON_LIS = os.path.join(gdb, "SpJoin_PLANCAP2POLYGON_LIS.shp")
    VE_POLYGON_LIS = os.path.join(gdb, "SpJoin_VE2POLYGON_LIS.shp")
    PLANCAP_OVERLAP = os.path.join(gdb, "PLANCAP_OVERLAP.shp")
    STATS_DRINKWATER = os.path.join(gdb, "STATS_DRINKWATER.shp")
    STATS_PLANCAP = os.path.join(gdb, "STATS_PLANCAP.shp")
    STATS_VE = os.path.join(gdb, "STATS_VE.shp")
    EXP_VERHARD_OPP = os.path.join(gdb, "EXP_VERHARD_OPP.shp")
    VERHARD_OPP_INTERSECT = os.path.join(gdb, "VERHARD_OPP_INTERSECT.shp")
    STATS_VERHARD_OPP = os.path.join(gdb, "STATS_VERHARD_OPP.shp")
    INP_POLYGON_COPY = os.path.join(gdb, "inp_polygon_copy.shp")

    # ##########################################################################
    # 1.) export input INP_POLYGON_LIS to result POLYGON_LIS
    tussenresultaat = QgsVectorLayer(POLYGON_LIS, "tussenresultaat", "ogr")
    if EINDRESULTAAT:
        QgsVectorFileWriter.deleteShapeFile(EINDRESULTAAT)
    QgsVectorFileWriter.writeAsVectorFormat(tussenresultaat, EINDRESULTAAT,
                                            "utf-8", tussenresultaat.crs(),
                                            "ESRI Shapefile")
    ##QgsVectorFileWriter.writeAsVectorFormat(tussenresultaat, os.path.join(gdb,"eindresultaat"), "utf-8", tussenresultaat.crs(), "SQLite", False, None ,["SPATIALITE=YES"])

    # ##########################
    ##EINDRESULTAAT = os.path.join(gdb,'eindresultaat.sqlite')
    polygon_lis = QgsVectorLayer(EINDRESULTAAT, "eindresultaat", "ogr")
    polygon_lis = add_layer(polygon_lis)

    fields_to_uppercase(polygon_lis)

    # ##########################################################################
    # 2.) Velden toevoegen en gegevens overnemen
    add_field_from_dict_label(polygon_lis, "st2a", d_velden)
    # copy VAN_KNOOPN -> K_KNP_NR
    bereken_veld(polygon_lis, "K_KNP_NR",
                 {"K_KNP_NR": {
                     "expression": "[VAN_KNOOPN]"
                 }})
    # overige velden kikker toevoegen (uitgegrijst omdat nog geen geschikt bronveld is gevonden in Kikker #
    ##join_field(polygon_lis, inp_knooppunten, "K_BERG_VL", "BERGV_KNP_", "VAN_KNOOPN", "VAN_KNOOPN") # Verloren berging stelsel (m3)
    ##join_field(polygon_lis, inp_knooppunten, "K_BR_RZ_M3", "BERG_STR_M", "VAN_KNOOPN", "VAN_KNOOPN")  # Berging randvoorziening (G) (m3)

    # ##########################################################################
    # 3.) Spatial joins tussen polygon_lis en de externe gegevens bronnen
    if INP_SKIP_SPJOIN:
        blokje_log(
            "Skip SpatialJoin met externe inputs en gebruik bestaande STAT-tabellen.",
            "i")
        stats_drinkwater = QgsVectorLayer(STATS_DRINKWATER, "stats_drinkwater",
                                          "ogr")
        stats_ve = QgsVectorLayer(STATS_VE, "stats_ve", "ogr")
        stats_plancap = QgsVectorLayer(STATS_PLANCAP, "stats_plancap", "ogr")
        stats_drinkwater = add_layer(stats_drinkwater)
        stats_ve = add_layer(stats_ve)
        stats_plancap = add_layer(stats_plancap)
        # for layer in [stats_drinkwater, stats_ve, stats_plancap]:
        #     layer = add_layer(layer)
    else:
        blokje_log(
            "Start SpatialJoin externe bronnen met hoofdbemalingsgebieden... (1 tot 5 minuten)",
            "i")
        stats_drinkwater, stats_ve, stats_plancap = spjoin_bronbestanden_aan_bemalingsgebieden(
            polygon_lis, inp_drinkwater_bag, inp_ve_belasting, inp_plancap,
            inp_polygon, PLANCAP_OVERLAP, STATS_DRINKWATER, STATS_VE,
            STATS_PLANCAP)

    blokje_log(
        "Velden toevoegen en voorbereiden voor berekening onderbemaling...",
        "i")

    # join stat_fields to polygon_lis
    join_field(polygon_lis, stats_drinkwater, "PAR_RESULT", "SUMPAR_M3U",
               "OBJECTID", "OBJECTID")
    join_field(polygon_lis, stats_drinkwater, "ZAK_RESULT", "SUMZAK_M3U",
               "OBJECTID", "OBJECTID")
    join_field(polygon_lis, stats_drinkwater, "X_WON_GEB", "count", "OBJECTID",
               "OBJECTID")
    join_field(polygon_lis, stats_plancap, "AW_15_24_G", "sumExtra_A",
               "OBJECTID", "OBJECTID")  # SUM_Extra_AFW_2015_tm_2024
    join_field(polygon_lis, stats_plancap, "AW_25_50_G", "sumExtra_1",
               "OBJECTID", "OBJECTID")  # SUM_Extra_AFW_2025_tm_2050
    if stats_ve:
        join_field(polygon_lis, stats_ve, "X_VE_GEB", "sumGRONDSL", "OBJECTID",
                   "OBJECTID")

    # bereken drinkwater per gebied (input voor onderbemalingen) en LEDIG_U (ledigingstijd)
    bereken_veld_label(polygon_lis, "02_ber", d_velden)

    # ##########################################################################
    # 4.) Bereken onderbemaling voor DRINKWATER en PLANCAP en VE's
    blokje_log("bereken onderbemalingen voor drinkwater, plancap en ve's...",
               "i")
    bereken_onderbemaling(polygon_lis, l_K_ONTV_VAN[0])

    vervang_None_door_0_voor_velden_in_lijst(l_src_None_naar_0_omzetten,
                                             polygon_lis)

    # ##########################################################################
    # 6.) berekeningen uitvoeren
    # bereken dwa prognose & drinkwater per gebied
    # "bereken": "b2a"
    bereken_veld_label(polygon_lis, "04_ber", d_velden)
    bereken_veld_label(polygon_lis, "04a_ber", d_velden)

    # Vergelijk geschat en gemeten zonder
    # "bereken": "b2b"
    bereken_veld_label(polygon_lis, "05_ber", d_velden)

    # bereken verhard opp
    blokje_log("Bepaal verhard oppervlak binnen bemalingsgebieden...", "i")
    bepaal_verhard_oppervlak(polygon_lis, inp_verhard_opp,
                             VERHARD_OPP_INTERSECT)

    vervang_None_door_0_voor_velden_in_lijst([
        "HA_GEM_G", "HA_VGS_G", "HA_HWA_G", "HA_OPW_G", "HA_NAG_G", "HA_OBK_G"
    ], polygon_lis)

    # bereken velden afhankelijk van verhard opp
    bereken_veld_label(polygon_lis, '07_ber', d_velden)
    bereken_veld_label(polygon_lis, '08_ber', d_velden)

    # bepaal onderbemaling2 afhankelijk van verhard opp
    blokje_log(
        "bereken onderbemalingen voor pompovercapaciteit ontwerp en berekend...",
        "i")
    bereken_onderbemaling2(polygon_lis, l_K_ONTV_VAN)

    vervang_None_door_0_voor_velden_in_lijst(
        ##["POC_B_M3_O", "POC_O_M3_O","POC_B_M3_G", "POC_O_M3_G"], polygon_lis)
        ["POC_O_M3_O", "POC_O_M3_G", "IN_DWA_POC"],
        polygon_lis)
    bereken_veld_label(polygon_lis, '10_ber', d_velden)
    bereken_veld_label(polygon_lis, '11_ber', d_velden)

    # update_datetime UPDATED
    update_datetime(polygon_lis, "UPDATED")

    # delete fields
    del_fld_names = ['BEGIN_EIND', 'VAN_KNOOPN', 'count']
    del_fld_index = [
        polygon_lis.fieldNameIndex(fld) for fld in del_fld_names
        if polygon_lis.fieldNameIndex(fld) != -1
    ]
    print_log("deleting fields {} with index {}".format(
        del_fld_names, del_fld_index))
    polygon_lis.dataProvider().deleteAttributes(del_fld_index)
    polygon_lis.updateFields()

    # add field aliasses
    for fld in d_velden:
        index = polygon_lis.fieldNameIndex(fld)
        if index != -1:
            try:
                print_log(
                    "update {} with alias '{}'".format(
                        fld, d_velden[fld]["field_alias"]), "d")
            except Exception as e:
                print_log(e, "d")  # UnicodeEncodeError?...
            polygon_lis.addAttributeAlias(index, d_velden[fld]["field_alias"])