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

Printemps des cartes 2024

#1 Fri 13 January 2017 10:12

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

QGIS 2.14: Attribuer un rownumber par occurrence

Bonjour,

Je cherche à attribuer un rownumber par type d'occurrence via la calculatrice de champ mais qu'il recommence à 0 à chaque fois et de manière automatique sans avoir à les sélectionner manuellement au préalable.

Par exemple :

TYPE        ID

MAISON   MAISON_0001
MAISON   MAISON_0002
MAISON   MAISON_0003

APPARTEMENT  APPARTEMENT_0001
APPARTEMENT  APPARTEMENT_0002
APPARTEMENT  APPARTEMENT_0003

J'ai déjà généré ça :  "TYPE"+'_'+lpad(to_string(@row_number),4,0)

Mais que rajouter pour faire un genre de "group by"?

Merci!

Sophie

Hors ligne

 

#2 Fri 13 January 2017 10:21

PA
Membre
Lieu: Paris
Date d'inscription: 5 Sep 2005
Messages: 3259
Site web

Re: QGIS 2.14: Attribuer un rownumber par occurrence

Avec un CASE WHEN type= maison THEN votre formule et vous répétez ça pour le type Appartement.
Si vous avez peu de TYPE différents, c'est faisable rapidement.


Pierre-André Le Ny
Modérateur QGIS, Données, Coin de l'OpenSource
Aidez l'association GeoRezo !

Hors ligne

 

#3 Fri 13 January 2017 10:26

Sophie_Géo
Participant actif
Lieu: Nantes
Date d'inscription: 16 Jul 2012
Messages: 59

Re: QGIS 2.14: Attribuer un rownumber par occurrence

Oui mais j'en ai beaucoup justement^^
Je voulais m'éviter ça

Hors ligne

 

#4 Tue 17 January 2017 08:35

Anthony Philibert
Juste Inscrit !
Date d'inscription: 25 Oct 2016
Messages: 5

Re: QGIS 2.14: Attribuer un rownumber par occurrence

Bonjour, j'ai développé un petit script python qui devrait répondre à votre besoin.

Allez voir à la fin de ce sujet. N'oubliez pas de travailler sur une copie de votre couche.

http://georezo.net/forum/viewtopic.php?id=104073

Voici le code adapter à votre cas.

Il vous faudra remplacer les éléments chemin_absolu_de_votre_couche , nom_du_champ et champ_a_mettre_a_jour par ceux de votre de couche.

Code:

# -*- coding: utf8 -*-
#======================================================================
# Déclaration du chemin d'accès d'une couche
#======================================================================
chemin = "chemin_absolu_de_votre_couche"
#======================================================================
# Ouverture de la couche et ajout au registre.
#======================================================================
couche = QgsVectorLayer(chemin ,"chemin","ogr")
QgsMapLayerRegistry.instance().addMapLayer(couche)

#======================================================================
# Récupération de la liste des entités unique d'un champ
#======================================================================
ch_entite_unique = couche.fieldNameIndex("nom_du_champ")
liste_entite_unique = couche.uniqueValues(ch_entite_unique)

#======================================================================
# Mise en mode édition de la couche
#======================================================================
couche.startEditing()

#======================================================================
# Ecriture du nouvel identifiant selon les valeurs du champ choisi précédemment
#======================================================================
for a in liste_entite_unique:
    req = QgsFeatureRequest().setFilterExpression(' "PACAGE" =\'' + str(a)+ '\' ')
    for i, feature in enumerate(couche.getFeatures(req)):
        if i < 9:
            feature['ID'] ="000" + str(i + 1)
        elif i < 99 :
            feature['ID'] ="00" + str(i + 1)
        elif i < 999 :
            feature['ID'] ="0" + str(i + 1)
        else:
            feature['ID'] = str(i + 1)
        couche.updateFeature(feature)

#======================================================================
# Enregistrement des changements de la couche
#======================================================================
couche.commitChanges()

#======================================================================
# Fermeture de la couche de travail
#======================================================================
QgsMapLayerRegistry.instance().removeMapLayer(couche)

Dernière modification par Anthony Philibert (Tue 17 January 2017 08:40)

Hors ligne

 

Pied de page des forums

Powered by FluxBB