Comment classer la symbologie avec des valeurs modifiées dans un champ après avoir utilisé loadNamedStyle dans PYQGIS?

Dec 16 2020

Tout d'abord, j'ai exporté un style de calque d'une couche sous forme de fichier QML comprenant des effets de dessin (symbologie -> rendu de couche -> effets de dessin) en symbologie. Notez que j'ai vérifié toutes les catégories lors de son enregistrement (voir l'image ci-dessous).

Ensuite, j'ai changé les valeurs du champ avec lequel j'ai configuré une symbologie graduée. Ensuite, j'ai essayé de charger le fichier QML avec loadNamedStyle(). Cela n'a pas changé la légende et les classes automatiquement. Par conséquent, j'ai essayé plusieurs choses pour mettre à jour automatiquement cela.

field = 'SPREAD'
stylepath = '/path_to_my_layer_style.qml'
layer = iface.activeLayer()
layer.loadNamedStyle(stylePath)
renderer = layer.renderer()
sym = renderer.sourceSymbol()
grad = renderer.sourceColorRamp()
renderVal = renderer.createRenderer(layer,field,5,0,sym,grad)
layer.setRenderer(renderer)

Ça a marché. Cependant, les effets de ce fichier QML ont disparu par la suite. Je ne pense pas non plus que ce soit la meilleure façon de procéder. Existe-t-il un moyen plus pratique de classer la symbologie avec de nouvelles valeurs après le chargement du fichier QML dans PYQGIS?

Réponses

1 meteergen Dec 16 2020 at 18:37

Ok, j'ai trouvé une solution. Voici comment j'ai fait,

layer.loadNamedStyle(stylePath)
renderer = layer.renderer()

renderer.updateClasses(layer,0,5) # Update the QgsGraduatedSymbologyRenderer.mode and set the classes up to 5
renderer.updateRangeLabels() # Update label range
renderer.updateColorRamp() # Update the color ramp
iface.layerTreeView().refreshLayerSymbology(layer.id()) # Refresh legend on the interface
layer.reload() 

De cette manière, la symbologie est déclenchée pour classer à nouveau pour les paramètres déterminés et les effets de symbole ne disparaissent pas non plus.