J'essaie d'obtenir des couches à mettre à jour automatiquement lorsque leur source de données change. J'utilise R pour écrire un fichier de formes avec un attribut et la coloration en fonction de cet attribut dans QGIS.
Je veux écrire un nouveau fichier de formes avec différentes valeurs d'attribut et avoir la mise à jour des couleurs de la carte Qgis. L'étape 1 déclenche ce processus, l'étape 2 effectue le rechargement de la couche à partir du fichier de formes modifié. Son étape 2, je m'inquiète ici.
D'autres questions / bavardages de listes de diffusion mentionnent l'utilisation triggerRepaint
de la couche - cela ne fonctionne pas. D'autres suggestions incluent setCacheImage(None)
et encore une fois cela ne fonctionne pas. La couche se met finalement à jour, mais je ne vois vraiment pas la logique, et cela arrive parfois par surprise après que je n'ai rien fait. Ou peut-être que j'ai fait quelque chose il y a deux minutes.
La seule façon reproductible de le mettre à jour est de dupliquer le calque à partir du menu légende - le doublon obtient toujours ses données du fichier de formes actuel, et le calque d'origine se met à jour lui-même aussi! Il doit donc y avoir un moyen de le faire.
Je pense que cela fonctionnait mieux en 2.8, mais c'est 2.10 donc peut-être qu'il y a un nouveau bug quelque part.
Associé, mais ne fonctionne pas pour moi en 2.10:
Comment recharger automatiquement les couches raster si la source est modifiée dans QGIS?
J'ai essayé d'autres choses:
layer.dataProvider().dataChanged.emit()
- travaillé une fois, puis pas à nouveau sur la même couche
Je pense que j'ai trouvé pourquoi la duplication de la couche fonctionne - si je crée une nouvelle couche jetable basée sur la couche mise à jour et que j'appelle ensuite .triggerRepaint()
la couche mise à jour, elle se met à jour sur le canevas de la carte:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Si j'utilise une source de calque différente, cela ne fonctionne pas, il semble donc que si vous créez un objet de calque basé sur la même source de calque ...
Un test rapide en ce moment avec une couche raster (à partir d'un GeoTIFF), et un simple appel rlayer.triggerRepaint()
semble mettre à jour de manière fiable la vue du raster dans le canevas de carte.
layer.setCacheImage(None)
et layer.triggerRepaint()
?
triggerRepaint()
sur le calque d'origine. v 2.10.1-Pisa