Ejemplo n.º 1
0
    def canvasReleaseEvent(self, event):
        layer = self.canvas.currentLayer()

        if layer <> None:
            #Get the click
            x = event.pos().x()
            y = event.pos().y()
            thisPoint = QtCore.QPoint(x, y)
            #we need a snapper, so we use the MapCanvas snapper
            snapper = QgsMapCanvasSnapper(self.canvas)
            #QgsMapToPixel instance
            mapToPixel = self.canvas.getCoordinateTransform()

            if event.button() == QtCore.Qt.LeftButton:
                if self.lineFeature == None:
                    # step 1: snap to a start/end point of an existing line
                    #we snap to the current layer (we don't have exclude points and use the tolerances from the qgis properties)
                    (retval, result) = snapper.snapToCurrentLayer (thisPoint, QgsSnapper.SnapToVertex)

                    if result != []:
                        #check if this is the start/end vertex of the line
                        if result[0].afterVertexNr == -1 or result[0].beforeVertexNr == -1:
                            # get the snapped feature
                            fid = result[0].snappedAtGeometry
                            self.lineFeature = QgsFeature()
                            featureFound = layer.getFeatures(QgsFeatureRequest().setFilterFid(fid)).nextFeature(self.lineFeature)

                            if featureFound:
                                #mark the vertex
                                startPoint = QgsPoint()
                                startPoint.setX( result[0].snappedVertex.x() )
                                startPoint.setY( result[0].snappedVertex.y() )
                                self.marker = QgsVertexMarker(self.canvas)
                                self.marker.setIconType(1)
                                self.marker.setColor(QtGui.QColor(255,0,0))
                                self.marker.setIconSize(12)
                                self.marker.setPenWidth (3)
                                self.marker.setCenter(startPoint)
                                # step 2: create a QgsRubberBand
                                self.rubberBand = QgsRubberBand(self.canvas)
                                self.rubberBand.addPoint(startPoint)
                                self.rubberBand.addPoint(startPoint) # second point to be moved
                                self.startedDigitizing.emit(layer, self.lineFeature,  startPoint,  self.rubberBand)
                            else:
                                self.lineFeature = None
                    else:
                        #warn about missing snapping tolerance if appropriate
                        dtutils.showSnapSettingsWarning()
                else: # step 3: have user digitize line
                    self.rubberBand.addPoint(mapToPixel.toMapCoordinates(thisPoint))
            else: # right click
                if self.lineFeature != None: # step 4: end digitizing merge rubbber band and existing geometry
                    rbGeom = self.rubberBand.asGeometry()
                    self.finishedDigitizing.emit(rbGeom)
                    self.reset()
                    self.canvas.refresh()
Ejemplo n.º 2
0
    def canvasReleaseEvent(self,event):
        if self.count < self.numVertices: #not yet enough
            #Get the click
            x = event.pos().x()
            y = event.pos().y()

            layer = self.canvas.currentLayer()

            if layer <> None:
                #the clicked point is our starting point
                startingPoint = QtCore.QPoint(x,y)

                #we need a snapper, so we use the MapCanvas snapper
                snapper = self.canvas.snappingUtils()
                snapper.setCurrentLayer(layer)

                # snapType = 0: no snap, 1 = vertex, 2 = segment, 3 = vertex & segment
                snapType = 1
                snapMatch = snapper.snapToCurrentLayer(startingPoint, snapType)

                if not snapMatch.isValid():
                    #warn about missing snapping tolerance if appropriate
                    dtutils.showSnapSettingsWarning(self.iface)
                else:
                    #mark the vertex
                    p = snapMatch.point()
                    m = QgsVertexMarker(self.canvas)
                    m.setIconType(1)

                    if self.count == 0:
                        m.setColor(QtGui.QColor(255,0,0))
                    else:
                        m.setColor(QtGui.QColor(0, 0, 255))

                    m.setIconSize(12)
                    m.setPenWidth (3)
                    m.setCenter(p)
                    self.points.append(p)
                    self.markers.append(m)
                    fid = snapMatch.featureId() # QgsFeatureId of the snapped geometry
                    self.fids.append(fid)
                    self.count += 1

                    if self.count == self.numVertices:
                        self.vertexFound.emit([self.points,  self.markers,  self.fids])
Ejemplo n.º 3
0
    def canvasReleaseEvent(self,event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        layer = self.canvas.currentLayer()

        if layer <> None:
            #the clicked point is our starting point
            startingPoint = QtCore.QPoint(x,y)

            #we need a snapper, so we use the MapCanvas snapper
            snapper = QgsMapCanvasSnapper(self.canvas)
            (hasSnapSettings,  snapEnabled,  snapType,  snapUnits,  snapTolerance, avoidInters) = QgsProject.instance().snapSettingsForLayer(layer.id())

            if not hasSnapSettings:
                dtutils.showSnapSettingsWarning()
            elif not snapEnabled:
                dtutils.showSnapSettingsWarning()
            else:
                #we snap to the current layer (we don't have exclude points and use the tolerances from the qgis properties)
                (retval,result) = snapper.snapToCurrentLayer(startingPoint, snapType)

                if result == []:
                    dtutils.showSnapSettingsWarning()
                else:
                    #mehrere fids
                    fids = []
                    for i in range(len(result)):
                        fid = result[i].snappedAtGeometry # QgsFeatureId of the snapped geometry
                        fids.append(fid)

                    layer.removeSelection()
                    layer.setSelectedFeatures(fids)
                    self.featureSelected.emit(fids)
Ejemplo n.º 4
0
    def canvasReleaseEvent(self,event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        layer = self.canvas.currentLayer()

        if layer != None:
            #the clicked point is our starting point
            startingPoint = QtCore.QPoint(x,y)

            #we need a snapper, so we use the MapCanvas snapper
            snapper = self.canvas.snappingUtils()
            snapper.setCurrentLayer(layer)

            # snapType = 0: no snap, 1 = vertex, 2 = segment, 3 = vertex & segment
            snapType = 2
            snapMatch = snapper.snapToCurrentLayer(startingPoint, QgsPointLocator.Edge)

            if not snapMatch.isValid():
                #warn about missing snapping tolerance if appropriate
                dtutils.showSnapSettingsWarning(self.iface)
            else:
                #if we have found a linesegment
                edge = snapMatch.edgePoints()
                p1 = edge[0]
                p2 = edge[1]
                # we like to mark the segment that is choosen, so we need a rubberband
                self.rb1.reset()
                color = QtGui.QColor(255,0,0)
                self.rb1.setColor(color)
                self.rb1.setWidth(2)
                self.rb1.addPoint(p1)
                self.rb1.addPoint(p2)
                self.rb1.show()
                self.segmentFound.emit([self.rb1.getPoint(0, 0),  self.rb1.getPoint(0, 1),  self.rb1])
Ejemplo n.º 5
0
    def canvasReleaseEvent(self, event):
        #Get the click
        x = event.pos().x()
        y = event.pos().y()

        layer = self.canvas.currentLayer()

        if layer <> None:
            #the clicked point is our starting point
            startingPoint = QtCore.QPoint(x, y)

            #we need a snapper, so we use the MapCanvas snapper
            snapper = QgsMapCanvasSnapper(self.canvas)
            (hasSnapSettings, snapEnabled, snapType, snapUnits, snapTolerance,
             avoidInters) = QgsProject.instance().snapSettingsForLayer(
                 layer.id())

            if not hasSnapSettings:
                dtutils.showSnapSettingsWarning()
            elif not snapEnabled:
                dtutils.showSnapSettingsWarning()
            else:
                #we snap to the current layer (we don't have exclude points and use the tolerances from the qgis properties)
                (retval,
                 result) = snapper.snapToCurrentLayer(startingPoint, snapType)

                if result == []:
                    dtutils.showSnapSettingsWarning()
                else:
                    #mehrere fids
                    fids = []
                    for i in range(len(result)):
                        fid = result[
                            i].snappedAtGeometry  # QgsFeatureId of the snapped geometry
                        fids.append(fid)

                    layer.removeSelection()
                    layer.setSelectedFeatures(fids)
                    self.featureSelected.emit(fids)
Ejemplo n.º 6
0
    def getFeatureForPoint(self, layer, startingPoint, inRing = False):
        '''
        return the feature this QPoint is in (polygon layer)
        or this QPoint snaps to (point or line layer)
        '''
        result = []

        if self.isPolygonLayer(layer):
            mapToPixel = self.canvas.getCoordinateTransform()
            #thisQgsPoint = mapToPixel.toMapCoordinates(startingPoint)
            thisQgsPoint = self.transformed(layer, mapToPixel.toMapCoordinates(startingPoint))
            spatialIndex = dtutils.dtSpatialindex(layer)
            featureIds = spatialIndex.nearestNeighbor(thisQgsPoint, 0)
            # if we use 0 as neighborCount then only features that contain the point
            # are included

            for fid in featureIds:
                feat = dtutils.dtGetFeatureForId(layer, fid)

                if feat != None:
                    geom = QgsGeometry(feat.geometry())

                    if geom.contains(thisQgsPoint):
                        result.append(feat)
                        result.append([])
                        return result
                        break
                    else:
                        if inRing:
                            rings = dtutils.dtExtractRings(geom)

                            if len(rings) > 0:
                                for aRing in rings:
                                    if aRing.contains(thisQgsPoint):
                                        result.append(feat)
                                        result.append([])
                                        result.append(aRing)
                                        return result
                                        break
        else:
            #we need a snapper, so we use the MapCanvas snapper
            snapper = self.canvas.snappingUtils()
            snapper.setCurrentLayer(layer)
            # snapType = 0: no snap, 1 = vertex, 2 vertex & segment, 3 = segment
            snapMatch = snapper.snapToCurrentLayer(startingPoint, QgsPointLocator.All)

            if not snapMatch.isValid():
                dtutils.showSnapSettingsWarning(self.iface)
            else:
                feat = dtutils.dtGetFeatureForId(layer, snapMatch.featureId())

                if feat != None:
                    result.append(feat)

                    if snapMatch.hasVertex():
                        result.append([snapMatch.point(), None])

                    if snapMatch.hasEdge():
                        result.append(snapMatch.edgePoints())

                    return result

        return result
Ejemplo n.º 7
0
    def canvasReleaseEvent(self, event):
        layer = self.canvas.currentLayer()

        if layer <> None:
            #Get the click
            x = event.pos().x()
            y = event.pos().y()
            thisPoint = QtCore.QPoint(x, y)
            #QgsMapToPixel instance
            mapToPixel = self.canvas.getCoordinateTransform()

            if event.button() == QtCore.Qt.LeftButton:
                if self.lineFeature == None:
                    # step 1: snap to a start/end point of an existing line
                    #we snap to the current layer (we don't have exclude points and use the tolerances from the qgis properties)
                    snapper = self.canvas.snappingUtils()
                    snapper.setCurrentLayer(layer)

                    # snapType = 0: no snap, 1 = vertex, 2 = segment, 3 = vertex & segment
                    snapType = 1
                    snapMatch = snapper.snapToCurrentLayer(thisPoint, snapType)
                    snappedVertex = snapMatch.point()

                    if not snapMatch.isValid():
                        dtutils.showSnapSettingsWarning(self.iface)
                    else:
                        snappedIdx = snapMatch.vertexIndex()
                        fid = snapMatch.featureId()
                        self.lineFeature = QgsFeature()
                        # get the snapped feature
                        featureFound = layer.getFeatures(
                            QgsFeatureRequest().setFilterFid(fid)).nextFeature(self.lineFeature)

                        if featureFound:
                            #check if this is the start/end vertex of the line
                            if snappedIdx == 0 or \
                                QgsGeometry(self.lineFeature.geometry()).vertexAt(snappedIdx + 1) == QgsPoint(0, 0):

                                #mark the vertex
                                startPoint = QgsPoint()
                                startPoint.setX(snappedVertex.x())
                                startPoint.setY(snappedVertex.y())
                                self.marker = QgsVertexMarker(self.canvas)
                                self.marker.setIconType(1)
                                self.marker.setColor(QtGui.QColor(255,0,0))
                                self.marker.setIconSize(12)
                                self.marker.setPenWidth (3)
                                self.marker.setCenter(startPoint)
                                # step 2: create a QgsRubberBand
                                self.rubberBand = QgsRubberBand(self.canvas)
                                self.rubberBand.setColor(self.rubberBandColor)
                                self.rubberBand.setWidth(self.rubberBandWidth)
                                self.rubberBand.addPoint(startPoint)
                                self.rubberBand.addPoint(startPoint) # second point to be moved
                                self.startedDigitizing.emit(layer, self.lineFeature,  startPoint,  self.rubberBand)
                            else:
                                self.lineFeature = None
                        else:
                            self.lineFeature = None
                else: # step 3: have user digitize line
                    self.rubberBand.addPoint(mapToPixel.toMapCoordinates(thisPoint))
            else: # right click
                if self.lineFeature != None: # step 4: end digitizing merge rubbber band and existing geometry
                    self.rubberBand.removeLastPoint()

                    if self.rubberBand.numberOfVertices() > 1:
                        rbGeom = self.rubberBand.asGeometry()
                        self.finishedDigitizing.emit(rbGeom)
                        self.reset()
                    else:
                        self.reset(True)

                    self.canvas.refresh()
Ejemplo n.º 8
0
    def canvasReleaseEvent(self, event):
        layer = self.canvas.currentLayer()

        if layer <> None:
            #Get the click
            x = event.pos().x()
            y = event.pos().y()
            thisPoint = QtCore.QPoint(x, y)
            #we need a snapper, so we use the MapCanvas snapper
            snapper = QgsMapCanvasSnapper(self.canvas)
            #QgsMapToPixel instance
            mapToPixel = self.canvas.getCoordinateTransform()

            if event.button() == QtCore.Qt.LeftButton:
                if self.lineFeature == None:
                    # step 1: snap to a start/end point of an existing line
                    #we snap to the current layer (we don't have exclude points and use the tolerances from the qgis properties)
                    (retval, result) = snapper.snapToCurrentLayer(
                        thisPoint, QgsSnapper.SnapToVertex)

                    if result != []:
                        #check if this is the start/end vertex of the line
                        if result[0].afterVertexNr == -1 or result[
                                0].beforeVertexNr == -1:
                            # get the snapped feature
                            fid = result[0].snappedAtGeometry
                            self.lineFeature = QgsFeature()
                            featureFound = layer.getFeatures(
                                QgsFeatureRequest().setFilterFid(
                                    fid)).nextFeature(self.lineFeature)

                            if featureFound:
                                #mark the vertex
                                startPoint = QgsPoint()
                                startPoint.setX(result[0].snappedVertex.x())
                                startPoint.setY(result[0].snappedVertex.y())
                                self.marker = QgsVertexMarker(self.canvas)
                                self.marker.setIconType(1)
                                self.marker.setColor(QtGui.QColor(255, 0, 0))
                                self.marker.setIconSize(12)
                                self.marker.setPenWidth(3)
                                self.marker.setCenter(startPoint)
                                # step 2: create a QgsRubberBand
                                self.rubberBand = QgsRubberBand(self.canvas)
                                self.rubberBand.setColor(self.rubberBandColor)
                                self.rubberBand.setWidth(self.rubberBandWidth)
                                self.rubberBand.addPoint(startPoint)
                                self.rubberBand.addPoint(
                                    startPoint)  # second point to be moved
                                self.startedDigitizing.emit(
                                    layer, self.lineFeature, startPoint,
                                    self.rubberBand)
                            else:
                                self.lineFeature = None
                    else:
                        #warn about missing snapping tolerance if appropriate
                        dtutils.showSnapSettingsWarning()
                else:  # step 3: have user digitize line
                    self.rubberBand.addPoint(
                        mapToPixel.toMapCoordinates(thisPoint))
            else:  # right click
                if self.lineFeature != None:  # step 4: end digitizing merge rubbber band and existing geometry
                    self.rubberBand.removeLastPoint()

                    if self.rubberBand.numberOfVertices() > 1:
                        rbGeom = self.rubberBand.asGeometry()
                        self.finishedDigitizing.emit(rbGeom)
                        self.reset()
                    else:
                        self.reset(True)

                    self.canvas.refresh()