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

Suite à un problème technique intervenu entre le 22 et le 23 mars, nous avons du procéder dans la soirée du 25 mars, à la restauration de la base de données du 24 mars (matinée).

En clair, nous avons perdu vos contributions et inscriptions du dimanche 24 et du lundi 25 mars.
Nous vous prions de nous excuser.

#1 Mon 28 November 2016 16:41

htarhoun
Juste Inscrit !
Date d'inscription: 14 Apr 2014
Messages: 7

QGIS 2.14.8: Identifiant @Rownumber selon une valeur

Bonjour,

J'ai une couche de 10000 points. Je souhaite classer ces points dans un ordre croissant selon une valeur d'un autre champs. L'outil @Rownumber ou @id attribue des identifiants selon l'ordre chronologique de la création de chaque entité, alors que mon but est d'attribuer cet identifiant dans un ordre croissant selon une Valeur X déja donnée dans la même table.

Connaisse-vous un algorithme permettant de faire le classement des entités selon une valeur ?

Merci

Dernière modification par htarhoun (Mon 28 November 2016 16:42)

Hors ligne

 

#2 Mon 09 January 2017 08:43

MathieuR
Membre
Lieu: aix-en-provence
Date d'inscription: 16 Feb 2009
Messages: 1690
Site web

Re: QGIS 2.14.8: Identifiant @Rownumber selon une valeur

Bonjour,

En python, dans QGIS, c'est sûrement faisable.
Autrement, vous pouvez utiliser le plugin mmqgis et la fonction sort pour trier votre table selon votre champ, à la suite de quoi vous pouvez rajouter cet identifiant


geodata au cerema et petits billets en géomatique

Hors ligne

 

#3 Mon 09 January 2017 09:11

gustavecoste
Participant actif
Lieu: Montpellier
Date d'inscription: 24 Apr 2013
Messages: 118

Re: QGIS 2.14.8: Identifiant @Rownumber selon une valeur

Sinon, l'utilisation d'une couche virtuelle permettrait d'ordonner la couche selon les critères de votre choix avec une requête du type:

Code:

SELECT *
FROM ma_couche
ORDER BY mon_champ;

Gustave Coste

Hors ligne

 

#4 Mon 09 January 2017 09:58

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 Sep 2005
Messages: 3163
Site web

Re: QGIS 2.14.8: Identifiant @Rownumber selon une valeur

Bonjour,

Sous postgresql l'utilisation des fonctions de fenêtrage et de rownumber() over() ou rank() over() permet de faire cela très facilement.


Christophe
L'avantage d'être une île c'est d'être une terre topologiquement close

Hors ligne

 

#5 Mon 09 January 2017 14:02

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

Re: QGIS 2.14.8: Identifiant @Rownumber selon une valeur

Bonjour, voici un exemple de script python( à lancer à partir de la console python de qgis) qui devrait répondre à votre demande.

# -*- 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'] ="0000" + str(i + 1)
        elif i < 99 :
            feature['ID'] ="000" + str(i + 1)
        elif i < 999 :
            feature['ID'] ="00" + str(i + 1)
        elif i < 9999 :
            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)


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.

Hors ligne

 

Pied de page des forums

Powered by FluxBB