Message posté par : nico-29
----------------------------------------
Bonjour,
Pour le développement d'un plugin, je dois ouvrir une couche vecteur et afficher une
symbologie par catégories à base de symboles svg.
J'ai 'stocké' mes fichiers svg dans un fichier resources.qrc que j'ai
compilé, j'ai donc un fichier .py que je déclare dans mes import.
Voici ma fonction pour ouvrir et afficher mon layer:
-----------------
Code :
from qgis.core import (
QgsProject, QgsVectorLayer, QgsSymbol, QgsSimpleFillSymbolLayer,
QgsRendererCategory, QgsCategorizedSymbolRenderer, QgsSvgMarkerSymbolLayer,
QgsLineSymbol
)
from PyQt5.QtWidgets import QFileDialog
from .resources_rc2 import * # mon fichier compilé qui contient les symboles svg
..
def open(self):
filter = "geojson (*.geojson)"
fileName, _ = QFileDialog.getOpenFileName(None, "geojson", "",
filter)
if fileName:
print(fileName)
vlayer = QgsVectorLayer(fileName, "myLayer", "ogr")
print(vlayer.geometryType())
if not vlayer.isValid():
print("Layer failed to load!")
else:
QgsProject.instance().addMapLayer(vlayer)
fni = vlayer.fields().indexFromName('code')
unique_values = vlayer.uniqueValues(fni)
categories = []
for unique_value in unique_values:
# initialize the default symbol for this geometry type
symbol = QgsSymbol.defaultSymbol(vlayer.geometryType())
# configure a symbol layer
if unique_value == 'Cable':
svgStyle = {}
svgStyle['name'] =
':/resources/symbols/line/CBLSUB06.svg'
svgStyle['size'] = '12'
symbol_layer = QgsSvgMarkerSymbolLayer.create(svgStyle)
else:
layer_style = {}
layer_style['color'] = '%d, %d, %d' %
(randrange(0, 256), randrange(0, 256), randrange(0, 256))
symbol_layer = QgsSimpleFillSymbolLayer.create(layer_style)
# replace default symbol layer with the configured one
if symbol_layer is not None:
symbol.changeSymbolLayer(0, symbol_layer)
# create renderer object
category = QgsRendererCategory(unique_value, symbol,
str(unique_value))
# entry for the list of category items
categories.append(category)
# create renderer object
renderer = QgsCategorizedSymbolRenderer('code', categories)
# assign the created renderer to the layer
if renderer is not None:
vlayer.setRenderer(renderer)
vlayer.triggerRepaint()
-----------------
Je n'ai pas d'erreur au chargement, mais mon style avec le symbole svg n'est
pas pris en compte (pourtant il passe bien dans la boucle if), et les objet de type
'Cable' sont affichés avec une ligne de couleur aléatoire.
Comment appliquer le style svg?
Merci,
Nico
----------------------------------------
Le message est situé
https://georezo.net/forum/viewtopic.php?pid=341330#p341330
Pour y répondre : qgis_fr(a)ml.georezo.net ou reply de votre messagerie
Pour vous désabonner connectez-vous sur le forum puis Profil / Abonnement
--
Association GeoRezo - le portail géomatique
https://georezo.net