Trier par plusieurs champs en même temps dans QGIS?

17

Est-il possible de trier plusieurs champs en même temps dans QGIS?

Par exemple, j'aimerais trier un tableau par nom d'État, puis dans chaque État, trier par nom de comté.

Ce serait la même chose que l'option Tri avancé disponible dans ArcMap.

Stu Smith
la source

Réponses:

3

Il y a en fait une astuce très simple. Supposons que vous vouliez d'abord trier par champ "A", puis par champ "B" dans "A". Cliquez d'abord avec le bouton gauche de la souris sur l'en-tête du champ "B" (cliquez une fois pour trier par ordre croissant, une deuxième fois pour trier par ordre décroissant) dans la table des attributs. Faites ensuite un clic gauche sur l'en-tête du champ "A" (une fois pour ASC, 2ème fois pour DESC). Cette dernière action aura trié le champ "A", tout en conservant le tri du champ "B" dans des valeurs identiques de "A". Je l'ai essayé avec 3 champs et ça marche aussi (puis je me suis ennuyé). J'utilise QGIS 3.6.3-Noosa.

Benoit St-Onge
la source
Excellent! Je l'ai également testé avec 3 champs (état, comté, ville) et cela a fonctionné parfaitement - ascendant ou descendant. 3.8.3.
Stu Smith
8

Vous pouvez utiliser le plugin Trier et numéroter. Il vous permet de trier une table attributaire jusqu'à 3 champs, puis il crée un champ supplémentaire qui contient l'ordre des entités triées.

Avertissement: je suis l'auteur du plugin.

ArMoraer
la source
j'espère que cela fonctionnera. Je l'ai mis sur mon jeu de données d'enregistrement 150k et ça continue après 10 minutes. Cela code en dur le tri dans la nouvelle colonne afin que vous puissiez ensuite trier par cela - y a-t-il un moyen qui fonctionne comme dans Excel ou ArcMap qui n'ajoute pas de colonne? voir desktop.arcgis.com/en/arcmap/10.3/manage-data/tables/...
GeorgeC
1
J'espère également que cela fonctionnera, je ne l'ai jamais testé sur des ensembles de données aussi volumineux. Je ne pense pas qu'il soit possible de simplement changer l'ordre d'affichage, comme dans ArcMap; L'API QGIS ne fournit aucune méthode pour le faire. C'est pourquoi j'ai choisi d'ajouter un champ de numérotation comme solution de contournement.
ArMoraer
Ça continue - ArcMap l'a fait dans environ 30s. Tant pis. Merci pour la solution, je garderai cela ouvert pendant 24h pour voir si quelqu'un a d'autres suggestions.
GeorgeC
D'accord, merci pour les commentaires. Le plugin repose directement sur la sort()fonction de Python , je me demande pourquoi il est si lent. Je vais essayer de trouver une astuce pour accélérer le processus dans une future version.
ArMoraer
Nice Tool ... m'a sauvé beaucoup de travail ... très apprécié
K_Man
7

Si est OK pour enregistrer le résultat de façon permanente, vous pouvez trier le fichier de formes avec GDAL

ogr2ogr -f "ESRI Shapefile" -dialect sqlite -sql "SELECT *
FROM my_shapefile ORDER BY attr_1, attr_2, attr_3" sorted.shp my_shapefile.shp

Cela a pris moins de 3 minutes avec un fichier de formes contenant un million de polygones.

user30184
la source
1
merci mais je préfère ne rien faire de permanent car cela générera plusieurs jeux de données et j'espérais également un moyen à partir de QGIS lui-même.
GeorgeC
2
Ensuite, je convertirais probablement le fichier de formes en Spatialite. Avec DB Manager, vous pouvez ensuite créer et exécuter des requêtes SQL. Vous pouvez également enregistrer les requêtes fréquemment utilisées pour les besoins futurs.
user30184
5

Le plug-in DB Manager dans QGIS possède désormais un nœud «Couches virtuelles» qui vous permet d'écrire des commandes SQL sur des fichiers de formes chargés dans votre projet QGIS.

Alors maintenant que vous avez cette capacité, la logique SQL pour trier par plusieurs champs se trouve dans l'instruction ORDER BY, en utilisant asc (ascendant), desc (décroissant), et vous pouvez les enchaîner pour trier par plusieurs colonnes:

entrez la description de l'image ici

Un bonus supplémentaire est que vous en apprendrez plus sur SQL, donc quand vous en aurez marre des fichiers de formes et la plupart de PostGIS, le saut ne sera pas si grand !!!

DPSSpatial
la source
Merci - c'est une excellente solution mais pour ce cas d'utilisation, je ne veux pas non plus changer le format des données.
GeorgeC
2
Vous pouvez travailler avec .SHP pour cette solution - cela ne change pas le format des données. Essayez-le ...
DPSSpatial
1
@GeorgeC avez-vous essayé cela?
DPSSpatial
5

Cela peut maintenant être fait sans plugins ni travaux spécifiques à la base de données, au moins pour la version 3.2+. Pour trier par plusieurs colonnes:

  1. Faites un clic droit sur l'en-tête de la colonne de la table attributaire et choisissez "Trier ..."
  2. Ajoutez la fonction concat()avec les champs que vous souhaitez trier, dans le bon ordre (ex. concat("column1", "column2")). Un aperçu de sortie doit être affiché sous votre code.
  3. Cochez ou décochez la case "Tri croissant" en bas pour configurer les directions de tri des colonnes.
  4. Cliquez sur OK et confirmez le tri.

Cette fonctionnalité a été ajoutée via le numéro # 1137 et couverte dans la dernière version (développement) du manuel de l'utilisateur .

Eron Lloyd
la source
1
Testé avec succès avec QGIS 3.6.
M. Che
J'ai concaténé une chaîne et un entier qui n'a pas de longueur fixe, j'ai donc utilisé une concat("col1", right( ('000' || tostring( "col2" )), 4))
solution de
2

Eh bien, c'est maintenant 2018, donc je ne peux pas croire que ce n'est pas encore répondu.

  1. Ouvrez la vue de la table des attributs et cliquez avec le bouton droit sur n'importe quelle colonne, puis choisissez Trier ...

  2. La fenêtre de dialogue Configurer l'ordre de tri de la table d'attributs est désormais ouverte avec l'éditeur d'expression complète

  3. Utilisez la fonction COALESCE avec les colonnes souhaitées, par exemple, cela triera un tableau par 3 colonnes (d'abord par ID puis VERSION puis fid)

coalesce("ID","VERSION","fid" )

entrez la description de l'image ici

Cliquez sur OK pour trier le tableau

sys49152
la source
Malheureusement, la fusion n'a pas fonctionné pour moi. Dans un test utilisant une table d'attributs de fichier de formes avec deux colonnes entières (contenant toutes deux un mélange de nombres et de valeurs vides): 1) avec le bouton Trier ascendant décoché, le résultat a trié la première colonne correcte (décroissante) mais la deuxième colonne a été incorrectement triée croissant pour chaque valeur de la première colonne. 2) avec le bouton Tri ascendant coché, le résultat était un résultat aléatoire qui n'avait aucun sens.
Stu Smith
1
Vous pouvez concaténer des champs en "||" , coalesce renverra la première valeur non NULL qui n'est pas valide pour le tri. Vous devriez probablement utiliser une mise en forme pour en avoir 1 avant 11.
Zoltan
1

Vous ne pouvez pas (du moins pas pour le moment). Pardon!

Consultez la documentation QGIS et faites défiler jusqu'à la toute dernière ligne.

Une solution de rechange désagréable serait de tirer le DBF du Shapefile dans Excel. Triez-le et enregistrez le résultat. Vous pouvez également importer votre fichier Shapefile dans PostGIS ou SpatialLite où vous disposez d'une plus grande fonctionnalité de tri. Fondamentalement, vous devrez contourner QGIS pour un tri avancé.

MappaGnosis
la source
2
+1 pour la bonne note qu'il n'est actuellement pas possible mais -1 pour suggérer de jouer avec le DBF dans Excel
underdark
J'ai dit que c'était 'méchant' :)
MappaGnosis
Vous mentionnez PostGIS et SpatiaLite: pourriez-vous montrer un exemple de la façon de faire ce que l'OP a demandé à partir de QGIS, en utilisant également un plugin db?
steko
0

Comme suggéré par @Sylvester Sneekly, si vos données sont chargées dans un SGBDR comme PosGIS ou SpatialLite, vous pouvez envisager de créer une vue de base de données dans le SGBDR qui pré-trie les données tabulaires, puis chargez la vue pré-triée dans QGIS en tant que couche.

RyanKDalton-OffTheGridMaps
la source