Mehr

Wie erstelle und entferne ich mehrere QgsRubberBands in PyQGIS?

Wie erstelle und entferne ich mehrere QgsRubberBands in PyQGIS?


Derzeit funktioniert der folgende Code-Ausschnitt hervorragend, um eine Form basierend auf dem . hervorzuheben 'darstellen' und 'Schicht' Variablen:

self.rubberHighlight = QgsRubberBand(self.iface.mapCanvas(),QGis.Polygon) self.rubberHighlight.setBorderColor(QtGui.QColor(0,0,255)) self.rubberHighlight.setFillColor(QtGui.QColor(0,0,0,0 )) self.rubberHighlight.setLineStyle(Qt.PenStyle(Qt.DotLine)) self.rubberHighlight.setWidth(3) self.rubberHighlight.setToGeometry(Feature, Ebene) self.rubberHighlight.show()

Nachdem ich ein Highlight erstellt habe, kann ich einzelne Instanzen entfernen mit…

self.iface.mapCanvas().scene().removeItem(self.rubberHighlight) von self.rubberHighlight

… jedoch funktioniert dies nicht für mehrere mit Gummiband hervorgehobene Funktionen gleichzeitig.

Irgendwelche Hinweise, wie man viele Highlights gleichzeitig hinzufügt und entfernt?

AKTUALISIERTE (SCHMUTZIGE) LÖSUNG:

def __init__(self, iface,… , parent=None):… self.rbDict = {}… self.show() def selectedRow(self): selectedIndexes = self.cellSelectionModel.selectedRows() if len(selectedIndexes)<=0 : self.clearRubberBandHighlights() return else: für Index in selectedIndexes: row = index.row() layerAndFeatureIDs = self.tableData.data(self.tableData.index(row,0),Qt.DisplayRole) if layerAndFeatureIDs==None: self.clearRubberBandHighlights() return else: self.clearRubberBandHighlights() if 'Layer' in self.editorType oder 'Stress Period' in self.editorType: single = Keine try: layerId,featureId = [layerAndFid für layerAndFid  in layerAndFeatureIDs.split( '~:#>')] single = True außer: layerIds = [] featureIds = [] eachLayerFidPair = list(set([pair for pair  in layerAndFeatureIDs.split('}${')])) for pair in eachLayerFidPair : layerId,featureId = [layerAndFid for layerAndFid  in pair.split('~:#>')] layerIds.append(layerId) featureIds.append(featureId) single = False if single: layerRef = ftools_utils.getMapLayerB yName(unicode(layerId)) für Feature in layerRef.getFeatures(): if int(feature.id())==int(featureId): self.rubberBandHighlight(feature,layerRef) elif not single: für layIdx, layerId in enumerate (layerIds): layerRef = ftools_utils.getMapLayerByName(unicode(layerId)) für Feature in layerRef.getFeatures(): if int(feature.id())==int(featureIds[layIdx]): self.rubberBandHighlight(feature,layerRef ) def RubberBandHighlight(self,feature,layer): self.rbDict[feature.id()] = QgsRubberBand(self.iface.mapCanvas(),True) self.rbDict[feature.id()].setBorderColor(QtGui.QColor (0,0,255)) self.rbDict[feature.id()].setFillColor(QtGui.QColor(0,0,0,0)) self.rbDict[feature.id()].setLineStyle(Qt.PenStyle(Qt .DotLine)) self.rbDict[feature.id()].setWidth(3) self.rbDict[feature.id()].addGeometry(feature.geometry(),None) def clearRubberBandHighlights(self): for key in self .rbDict.keys(): self.iface.mapCanvas().scene().removeItem(self.rbDict[key]) del self.rbDict[key]

BEISPIEL EINGABEDATEN (wie in QtableView vorhanden):

(wobei jeder Unterlistenindex[0] eine spezielle begrenzte Zeichenfolge aller Layer- und feature.id()-Informationen enthält)

[Aquitards~:#>1,Aquitard 2,1,2,,,,,,,,,,,], [Aquitards~:#>0}${Aquitards~:#>0}${Aquitards~:# >2,Aquitard 1;Aquitard 8;Aquitard 3,1,3,,,,,,,,,,,], [Aquitards~:#>2}${Aquitards~:#>1,Aquitard 7;Aquitard 9 ,1,4,,,,,,,,,,,]

Dies sollte für einen Polygon-Layer funktionieren (ich habe es in der QGIS Python-Konsole getestet, QGIS v.2.8.1):

from qgis.gui import QgsRubberBand from PyQt4.QtGui import QColor rbDict = {} # Wir brauchen dies, um die rbs zu speichern, die wir erstellen werden layer = iface.activeLayer() # Erstellen Sie Gummibänder für f in layer.getFeatures(): fId= f.id() rbDict[fId] = QgsRubberBand(iface.mapCanvas(), True) rbDict[fId].setColor( QColor( 0,255,0,255 ) ) rbDict[fId].setWidth( 2 ) rbDict[fId].addGeometry( f.geometry(), None) # Und dann entfernen Sie sie für f in layer.getFeatures(): fId=f.id() iface.mapCanvas().scene().removeItem(rbDict[fId]) del rbDict[fId ]

Wie Sie vielleicht bereits wissen, würden Sie fast den gleichen Code für Linien verwenden (nur den booleschen Parameter bei der Instanziierung des Gummibands auf False setzen) und QgsVertexMarker für Punkte verwenden.

Sagen Sie mir, wenn etwas nicht klar ist.


Schau das Video: KAKO NAPRAVITI PRIVREMENU TETOVAŽU?