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

Printemps des cartes 2024

#1 Mon 21 March 2022 11:37

zutix
Participant actif
Date d'inscription: 19 Mar 2020
Messages: 87

QGIS 2.18: automatiser mise a jour style categorise

Bonjour,

L’une de mes cartes est mise à jour assez fréquemment. L’objectif serait d’automatiser au maximum sa mise à jour.

Les données de mise à jour proviennent d’un fichier de type texte .csv. La couche destinataire est nommée CSV.

La couche qui va utiliser ces données s’appelle NB.
Elle fait l’objet d’une jointure avec la couche CSV.  Ainsi elle récupère un champ _nb qui est utilisé comme colonne de catégorisation (style catégorisé de la couche NB).

Le champ _nb contient un nombre >=0 pour chaque entité.
Ce nombre peut varier d’une mise à jour à l’autre : en plus, en moins ou demeurer constant. 
Par exemple, pour l’entité 1,
mise à jour 0 : _nb=1
mise à jour 1 : _nb=5
mise à jour 3 : _nb=4
mise à jour 4 : _nb=4

En conséquence, la quantité de catégories peut varier d’une mise à jour à l’autre.
Par exemple,
mise à jour 0 : catégories (colonne valeur) = 0  1  5  25
mise à jour 1 : catégories (colonne valeur) = 0  1  2  3  5  23
mise à jour 3 : catégories (colonne valeur) = 0  1  2  4  7  10  21  27
mise à jour 4 : catégories (colonne valeur) = 0  1  2  4  8  9  26

Une fois la jointure effectuée,  le style reste sur les catégories de la mise à jour précédente.
A la main il faut aller dans le style de la couche NB. Puis sur le formulaire du style catégorisé, il faut cliquer successivement sur les boutons : Effacer tout puis Classer et enfin effacer la ligne de catégorie qui n’a pas de valeur.
A moins qu'il y ait un moyen pour que ce soit automatique ?

Sinon comment fait-on l’équivalent en python 2 ? Ou est-ce impossible ?

PyQGIS developer cookbook n’est pas suffisant face à mon ignorance.

                                    renderer=nb.rendererV2()

Formulaire propriétés > style                              Python

Style : Catégorisé                                              print renderer.type     affiche bien cetgorizedSymbol 
                                                                        renderer.setType( quelque chose )    ne semble pas fonctionner.
                                                                        Comment fait-on pour changer le style ?

Colonne : _nb                                                    renderer.setClassAttribute("_nb")   
                                                                        remplace bien la colonne par celle que l’on met, ici le champ _nb

Symbole : celui par défaut                                  Quelle instruction écrire ?
 
Palettes de couleurs : Oranges                            renderer.setSourceColorRamp( ? )   ne reconnaît pas Oranges
                                                                        Quelle est la bonne instruction ?

Le reste du formulaire de style : par défaut.         Quelles sont les instructions python 2  ?

bouton OK                                                          nb.setRendererV2(renderer)   agit
                                                                         mais avec le seul champ colonne initialisé cela efface le style Catégorisé.

Merci d’avance de votre aide et bonne journée.

Cordialement

Hors ligne

 

#2 Wed 23 March 2022 09:10

romainbh
Participant assidu
Date d'inscription: 20 Aug 2013
Messages: 355

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,
Vu que vous travaillez avec des valeurs chiffrées, vous pourriez utiliser le style Gradué plutôt que Catégorisé, en renseignant les valeurs max et min pour qu'elles couvrent votre cas d'utilisation. Ainsi plus besoin d'actualiser à chaque mise à jour.
Sinon l'option PYQGIS doit aussi être possible, mais là je ne peux pas vous aider.

Hors ligne

 

#3 Thu 24 March 2022 15:43

zutix
Participant actif
Date d'inscription: 19 Mar 2020
Messages: 87

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,

Merci de votre réponse.

Mais j‘avais testé le mode gradué.  Il ne convient pas car il regroupe des valeurs. L’affichage souhaité est obtenu avec catégorisé mais pas avec gradué.
Par exemple avec le même champ _nb :
obtenu avec catégorisé    obtenu avec gradué
0                    0.000 – 5.000
1                    5.000 – 10.000
2                    10.000 – 15.000
3                    15.000 – 20.000
4                    20.000 – 25.000
5
8
25

Hors ligne

 

#4 Fri 25 March 2022 09:20

lylambda
Participant actif
Date d'inscription: 31 Aug 2016
Messages: 127

Re: QGIS 2.18: automatiser mise a jour style categorise

Et en modifiant manuellement la graduation ? Via un passage en "Ensemble de règles" ?
Pour l'exemple cité :
0                    0.000 – 0.999
1                    1.000 – 1.999
2                    2.000 – 2.999
etc.

Dernière modification par lylambda (Fri 25 March 2022 09:20)

Hors ligne

 

#5 Fri 25 March 2022 10:15

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,
Si vous voulez choper toutes les valeurs sans trop vous casser la tête (et au risque d'horripiler les "Bertinois"), créez une entrée dans la classification pour chacune des valeurs possibles. Dans votre dernier message (0-25), ça voudra dire 26 lignes de classification dont un certain nombre à la mano. A vous de trouver votre valeur max possible pour nb. Ensuite, si les valeurs changent, bah, l'entité ne ferait que switcher de classe donc tutto bene.

Je sais que j'avais déjà posée la question et ne suis pas sûr de la réponse, si j'en avais reçue, mais: QGIS 2.18, quoi! Python 2, abandonné depuis 2 ans. La dette technique que vous êtes en train de trimballer, plus toutes les nouveautés et facilités possibles dans QGIS à côté desquelles vous passez certainement m'inquiètent, mais bon...

Hors ligne

 

#6 Mon 28 March 2022 10:55

zutix
Participant actif
Date d'inscription: 19 Mar 2020
Messages: 87

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,

Merci de vos réponses.

La difficulté réside dans le fait que je ne connais pas la valeur maximale. L’évolution est imprévisible pour tous les cas.

Donc cela réclame une souplesse importante :
- non compatible avec l’ « Ensemble de règles » qui doivent être connues d’avance ;
- ni avec toutes les valeurs de 0 à valeur max inconnue. De plus, si l’on prenait 50 par exemple cela poserait des problèmes de couleurs trop proches car utilisées alors qu’inutiles et une légende trop longue.

En ce qui concerne la version 2.18. Elle ne dépend pas de moi. Une version 3 est en cours de test , elle va finir par arriver.

Merci en tous cas.

Hors ligne

 

#7 Mon 28 March 2022 14:46

SANTANNA
Moderateur
Lieu: Angers
Date d'inscription: 18 Jan 2008
Messages: 3807

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,
Effectivement j'avais occulté le cas de couleurs inutilement trop proches. Pour la légende, elle peut se limiter à ce qui est effectivement visible dans la mise en page (mais c'est peut-être une fonction v3).
A moins qu'il y ait déjà un plugin de reclassification automatique ou en un clic (vous avez regardé l'offre en la matière?), je pense en effet que la solution passe par écrire vous-même le script. Et une fois que j'ai dit cela, désolé, je passe la main à plus compétent...

Hors ligne

 

#8 Mon 26 December 2022 16:04

zutix
Participant actif
Date d'inscription: 19 Mar 2020
Messages: 87

Re: QGIS 2.18: automatiser mise a jour style categorise

Bonjour,
Il semble que ce qui suit réponde au besoin exprimé.
En espérant que cela aide certains à ne pas galérer comme je l’ai fait.
Bonnes fêtes de changement d'année !
Cordialement

###  definition de fonctions

# trouver et trier les valeurs distinctes du champ nomme zFieldName de la couche objet zlayer
# appel, exemple : trouverValDistChp(layer,"_NB")
# retour, exemple : [0, 1, 2, 3, 4, 5, 8, 25]
def trouverValDistChp(zlayer,zFieldName):
    vals=[]
    for feature in zlayer.getFeatures():
        val=feature[zFieldName]
        if not val in vals:
            vals.append(val)
    vals.sort()
    return(vals)

# definir les categories qui s'afficheront : case cochee, carre, valeur, legende
# appel, exemple : categories=definirCategies(catNb,catVals,ramp)
# retour, exemple : [<qgis._core.QgsRendererCategoryV2 object at 0x0000000024FFEC80>, <qgis._core.QgsRendererCategoryV2 object at 0x0000000024FFEEA0>,
#     <qgis._core.QgsRendererCategoryV2 object at 0x0000000024FFE048>, <qgis._core.QgsRendererCategoryV2 object at 0x0000000024FFED90>,
#     <qgis._core.QgsRendererCategoryV2 object at 0x000000002514D840>, <qgis._core.QgsRendererCategoryV2 object at 0x000000002514D950>,
#    <qgis._core.QgsRendererCategoryV2 object at 0x000000002514DA60>, <qgis._core.QgsRendererCategoryV2 object at 0x000000002514DB70>]
def definirCategies(catNb,catVals,catRamp):
    categories=[]
    for i in range(catNb):
        n=i*100/catNb
        if n<100:
            if n<10:
                step=float('0.0' +str(n))
            else:
                step=float('0.' +str(n))
        #   state=True
        # valeur 100% non utilisee
        #else:
        #   step=1
        #   state=False
        state=True    # case cochee (False sinon)
        value=catVals[i]    # valeur
        # symbole generique qui reste constant et correspond a Modification
        symbol=QgsFillSymbolV2.defaultSymbol(layer.geometryType())      # symbole plein
        symbol.symbolLayer(0).setOutlineColor(QColor(169,169,169,100))  # symbole bord gris
        # symbole de categorie qui correspond a 1 ligne category
        symbol.setColor(ramp.color(step))                               # couleur a la position du pas dans la palette
        category=QgsRendererCategoryV2(value,symbol,str(value),state)   # elements de la categorisation
        categories.append(category)
    return(categories)

# trouver l'objet palette de nom fourni
# appel, exemple : trouverPalette("Oranges")
# retour, exemple : <qgis._core.QgsVectorGradientColorRampV2 object at 0x0000000024935F28>
def trouverPalette(zRampName):
    style=QgsStyleV2().defaultStyle()
    allColorRampNames=style.colorRampNames()
    i=-1
    for rampName in allColorRampNames:
        i=i+1
        if rampName=="Oranges":
            break
    ramp=style.colorRamp(allColorRampNames[i])
    return(ramp)

###

# creer le style : categorise, colonne=_NB, palette=Oranges a l’aides fonctions ci-avant

# trouver la palette
ramp=trouverPalette("Oranges")

# trouver la liste des valeurs entieres distinctes du champ
catVals=trouverValDistChp(layer,"_NB")  # liste de valeurs
catNb=len(catVals)                          # nombre de valeurs

# definir les categories, i.e. les lignes : state(True->coche), symbol(carre colore), value(_NB), label(_NB en texte) de categorisation qui seront affichees
categories=definirCategies(catNb,catVals,ramp)

# creer style categorise avec colonne=_NB, lignes de categorie=categories et palette=ramp
renderer=QgsCategorizedSymbolRendererV2('_NB',categories)
renderer.setSourceColorRamp(ramp)

# appliquer ce style a la couche
layer.setRendererV2(renderer)

# modifier effectivement la couche
QgsMapLayerRegistry.instance().addMapLayer(layer)

Hors ligne

 

Pied de page des forums

Powered by FluxBB