QGIS Charger plusieurs styles sur une seule couche à la fois


10

J'ai un ensemble de fichiers de style qml enregistrés que j'applique à des couches similaires dans plusieurs projets. Un exemple serait un calque de fichier de formes de type ligne avec environ une douzaine de styles différents; actuellement, je dois répéter le processus d'ajout d'un nouveau style et de chargement du fichier qml pour chacun des différents styles. Ensuite, je dois le faire plusieurs fois de plus dans ce projet et répéter le tout dans le projet suivant.

Vous essayez simplement de voir s'il existe un moyen de charger plusieurs fichiers de style sur le même calque à la fois? Quelque chose comme au lieu de naviguer dans un seul qml, je pourrais sélectionner plusieurs fichiers qml et les charger en même temps?

Exemple de plusieurs styles par couche


1
Que voulez-vous dire en chargeant plusieurs styles à la fois sur le même calque? Le dernier style chargé ne remplacerait-il pas tous les styles chargés précédents? Ou souhaitez-vous charger de nombreux styles sur plusieurs copies du même calque?
artwork21

Mon flux de travail actuel consiste à ouvrir les propriétés du calque; utilisez le bouton de style (en bas à gauche) pour ajouter un nouveau style, attribuez un nom, puis chargez un fichier .qml enregistré, puis répétez pour autant de styles (10-20) que la couche utilise. Actuellement, je dois le faire un par un, pour environ 7 à 8 couches, dans> 25 projets. (données répétitives, couches et cartes, mais fichiers de projet séparés géographiquement par les municipalités - chaque municipalité est un client distinct)
CEL-ma

Il y a une question similaire ici qui veut utiliser python mais pas encore de réponse, gis.stackexchange.com/questions/294016/…
artwork21

Réponses:


3

Vous pouvez charger plusieurs styles à l'aide du script pyqgis (explications dans les commentaires):

import os
from qgis.core import QgsMapLayerStyle
from qgis.utils import iface

# set path to your styles here
qml_path = '/home/user/qml'

layer = iface.activeLayer()
style_manager = layer.styleManager()

# read valid style from layer
style = QgsMapLayerStyle()
style.readFromLayer(layer)

for qml_file in [f for f in os.listdir(qml_path)
                 if os.path.isfile(os.path.join(qml_path, f)) and
                 f.endswith('.qml')]:
    # get style name from file
    style_name = os.path.basename(qml_file).strip('.qml')
    # add style with new name
    style_manager.addStyle(style_name, style)
    # set new style as current
    style_manager.setCurrentStyle(style_name)
    # load qml to current style
    (message, success) = layer.loadNamedStyle(os.path.join(qml_path, qml_file))
    print message
    if not success:  # if style not loaded remove it
        style_manager.removeStyle(style_name)

Vous pouvez l'exécuter dans la console python QGIS ou vous adapter à un script de traitement.

(Testé sur la version actuelle de LTR QGIS 2.18)


1
Merci beaucoup! J'ai réussi à charger plusieurs styles - j'ai reçu un message d'erreur «[Errno 9] Bad file descriptor» pendant qu'il exécutait l'algorithme, mais il s'est quand même terminé avec succès! Cela me fera économiser beaucoup de travail!
CEL-ma

À toute autre personne lisant ce message à l'avenir; le message d'erreur "Bad file" mentionné ci-dessus était dû au chemin qml ayant à la fois des couches vectorielles de ligne et de nœud. Une fois séparés, plus d'erreur.
CEL-ma

Quelqu'un peut-il aider à convertir ce code en python 3 pour qu'il fonctionne dans QGIS 3?
CEL-ma

0

Si je vous comprends bien, vous voulez simplement pouvoir appliquer des styles de géométrie et pas nécessairement des règles ou des expressions aux calques rapidement et facilement dans n'importe quel projet que vous avez ouvert?

Si tel est le cas, vous pouvez simplement enregistrer vos styles dans la bibliothèque de symboles à l'aide du gestionnaire de styles? Ouvrez le panneau de style de calque et cliquez sur le bouton "Ouvrir la bibliothèque".


désolé, oui - les styles que je voudrais charger par lots sont basés sur des règles.
CEL-ma
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.