Sto cercando di aggiornare automaticamente i layer quando cambia la loro origine dati. Sto usando R per scrivere un file di forma con un attributo e colorare in base a quell'attributo in QGIS.
Voglio scrivere un nuovo shapefile con valori di attributo diversi e avere l'aggiornamento dei colori della mappa Qgis. Il passaggio 1 sta attivando quel processo, il passaggio 2 sta facendo ricaricare il layer dal file di forma modificato. È il passaggio 2 di cui mi preoccupo qui.
Altre domande / chiacchiere triggerRepaint
sulla mailing list menzionano l'uso sul livello - che non funziona. Altri suggerimenti includono setCacheImage(None)
e di nuovo che non funziona. Alla fine il layer si aggiorna, ma non riesco davvero a vedere la logica, e talvolta succede di sorpresa dopo che non ho fatto nulla. O forse ho fatto qualcosa due minuti fa.
L'unico modo riproducibile per farlo aggiornare è duplicare il livello dal menu della legenda: il duplicato ottiene sempre i suoi dati dal file di forma corrente e anche il livello originale si aggiorna da solo! Quindi ci deve essere un modo per farlo.
Penso che funzionasse meglio in 2.8, ma questo è 2.10 quindi forse c'è un nuovo bug da qualche parte.
Correlato, ma non funziona per me in 2.10:
Come ricaricare automaticamente i livelli raster se l'origine viene modificata in QGIS?
Altre cose che ho provato:
layer.dataProvider().dataChanged.emit()
- ha funzionato una volta, quindi non di nuovo sullo stesso livello
Penso di aver rintracciato perché la duplicazione del livello funziona: se creo un nuovo livello usa e getta basato sul livello aggiornato e quindi chiamo .triggerRepaint()
il livello aggiornato, si aggiorna nell'area di disegno della mappa:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Se uso una sorgente di layer diversa, non funziona, quindi sembra che si crei un oggetto layer basato sulla stessa sorgente di layer ...
Un rapido test in questo momento con un livello raster (da un GeoTIFF) e solo la chiamata rlayer.triggerRepaint()
sembra aggiornare in modo affidabile la vista del raster nell'area di disegno della mappa.
layer.setCacheImage(None)
e layer.triggerRepaint()
?
triggerRepaint()
sul layer originale. v 2.10.1-Pisa