Suite

Faire la mise à jour de la couche QGIS à partir de la source de données modifiée


J'essaie de faire en sorte que les couches se mettent à jour automatiquement lorsque leur source de données change. J'utilise R pour écrire un fichier de formes avec un attribut et colorier en fonction de cet attribut dans QGIS.

Je souhaite écrire un nouveau fichier de formes avec différentes valeurs d'attribut et mettre à jour les couleurs de la carte Qgis. L'étape 1 déclenche ce processus, l'étape 2 consiste à recharger le calque à partir du fichier de formes modifié. C'est l'étape 2 qui m'inquiète ici.

Autres questions/listes de discussion mentionnées par le chat en utilisanttriggerRepaintsur le calque - cela ne fonctionne pas. D'autres suggestions incluentsetCacheImage(Aucun)et encore ça ne marche pas. La couche finit par se mettre à jour, mais je ne vois vraiment pas la logique, et parfois cela arrive par surprise après que je n'ai rien fait. Ou peut-être que j'ai fait quelque chose il y a deux minutes.

Le seul moyen reproductible de le mettre à jour est de dupliquer le calque à partir du menu Légende - le duplicata obtient toujours ses données à partir du fichier de formes actuel, et le calque d'origine se met également à jour ! Il doit donc y avoir un moyen de le faire.

Je pense que cela fonctionnait mieux en 2.8, mais c'est en 2.10 donc peut-être qu'il y a un nouveau bug quelque part.

Connexe, mais ne fonctionne pas pour moi dans la version 2.10 :

Comment recharger automatiquement les couches raster si la source est modifiée dans QGIS ?

D'autres choses que j'ai essayées :

  • layer.dataProvider().dataChanged.emit()- travaillé une fois, puis pas à nouveau sur le même calque

Je pense avoir compris pourquoi la duplication du calque fonctionne - si je crée un nouveau calque jetable basé sur le calque mis à jour, puis appelle.triggerRepaint()sur la couche mise à jour, il se met à jour sur le canevas de la carte :

QgsVectorLayer( layer.source(), "copie de calque", layer.providerType() ) layer.triggerRepaint()

Si j'utilise une source de calque différente, cela ne fonctionne pas, il semble donc que ce soit le cas si vous créez un objet de calque basé sur la même source de calque…

Un test rapide tout à l'heure avec une couche raster (à partir d'un GeoTIFF), et juste en appelantrlayer.triggerRepaint()semble mettre à jour de manière fiable la vue du raster dans le canevas de la carte.


Ceci est lié à l'introduction du pool de connexions OGR. [1]

Avant QGIS 2.10, un fichier était rouvert à chaque accès (par exemple, repeindre).

Depuis QGIS 2.10, le descripteur de fichier reste ouvert et cela signifie que si un fichier est remplacé, le descripteur pointe toujours vers l'ancien fichier sur les systèmes basés sur Unix.

QGIS 2.10 : solution de contournement

Malheureusement, il n'y a pas d'API pour forcer QGIS à rouvrir le fichier dans QGIS 2.10. Comme solution de contournement, vous pouvez utiliser un hack moche :

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

QGIS 2.12 : solution

Je viens d'introduire une nouvelle méthode qui sera disponible à partir de QGIS 2.12 :

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

Approche générale

Si vous avez la possibilité de contrôler comment le fichier est écrasé, vous pouvez ouvrir les fichiers existants avec des autorisations d'écriture et modifier le contenu au lieu de remplacer complètement les fichiers (supprimer/recréer) sur le disque.

[1] Le pool de connexions a été introduit pour accélérer considérablement l'accès à certaines sources de données.


Si vous effectuez un panoramique ou actualisez la carte, elle devrait être mise à jour.

Cet article indique que vous pouvez utiliser les éléments suivants dans PyQGIS :

myLayer.triggerRepaint()

Pour rafraîchir toutes les couches, la fonction suivante peut être utilisée :

def refresh_layers(self) : pour la couche dans qgis.utils.iface.mapCanvas().layers() : layer.triggerRepaint()


Voir la vidéo: GeoMYTNMAC QGIS 61 Créer une couche shapfile SHP à partir dun fichier texte délimité CSV (Octobre 2021).