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 !.
Nom d'utilisateur    Mot de passe              Toujours pas inscrit ?   Mot de passe oublié ?

Annonce

GeoRezo est partenaire média de la Conférence Francophone SIG 2017 organisée par ESRI.

Les bénévoles de l'association seront présents les 11 et 12 Octobre aux Docks de Paris.

Le programme est riche, mais vous trouverez bien un  moment pour venir faire une pause au stand GeoRezo, et rencontrer les animateurs du portail francophone de la géomatique.

Nous serons à votre écoute pour partager avec vous notre passion pour l’animation du portail GeoRezo.

L'équipe GeoRezo

#1 lun. 28 novembre 2016 16:41

htarhoun
Membre
Date d'inscription: 14 avril 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 (lun. 28 novembre 2016 16:42)

Hors ligne

 

#2 lun. 09 janvier 2017 08:43

MathieuR
Moderateur
Lieu: aix-en-provence
Date d'inscription: 16 févr. 2009
Messages: 1280

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

Hors ligne

 

#3 lun. 09 janvier 2017 09:11

gustavecoste
Membre
Lieu: Montpellier
Date d'inscription: 24 avril 2013
Messages: 108

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 lun. 09 janvier 2017 09:58

ChristopheV
Membre
Lieu: Ajaccio
Date d'inscription: 7 sept. 2005
Messages: 2337
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 lun. 09 janvier 2017 14:02

Anthony Philibert
Membre
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

Partagez  |