Mehr

QGIS-Layer-Update aus geänderter Datenquelle durchführen


Ich versuche, Layer automatisch zu aktualisieren, wenn sich ihre Datenquelle ändert. Ich verwende R, um ein Shapefile mit einem Attribut zu schreiben und entsprechend diesem Attribut in QGIS einzufärben.

Ich möchte ein neues Shapefile mit anderen Attributwerten schreiben und die Qgis-Kartenfarben aktualisieren. Schritt 1 löst diesen Prozess aus, Schritt 2 veranlasst, dass die Ebene aus dem geänderten Shapefile neu geladen wird. Sein Schritt 2, um den ich mir hier Sorgen mache.

Andere Fragen/Erwähnungen in Mailinglisten unter Verwendung vontriggerRepaintauf der Ebene - das geht nicht. Andere Vorschläge sindsetCacheImage(Keine)und das geht wieder nicht. Die Ebene wird irgendwann aktualisiert, aber ich kann die Logik nicht wirklich erkennen, und manchmal passiert es überraschend, nachdem ich nichts getan habe. Oder vielleicht habe ich vor zwei Minuten etwas getan.

Die einzige reproduzierbare Möglichkeit, es zum Aktualisieren zu bringen, besteht darin, die Ebene aus dem Legendenmenü zu duplizieren - das Duplikat erhält seine Daten immer aus dem aktuellen Shapefile und die ursprüngliche Ebene aktualisiert sich auch selbst! Es muss also eine Möglichkeit geben.

Ich denke, es hat in 2.8 besser funktioniert, aber das ist 2.10, also gibt es vielleicht irgendwo einen neuen Fehler.

Verwandte, aber funktioniert bei mir in 2.10 nicht:

Wie werden Raster-Layer automatisch neu geladen, wenn die Quelle in QGIS geändert wird?

Andere Dinge die ich probiert habe:

  • layer.dataProvider().dataChanged.emit()- einmal gearbeitet, dann nicht noch einmal auf der gleichen Schicht

Ich glaube, ich habe herausgefunden, warum das Duplizieren der Ebene funktioniert - wenn ich eine neue Wegwerfebene basierend auf der aktualisierten Ebene erstelle und dann aufrufe.triggerRepaint()Auf der aktualisierten Ebene wird sie im Kartenbereich aktualisiert:

QgsVectorLayer( layer.source(), "layer copy", layer.providerType() ) layer.triggerRepaint()

Wenn ich eine andere Ebenenquelle verwende, funktioniert es nicht, also scheint es so zu sein, wenn Sie ein Ebenenobjekt basierend auf derselben Ebenenquelle erstellen ...

Ein kurzer Test gerade mit einer Rasterebene (aus einem GeoTIFF) und einfach aufrufenrlayer.triggerRepaint()scheint die Ansicht des Rasters im Kartenbereich zuverlässig zu aktualisieren.


Dies hängt mit der Einführung des OGR-Verbindungspools zusammen. [1]

Vor QGIS 2.10 wurde bei jedem Zugriff (z.B. Repaint) eine Datei neu geöffnet.

Seit QGIS 2.10 wird das Datei-Handle offen gehalten und das bedeutet, wenn eine Datei ersetzt wird, zeigt das Handle auf Unix-basierten Systemen immer noch auf die alte Datei.

QGIS 2.10: Problemumgehung

Leider gibt es keine API, um QGIS zu zwingen, die Datei in QGIS 2.10 erneut zu öffnen. Als Workaround können Sie einen hässlichen Hack verwenden:

layer.dataProvider().changeAttributeValues( { -1: { 0: 0 } } ) layer.triggerRepaint()

QGIS 2.12: Lösung

Ich habe gerade eine neue Methode eingeführt, die ab QGIS 2.12 verfügbar sein wird:

layer.dataProvider().forceReload() layer.triggerRepaint()

Allgemeiner Ansatz

Wenn Sie die Möglichkeit haben zu kontrollieren Wie die Datei überschrieben wird können Sie die vorhandenen Dateien mit Schreibrechten öffnen und den Inhalt ändern, anstatt die Dateien komplett zu ersetzen (löschen/neu erstellen) auf der Festplatte.

[1] Der Verbindungspool wurde eingeführt, um den Zugriff auf bestimmte Datenquellen erheblich zu beschleunigen.


Wenn Sie die Karte schwenken oder anderweitig aktualisieren, sollte sie aktualisiert werden.

In diesem Artikel heißt es, dass Sie Folgendes in PyQGIS verwenden können:

myLayer.triggerRepaint()

Um alle Layer zu aktualisieren, kann folgende Funktion verwendet werden:

def refresh_layers(self): für Layer in qgis.utils.iface.mapCanvas().layers(): layer.triggerRepaint()


Schau das Video: Create A Basic Map Using QGIS Application (Oktober 2021).