Ejemplo n.º 1
0
    def processAlgorithm(self, parameters, context, feedback):
        source = self.parameterAsSource(parameters, self.INPUT, context)

        fields = source.fields()
        x_field_index = fields.lookupField(self.parameterAsString(parameters, self.XFIELD, context))
        y_field_index = fields.lookupField(self.parameterAsString(parameters, self.YFIELD, context))
        z_field_index = -1
        if self.parameterAsString(parameters, self.ZFIELD, context):
            z_field_index = fields.lookupField(self.parameterAsString(parameters, self.ZFIELD, context))
        m_field_index = -1
        if self.parameterAsString(parameters, self.MFIELD, context):
            m_field_index = fields.lookupField(self.parameterAsString(parameters, self.MFIELD, context))

        wkb_type = QgsWkbTypes.Point
        if z_field_index >= 0:
            wkb_type = QgsWkbTypes.addZ(wkb_type)
        if m_field_index >= 0:
            wkb_type = QgsWkbTypes.addM(wkb_type)

        target_crs = self.parameterAsCrs(parameters, self.TARGET_CRS, context)

        (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
                                               fields, wkb_type, target_crs)

        request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
        features = source.getFeatures()
        total = 100.0 / source.featureCount() if source.featureCount() else 0

        for current, feature in enumerate(features):
            if feedback.isCanceled():
                break

            feedback.setProgress(int(current * total))
            attrs = feature.attributes()

            try:
                x = float(attrs[x_field_index])
                y = float(attrs[y_field_index])

                point = QgsPoint(x, y)

                if z_field_index >= 0:
                    try:
                        point.addZValue(float(attrs[z_field_index]))
                    except:
                        point.addZValue(0.0)

                if m_field_index >= 0:
                    try:
                        point.addMValue(float(attrs[m_field_index]))
                    except:
                        point.addMValue(0.0)

                feature.setGeometry(QgsGeometry(point))
            except:
                pass  # no geometry

            sink.addFeature(feature)

        return {self.OUTPUT: dest_id}
Ejemplo n.º 2
0
    def processAlgorithm(self, parameters, context, feedback):
        source = self.parameterAsSource(parameters, self.INPUT, context)

        fields = source.fields()
        x_field_index = fields.lookupField(self.parameterAsString(parameters, self.XFIELD, context))
        y_field_index = fields.lookupField(self.parameterAsString(parameters, self.YFIELD, context))
        z_field_index = -1
        if self.parameterAsString(parameters, self.ZFIELD, context):
            z_field_index = fields.lookupField(self.parameterAsString(parameters, self.ZFIELD, context))
        m_field_index = -1
        if self.parameterAsString(parameters, self.MFIELD, context):
            m_field_index = fields.lookupField(self.parameterAsString(parameters, self.MFIELD, context))

        wkb_type = QgsWkbTypes.Point
        if z_field_index >= 0:
            wkb_type = QgsWkbTypes.addZ(wkb_type)
        if m_field_index >= 0:
            wkb_type = QgsWkbTypes.addM(wkb_type)

        target_crs = self.parameterAsCrs(parameters, self.TARGET_CRS, context)

        (sink, dest_id) = self.parameterAsSink(parameters, self.OUTPUT, context,
                                               fields, wkb_type, target_crs)

        request = QgsFeatureRequest().setFlags(QgsFeatureRequest.NoGeometry)
        features = source.getFeatures()
        total = 100.0 / source.featureCount() if source.featureCount() else 0

        for current, feature in enumerate(features):
            if feedback.isCanceled():
                break

            feedback.setProgress(int(current * total))
            attrs = feature.attributes()

            try:
                x = float(attrs[x_field_index])
                y = float(attrs[y_field_index])

                point = QgsPoint(x, y)

                if z_field_index >= 0:
                    try:
                        point.addZValue(float(attrs[z_field_index]))
                    except:
                        point.addZValue(0.0)

                if m_field_index >= 0:
                    try:
                        point.addMValue(float(attrs[m_field_index]))
                    except:
                        point.addMValue(0.0)

                feature.setGeometry(QgsGeometry(point))
            except:
                pass  # no geometry

            sink.addFeature(feature)

        return {self.OUTPUT: dest_id}
Ejemplo n.º 3
0
    def processAlgorithm(self, parameters, context, feedback):
        source = self.getParameterValue(self.INPUT)
        vlayer = QgsProcessingUtils.mapLayerFromString(source, context)
        output = self.getOutputFromName(self.OUTPUT)

        fields = vlayer.fields()
        x_field_index = fields.lookupField(self.getParameterValue(self.XFIELD))
        y_field_index = fields.lookupField(self.getParameterValue(self.YFIELD))
        z_field_index = None
        if self.getParameterValue(self.ZFIELD):
            z_field_index = fields.lookupField(self.getParameterValue(self.ZFIELD))
        m_field_index = None
        if self.getParameterValue(self.MFIELD):
            m_field_index = fields.lookupField(self.getParameterValue(self.MFIELD))

        wkb_type = QgsWkbTypes.Point
        if z_field_index is not None:
            wkb_type = QgsWkbTypes.addZ(wkb_type)
        if m_field_index is not None:
            wkb_type = QgsWkbTypes.addM(wkb_type)

        crsId = self.getParameterValue(self.TARGET_CRS)
        target_crs = QgsCoordinateReferenceSystem()
        target_crs.createFromUserInput(crsId)

        writer = output.getVectorWriter(fields, wkb_type, target_crs, context)

        features = QgsProcessingUtils.getFeatures(vlayer, context)
        total = 100.0 / QgsProcessingUtils.featureCount(vlayer, context)

        for current, feature in enumerate(features):
            feedback.setProgress(int(current * total))
            attrs = feature.attributes()

            try:
                x = float(attrs[x_field_index])
                y = float(attrs[y_field_index])

                point = QgsPoint(x, y)

                if z_field_index is not None:
                    try:
                        point.addZValue(float(attrs[z_field_index]))
                    except:
                        point.addZValue(0.0)

                if m_field_index is not None:
                    try:
                        point.addMValue(float(attrs[m_field_index]))
                    except:
                        point.addMValue(0.0)

                feature.setGeometry(QgsGeometry(point))
            except:
                pass  # no geometry

            writer.addFeature(feature)

        del writer
Ejemplo n.º 4
0
    def processAlgorithm(self, parameters, context, feedback):
        source = self.getParameterValue(self.INPUT)
        vlayer = QgsProcessingUtils.mapLayerFromString(source, context)
        output = self.getOutputFromName(self.OUTPUT)

        fields = vlayer.fields()
        x_field_index = fields.lookupField(self.getParameterValue(self.XFIELD))
        y_field_index = fields.lookupField(self.getParameterValue(self.YFIELD))
        z_field_index = None
        if self.getParameterValue(self.ZFIELD):
            z_field_index = fields.lookupField(self.getParameterValue(self.ZFIELD))
        m_field_index = None
        if self.getParameterValue(self.MFIELD):
            m_field_index = fields.lookupField(self.getParameterValue(self.MFIELD))

        wkb_type = QgsWkbTypes.Point
        if z_field_index is not None:
            wkb_type = QgsWkbTypes.addZ(wkb_type)
        if m_field_index is not None:
            wkb_type = QgsWkbTypes.addM(wkb_type)

        crsId = self.getParameterValue(self.TARGET_CRS)
        target_crs = QgsCoordinateReferenceSystem()
        target_crs.createFromUserInput(crsId)

        writer = output.getVectorWriter(fields, wkb_type, target_crs, context)

        features = QgsProcessingUtils.getFeatures(vlayer, context)
        total = 100.0 / QgsProcessingUtils.featureCount(vlayer, context)

        for current, feature in enumerate(features):
            feedback.setProgress(int(current * total))
            attrs = feature.attributes()

            try:
                x = float(attrs[x_field_index])
                y = float(attrs[y_field_index])

                point = QgsPoint(x, y)

                if z_field_index is not None:
                    try:
                        point.addZValue(float(attrs[z_field_index]))
                    except:
                        point.addZValue(0.0)

                if m_field_index is not None:
                    try:
                        point.addMValue(float(attrs[m_field_index]))
                    except:
                        point.addMValue(0.0)

                feature.setGeometry(QgsGeometry(point))
            except:
                pass  # no geometry

            writer.addFeature(feature)

        del writer
Ejemplo n.º 5
0
    def btn_ok_clicked(self):
        new_zs = self.static_canvas.pipe_line.get_ydata()
        pipe_geom_v2 = self.pipe_ft.geometry().get()
        for p in range(pipe_geom_v2.vertexCount(0, 0)):
            vertex_id = QgsVertexId(0, 0, p, QgsVertexId.SegmentVertex)
            vertex = pipe_geom_v2.vertexAt(vertex_id)
            new_pos_pt = QgsPoint(vertex.x(), vertex.y())
            new_pos_pt.addZValue(new_zs[p])

            LinkHandler.move_link_vertex(self.params, self.params.pipes_vlay,
                                         self.pipe_ft, new_pos_pt, p)

        # Update delta z for nodes
        (start_node_ft, end_node_ft) = NetworkUtils.find_start_end_nodes(
            self.params, self.pipe_ft.geometry())
        start_node_elev = start_node_ft.attribute(Junction.field_name_elev)
        # end_node_deltaz = end_node_ft.attribute(Junction.field_name_delta_z)
        end_node_elev = end_node_ft.attribute(Junction.field_name_elev)

        start_node_new_deltaz = new_zs[0] - start_node_elev
        end_node_new_deltaz = new_zs[-1] - end_node_elev

        start_node_ft.setAttribute(
            start_node_ft.fieldNameIndex(Junction.field_name_delta_z),
            start_node_new_deltaz)
        end_node_ft.setAttribute(
            end_node_ft.fieldNameIndex(Junction.field_name_delta_z),
            end_node_new_deltaz)

        # Update start node elevation attribute
        start_node_lay = NetworkUtils.find_node_layer(self.params,
                                                      start_node_ft.geometry())
        vector_utils.update_attribute(start_node_lay, start_node_ft,
                                      Junction.field_name_delta_z,
                                      float(start_node_new_deltaz))

        # Update end node elevation attribute
        end_node_lay = NetworkUtils.find_node_layer(self.params,
                                                    end_node_ft.geometry())
        vector_utils.update_attribute(end_node_lay, end_node_ft,
                                      Junction.field_name_delta_z,
                                      float(end_node_new_deltaz))

        # Update pipe length
        # Calculate 3D length
        pipe_geom_2 = self.pipe_ft.geometry()
        if self.params.dem_rlay is not None:
            length_3d = LinkHandler.calc_3d_length(self.params, pipe_geom_2)
        else:
            length_3d = pipe_geom_2.length()
        vector_utils.update_attribute(self.params.pipes_vlay, self.pipe_ft,
                                      Pipe.field_name_length, length_3d)

        self.setVisible(False)
Ejemplo n.º 6
0
def point_from_event(event: QgsMapMouseEvent, snapping: bool) -> QgsPoint:
    """
    Returns the point from the mouse canvas event. If snapping is enabled it will be
    snapped using the settings.
    :param event: The map mouse event.
    :return: Point for the map canvas event.
    """
    if snapping:
        point = QgsPoint(event.snapPoint())
        point.addZValue(0)
    else:
        point = QgsPoint(event.originalMapPoint())
        point.addZValue(0)
    return point
Ejemplo n.º 7
0
    def addZtoPointFeatures(self,
                            inputPoints,
                            inputCrs,
                            fieldIdWithZVals=-1,
                            override=True):
        #pointsListZ=[] #list of QgsFeature()
        featuresWithZ = []
        try:

            #check if pointsLayer is emty
            #if inputPoints.featureCount!=0:
            for feat in inputPoints:
                #if geom.hasZ==False or geom.hasZ==True and override==True:
                # get Raster Values for each point feature
                featZ = QgsFeature(feat.fields())  #Copy of the Feature
                geom = feat.geometry()
                #create a copy of the geometry for temporary transform to the project.crs()
                wkb = feat.geometry().asWkb()
                #self.feedback.pushInfo("addZtoPointFeatures1 " + geom.asWkt())
                geom2CRS = QgsGeometry()
                geom2CRS.fromWkb(wkb)
                #transform geom to rasterLayer.crs() if crs a different
                if not inputCrs.authid() == self.rasterLayer.crs().authid():
                    trafo = QgsCoordinateTransform(inputCrs,
                                                   self.rasterLayer.crs(),
                                                   QgsProject.instance())
                    #transform clip Geom to SrcLayer.crs Reverse
                    geom2CRS.transform(trafo,
                                       QgsCoordinateTransform.ForwardTransform,
                                       False)

                pinPoint = None
                if geom.isMultipart():
                    pinPoint = geom.vertexAt(
                        0)  #nimm den ersten Punkt, wenn es ein MultiPoint ist
                    pin2Crs = geom2CRS.vertexAt(0)

                else:
                    pinPoint = geom.asPoint()
                    pin2Crs = geom2CRS.asPoint()

                rastVal = None
                if fieldIdWithZVals > -1:
                    rastVal = feat[fieldIdWithZVals]
                    if rastVal is None or str(rastVal) == 'NULL':
                        felder = feat.fields()
                        feld = felder.field(fieldIdWithZVals)
                        self.feedback.reportError('Error on Feature ' +
                                                  str(feat.id()))
                        self.feedback.reportError('Feature Attributes :' +
                                                  str(feat.attributes()))
                        raise QgsProcessingException('Z value on field   ' +
                                                     feld.name() +
                                                     ' is empty!')
                else:  #hole Z-Wert von DGM
                    rastVal = self.interpolator.linear(
                        pin2Crs)  #QgsPointXY(4459566.0, 5613959.0))
                #self.feedback.pushInfo("addZtoPointFeatures2 " + geom.asWkt() + " 2Crs: " + geom2CRS.asWkt())
                #self.feedback.pushInfo("rastVal " + str(pinPoint)+ " = in RasterCrs:"+ str(pin2Crs)+ " = "+ str(rastVal))
                #rastSample = rasterLayer.dataProvider().identify(pin2Crs, QgsRaster.IdentifyFormatValue).results()
                if not rastVal is None or str(
                        rastVal
                ) != 'NULL':  # ToDo der Leerwert muss noch beruecksichtigt werden
                    wkt = "PointZ(" + str(pinPoint.x()) + " " + str(
                        pinPoint.y()) + " " + str(rastVal) + ")"
                    #self.feedback.reportError(wkt)

                    #construct new Feature in source Crs
                    ptZ = QgsPoint(pinPoint.x(), pinPoint.y())
                    ptZ.addZValue(rastVal)
                    geomZ = QgsGeometry.fromWkt(wkt)
                    featZ.setGeometry(geomZ)
                    featZ.setAttributes(feat.attributes())
                    featuresWithZ.append(featZ)
                else:
                    self.feedback.reportError('Point Feature: ' + feat.id() +
                                              '  ' + wkt + ' ' +
                                              feat.attributes())
                    raise QgsProcessingException(
                        "No valid RasterValue for this position: " +
                        str(round(pinPoint.x(), 1)) + " " +
                        str(round(pinPoint.y(), 1)) + ' raster value: ' +
                        str(rastVal))
            #self.feedback.pushInfo("addZtoPointFeatures " + str(len(featuresWithZ))+ " Objekte")
        except Exception as err:
            msg = "Error: add Z to Point Features {0} \n {1}".format(
                err.args, repr(err))
            self.feedback.reportError(msg)
            featuresWithZ = []
            raise QgsProcessingException(msg)
            #print("Error addZtoPointFeatures")#,str(err.args) + ";" + str(repr(err)))
            #raise QgsProcessingException("Error addZtoPointFeatures " + str(err.args))# + ";" + str(repr(err)))
        return featuresWithZ
Ejemplo n.º 8
0
    def canvasReleaseEvent(self, event):

        mouse_pt = self.toMapCoordinates(event.pos())

        if not self.mouse_clicked:
            return

        if event.button() == 1:
            self.mouse_clicked = False

            if self.snap_results is not None:

                snap_results = self.snap_results
                selected_node_ft = self.selected_node_ft
                selected_node_ft_lay = self.selected_node_ft_lay

                # Check elev
                if self.elev is None and self.params.dem_rlay is not None:
                    self.iface.messageBar().pushMessage(
                        Parameters.plug_in_name,
                        'Elevation value not available: element elevation set to 0.',
                        Qgis.Warning, 5)  # TODO: softcode

                # It's just a pipe vertex
                if selected_node_ft is None:

                    feat = vector_utils.get_feats_by_id(
                        snap_results.layer(), snap_results.featureId())
                    vertex_id = QgsVertexId(0, 0, snap_results.vertexIndex(),
                                            QgsVertexId.SegmentVertex)
                    vertex_v2 = feat[0].geometry().get().vertexAt(vertex_id)
                    new_pos_pt_v2 = QgsPoint(mouse_pt.x(), mouse_pt.y())
                    new_pos_pt_v2.addZValue(vertex_v2.z())
                    LinkHandler.move_link_vertex(self.params,
                                                 self.params.pipes_vlay,
                                                 feat[0], new_pos_pt_v2,
                                                 snap_results.vertexIndex())

                # There are adjacent links: it's a node
                else:

                    # Not pump or valve: plain junction
                    if not self.pump_valve_selected:

                        # Update junction geometry
                        NodeHandler.move_element(selected_node_ft_lay,
                                                 self.params.dem_rlay,
                                                 selected_node_ft, mouse_pt)

                        # Update pipes
                        for feat, (vertex_index,
                                   layer) in self.adj_links_fts_d.items():

                            vertex_id = QgsVertexId(0, 0, vertex_index,
                                                    QgsVertexId.SegmentVertex)
                            vertex_v2 = feat.geometry().get().vertexAt(
                                vertex_id)
                            new_pos_pt_v2 = QgsPoint(mouse_pt.x(),
                                                     mouse_pt.y())
                            new_pos_pt_v2.addZValue(vertex_v2.z())

                            LinkHandler.move_link_vertex(
                                self.params, layer, feat, new_pos_pt_v2,
                                vertex_index)

                    # Pump or valve
                    else:

                        # Update junctions geometry
                        NodeHandler.move_element(
                            self.adj_junctions[0][1], self.params.dem_rlay,
                            self.adj_junctions[0][0],
                            QgsPointXY(
                                self.adj_junctions[0]
                                [0].geometry().asPoint().x() +
                                self.delta_vec.x(), self.adj_junctions[0]
                                [0].geometry().asPoint().y() +
                                self.delta_vec.y()))

                        NodeHandler.move_element(
                            self.adj_junctions[1][1], self.params.dem_rlay,
                            self.adj_junctions[1][0],
                            QgsPointXY(
                                self.adj_junctions[1]
                                [0].geometry().asPoint().x() +
                                self.delta_vec.x(), self.adj_junctions[1]
                                [0].geometry().asPoint().y() +
                                self.delta_vec.y()))

                        # in 2.16: NodeHandler.move_element(Parameters.junctions_vlay, self.adj_links_fts[0], self.adj_links_fts[0].geometry().asPoint() + self.delta_vec)

                        if self.pump_or_valve == 'pump':
                            lay = self.params.pumps_vlay
                        elif self.pump_or_valve == 'valve':
                            lay = self.params.valves_vlay

                        # Move the pump/valve
                        LinkHandler.move_pump_valve(lay, self.pump_valve_ft,
                                                    self.delta_vec)

                        # Move the adjacent pipes' vertices
                        for feat, (vertex_index,
                                   layer) in self.adj_links_fts_d.items():

                            vertex_id = QgsVertexId(0, 0, vertex_index,
                                                    QgsVertexId.SegmentVertex)
                            vertex_v2 = feat.geometry().get().vertexAt(
                                vertex_id)
                            new_pos_pt_v2 = QgsPoint(
                                feat.geometry().vertexAt(vertex_index).x() +
                                self.delta_vec.x(),
                                feat.geometry().vertexAt(vertex_index).y() +
                                self.delta_vec.y())
                            new_pos_pt_v2.addZValue(vertex_v2.z())

                            LinkHandler.move_link_vertex(
                                self.params, layer, feat, new_pos_pt_v2,
                                vertex_index)
                            # In 2.16: LinkHandler.move_pipe_vertex(feat, feat.geometry().vertexAt(vertex_index) + self.delta_vec, vertex_index)

                    self.adj_links_fts_d.clear()

                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.junctions_vlay)
                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.reservoirs_vlay)
                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.tanks_vlay)
                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.pipes_vlay)
                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.pumps_vlay)
                symbology.refresh_layer(self.iface.mapCanvas(),
                                        self.params.valves_vlay)

            # Remove vertex marker and rubber band
            self.vertex_marker.hide()
            self.iface.mapCanvas().scene().removeItem(self.rubber_band)