#1 Tue 09 September 2014 11:14
- Paul
- Participant assidu
- Lieu: Paris
- Date d'inscription: 31 Jul 2008
- Messages: 158
QGIS 2.X : Pyqgis et symbologie graduée
Bonjour à tous,
J'ai une question relative à Pyqgis et à la symbologie, la voici :
J'ai une couche de polygones (shp) et pour chaque entité j'ai une valeur que je souhaiterais représenter avec une couleur graduée (par exemple en intervalles égaux et 5 classes). Je souhaite le faire via un script Python en utilisant Pyqgis.
Je me suis inspiré du code trouvé ici "http://docs.qgis.org/testing/en/docs/py … tor-layers", que je remets là :
Code:
from qgis.core import (QgsVectorLayer, QgsMapLayerRegistry, QgsGraduatedSymbolRendererV2, QgsSymbolV2, QgsRendererRangeV2) myVectorLayer = QgsVectorLayer(myVectorPath, myName, 'ogr') myTargetField = 'target_field' myRangeList = [] myOpacity = 1 # Make our first symbol and range... myMin = 0.0 myMax = 50.0 myLabel = 'Group 1' myColour = QtGui.QColor('#ffee00') mySymbol1 = QgsSymbolV2.defaultSymbol( myVectorLayer.geometryType()) mySymbol1.setColor(myColour) mySymbol1.setAlpha(myOpacity) myRange1 = QgsRendererRangeV2( myMin, myMax, mySymbol1, myLabel) myRangeList.append(myRange1) #now make another symbol and range... myMin = 50.1 myMax = 100 myLabel = 'Group 2' myColour = QtGui.QColor('#00eeff') mySymbol2 = QgsSymbolV2.defaultSymbol( myVectorLayer.geometryType()) mySymbol2.setColor(myColour) mySymbol2.setAlpha(myOpacity) myRange2 = QgsRendererRangeV2( myMin, myMax, mySymbol2 myLabel) myRangeList.append(myRange2) myRenderer = QgsGraduatedSymbolRendererV2( '', myRangeList) myRenderer.setMode( QgsGraduatedSymbolRendererV2.EqualInterval) myRenderer.setClassAttribute(myTargetField) myVectorLayer.setRendererV2(myRenderer) QgsMapLayerRegistry.instance().addMapLayer(myVectorLayer)
Ça fonctionne, mais je suis dubitatif sur un point.
Si je comprends bien, dans le bloc "# Make our first symbol and range...", on définit la première tranche de valeurs à représenter. Ici, on lui dit que de 0 à 50 on met la couleur "#ffee00".
Dans le second bloc "#now make another symbol and range...", on définit une seconde tranche. De 50 à 100 on met la couleur "#00eeff".
Puis on applique le tout avec "myRenderer". Or je ne vois pas l'intérêt de ces lignes :
Code:
myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval) myRenderer.setClassAttribute(myTargetField)
En effet, on a l'air de lui demander de faire une classification en Intervalles Égaux sur le champ "myTargetField". à quoi ça sert puisqu'on lui a précédemment et manuellement défini des classes ??
Est-il possible de lui demander directement de faire une classification en 5 classes avec la méthode Intervalles Égaux sur tel champ et en utilisant telle palette ? Sans avoir à définir les classes manuellement au préalable ? En gros je me demande si il y a une fonction du genre :
Code:
myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval(myTargetField,5 classes, du bleu au rouge))
Si vous avez la réponse, je suis preneur !
Merci !!
P.S. : Je poste aussi ce message sur le forum SIG.
Paul
Hors ligne
#2 Tue 09 September 2014 12:43
- Leyan
- Participant assidu
- Date d'inscription: 14 Oct 2013
- Messages: 160
Re: QGIS 2.X : Pyqgis et symbologie graduée
Dans le code source de QGis, c'est fait par un appel à QgsGraduatedSymbolRendererV2::createRenderer (QgsVectorLayer *vlayer, QString attrName, int classes, Mode mode, QgsSymbolV2 *symbol, QgsVectorColorRampV2 *ramp, bool inverted=false) : http://www.qgis.org/api/classQgsGraduat … 9473ccd474
C'est accessible depuis l'API Python, tu dois pouvoir faire un code comme cela:
Code:
layer = qgis.utils.iface.activeLayer() symbol = QgsLineSymbolV2() colorRamp=QgsRandomColorsV2() renderer = QgsGraduatedSymbolRendererV2.createRenderer(layer,"champ",2,QgsGraduatedSymbolRendererV2.EqualInterval,symbol,colorRamp) layer.setRendererV2(renderer)
Dernière modification par Leyan (Tue 09 September 2014 12:46)
Hors ligne
#3 Tue 09 September 2014 18:17
- Paul
- Participant assidu
- Lieu: Paris
- Date d'inscription: 31 Jul 2008
- Messages: 158
Re: QGIS 2.X : Pyqgis et symbologie graduée
Merci de cette réponse. Cependant, ça ne fonctionne pas. J'ai une erreur avec "QgsRandomColorsV2()" qui est :
"NameError: global name 'QgsRandomColorsV2' is not defined"
J'ai essayé de le remplacer par "QgsVectorColorRampV2()", mais là il me dit :
"TypeError: qgis.core.QgsVectorColorRampV2 represents a C++ abstract class and cannot be instantiated"
J'avoue nager un peu. Je connais un peu Python mais j'ai du mal à me dépatouiller avec le site de l'API... Pourriez-vous me proposer un argument de "colorRamp" qui fonctionnerait ?
Merci !
Paul
Hors ligne
#4 Wed 10 September 2014 03:37
- Leyan
- Participant assidu
- Date d'inscription: 14 Oct 2013
- Messages: 160
Re: QGIS 2.X : Pyqgis et symbologie graduée
Quelle version de QGis utilises-tu? QgsRandomColorsV2 a été ajoutée dans la version 2.2 et n'existe pas dans la version 2.0.
QgsVectorColorRampV2 est une classe de base, qui donne les fonctions communes que toutes les classes décrivant une rampe de couleurs doivent implémenter. On ne peut pas l'utiliser directement.
Le site de l'API est génére automatiquement à partir du code source. C'est la source la plus complète et la plus à jour pour connaitre les fonctions accessibles, mais c'est vrai que c'est un peu difficile à lire ... Dans ton cas, il faut trouver la page de QgsVectorColorRampV2 pour la version de l'API qui t'intéresse (2.0, 2.2, 2.4, Master), puis regarder le inheritance diagram et voir quelles classes implémentent un type de rampe. Par exemple QgsVectorGradientColorRampV2, QgsVectorColorBrewerColorRampV2, QgsVectorRandomColorRampV2.
Hors ligne
#5 Wed 10 September 2014 12:03
- Paul
- Participant assidu
- Lieu: Paris
- Date d'inscription: 31 Jul 2008
- Messages: 158
Re: QGIS 2.X : Pyqgis et symbologie graduée
Bonjour Leyan,
En effet, j'utilisais QGis 2.0 et en essayant avec la 2.4, ça fonctionne super bien !! Un grand merci !
P.S. : Juste une remarque, je fais tourner mon script via le module ScriptRunner. Ce module ne fonctionne pas sur ma version 2.4 installée via osgeo mais fonctionne bien avec la version standalone.
Paul
Hors ligne
#6 Wed 10 September 2014 12:31
- SANTANNA
- Moderateur
- Lieu: Angers
- Date d'inscription: 18 Jan 2008
- Messages: 3947
Re: QGIS 2.X : Pyqgis et symbologie graduée
Bonjour
Paul, t'es sûr que ScriptRunner ne fonctionne pas? Chez moi, en général, pour mes scripts, il me renvoie une erreur au premier lancement puis la seconde tentative réussit. Just tested and approved.
Dernière modification par SANTANNA (Wed 10 September 2014 12:32)
Hors ligne
#7 Wed 10 September 2014 15:04
- Paul
- Participant assidu
- Lieu: Paris
- Date d'inscription: 31 Jul 2008
- Messages: 158
Re: QGIS 2.X : Pyqgis et symbologie graduée
Au moment de l'installation de ScriptRunner, j'ai le message d'erreur suivant :
"Cette extension est corrompue. Python dit :
No module named win32api"
Bizarre...
Paul
Hors ligne