Est-il possible d'avoir des noms de couches dynamiques dans le projet QGIS?

9

J'ai un projet QGIS avec des couches, basé sur des requêtes SQL PostGIS qui utilisent la date actuelle. Étant donné que les données de la base de données changent, ces requêtes renvoient des données différentes chaque jour.

Est-il possible de changer dynamiquement le nom du calque dans le panneau d'arborescence des calques, afin qu'il représente la date actuelle? (c'est-à-dire le nom de la couche comme Traffic on 24.01.2015, qui change chaque jour). Les données de la légende doivent être extraites de l'attribut de n'importe quelle entité d'une couche - elles ont toutes la même valeur pour le champ traffic_date.

mofoyoda
la source
Qu'extrayeriez-vous exactement de votre table de base de données, "Trafic" ou la date actuelle?
Germán Carrillo
J'extraye les données de la date actuelle sur une couche et les données de prévision sur d'autres couches. Donc "24.01.2015" est en fait une valeur de champ, qui provient de la base de données. J'ai besoin que le nom du calque dans le projet change automatiquement en fonction de la date.
mofoyoda
Serait-il correct de changer le nom à chaque chargement du projet?
Nathan W

Réponses:

13

Si je vous comprends bien, la réponse est oui, QGIS prend en charge les noms de couches dynamiques.

Vous devrez écrire une macro Python à exécuter à chaque ouverture du projet. Ce serait le flux de travail:

  1. Accédez à QGIS->Project->Project Propertieset remplacez openProject()par le code Python suivant:

    def openProject():
        import re, qgis     
        iface = qgis.utils.iface
        layers = iface.mapCanvas().layers()
        for lyr in layers:
            # Get date from layer
            it=lyr.getFeatures()
            feat = next(it)
            idx = lyr.fieldNameIndex('traffic_da')
            currDate = feat.attributes()[idx]
    
            # Set new layer name
            name = lyr.name()
            if re.search(' on \d{2,2}.\d{2,2}.\d{4,4}$', name):
                 name = name[:-14]
            name = name + " on " + currDate
            lyr.setLayerName( name )

    entrez la description de l'image ici

    Remarque 1: Je l'ai testé sur des fichiers de formes, donc le champ dont je tire la date est traffic_daparce que les fichiers de formes ne prennent pas en charge plus de lettres dans les noms de champs. Ajustez cela dans le code pour travailler sur vos calques.

    Remarque 2: Selon la configuration de votre projet, vous devez ajouter un code de validation pour agir uniquement sur les couches que vous souhaitez. Par exemple, si vous exécutez le code sur des couches raster, des erreurs apparaîtront à coup sûr. Si vous avez besoin d'aide, ouvrez une nouvelle question, je peux vous aider.

  2. Assurez-vous d'activer les macros sur votre projet, de cette façon: Settings->Options->General->Enable macros: Always

  3. Chargez vos calques dans le projet.

  4. Enregistrez votre projet.

Chaque fois que vous ouvrez votre projet à partir de ce point, les noms de vos calques seront dynamiques, la date sera prise dans le champ traffic_datede la table attributaire de chaque calque.

Après la première ouverture du projet, voici comment mes noms de calque ont été générés dynamiquement:

entrez la description de l'image ici

Je pense que cela peut vous aider à démarrer. Dites-moi si vous rencontrez des problèmes non évidents.

Germán Carrillo
la source
Je l'ai compris en lisant votre commentaire, posté 1s avant de soumettre la réponse. Certains ajustements devraient être apportés au code pour s'adapter à la disposition spécifique des couches, mais j'espère que @mofoyoda pourra y faire face.
Germán Carrillo
1
Oui, c'est un bon premier coup. Vous pouvez également simplement trouver l'index onet la bande de là jusqu'à la fin pour économiser sur l'utilisation de l'expression régulière.
Nathan W
1
@gcarrillo intense! Mais super!
DPSSpatial
1
@gcarrillo Très cool, merci! J'essaie toujours de comprendre comment appliquer uniquement à certaines couches, j'espère que je le ferai. Merci pour une excellente réponse!
mofoyoda