#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
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: 3180
- 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