Nous utilisons des cookies pour vous garantir la meilleure expérience sur notre site. Si vous continuez à utiliser ce dernier, nous considèrerons que vous acceptez l'utilisation des cookies. J'ai compris ! ou En savoir plus !.
banniere

Le portail francophone de la géomatique


Toujours pas inscrit ? Mot de passe oublié ?
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

Rencontres QGIS 2025

L'appel à participation est ouvert jusqu'au 19 janvier 2025!

#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

 

Pied de page des forums

Powered by FluxBB