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()
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])
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)
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])
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)
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
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()
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()