Ich versuche, Layer automatisch zu aktualisieren, wenn sich ihre Datenquelle ändert. Ich benutze R, um ein Shapefile mit einem Attribut zu schreiben und es gemäß diesem Attribut in QGIS einzufärben.
Ich möchte ein neues Shapefile mit verschiedenen Attributwerten schreiben und die Qgis-Kartenfarben aktualisieren. Schritt 1 löst diesen Prozess aus, Schritt 2 bewirkt, dass die Ebene aus dem modifizierten Shapefile neu geladen wird. Sein Schritt 2 mache ich mir hier Sorgen.
Andere Fragen / Mailinglisten-Chatter erwähnen die Verwendung triggerRepaint
auf der Ebene - das funktioniert nicht. Andere Vorschläge beinhalten setCacheImage(None)
und wieder funktioniert das nicht. Die Ebene wird letztendlich aktualisiert, aber ich kann die Logik wirklich nicht erkennen, und manchmal passiert es überraschend, wenn ich nichts getan habe. Oder vielleicht habe ich vor zwei Minuten etwas getan.
Die einzige reproduzierbare Möglichkeit zum Aktualisieren besteht darin, die Ebene aus dem Legendenmenü zu duplizieren. Das Duplikat bezieht seine Daten immer aus dem aktuellen Shapefile, und die ursprüngliche Ebene aktualisiert sich auch selbst! Also muss es einen Weg geben, es zu tun.
Ich denke, es hat in 2.8 besser funktioniert, aber das ist 2.10, also gibt es vielleicht irgendwo einen neuen Bug.
Verwandt, funktioniert aber in 2.10 nicht für mich:
Wie lade ich Rasterlayer automatisch neu, wenn die Quelle in QGIS geändert wird?
Andere Dinge, die ich ausprobiert habe:
layer.dataProvider().dataChanged.emit()
- einmal gearbeitet, dann wieder nicht auf der gleichen Ebene
Ich denke, ich habe herausgefunden, warum das Duplizieren der Ebene funktioniert. Wenn ich eine neue Wegwerfebene basierend auf der aktualisierten Ebene erstelle und dann .triggerRepaint()
die aktualisierte Ebene aufrufe, wird sie auf der Kartenoberfläche aktualisiert:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Wenn ich eine andere Ebenenquelle verwende, funktioniert dies nicht. Es scheint also so, als ob Sie ein Ebenenobjekt erstellen, das auf derselben Ebenenquelle basiert ...
Ein schneller Test mit einer Rasterebene (aus einem GeoTIFF) und dem einfachen Aufrufen rlayer.triggerRepaint()
scheint die Ansicht des Rasters im Kartenbereich zuverlässig zu aktualisieren.
layer.setCacheImage(None)
und layer.triggerRepaint()
?
triggerRepaint()
auf der ursprünglichen Ebene. v 2.10.1-Pisa