Trier les couches dans la table des matières de QGIS?


12

Lorsque je charge un tas de couches dans QGIS à partir de PostGIS, elles semblent se charger dans l'ordre alphabétique inverse.

Existe-t-il des outils ou des plugins qui vous permettent de trier rapidement la table des matières QGIS dans un ordre différent? Par exemple, je peux penser à quelques options que l'on pourrait souhaiter:

  1. Triez les calques par géométrie, où les points sont en haut, puis les lignes, les polys et les rasters.
  2. Trier les calques par nom (alphabétique, alphabétique inversé).
  3. Triez d'abord par géométrie, puis par nom. Ce serait une combinaison de # 1 & # 2. Les couches de points sont triées vers le haut (comme au n ° 1), mais les couches de points sont ensuite triées par ordre alphabétique (point-a, point-b, point-c, etc.).

Lors du chargement d'un grand nombre de couches, cela aiderait à établir rapidement le bon ordre pour la production de cartes.


Très belle idée! Je ne pense pas qu'il existe de plugins pour effectuer une telle tâche (si python est suffisant, je pourrais y travailler, mais je pense que c'est trop compliqué). Vous pouvez peut-être faire une demande de fonctionnalité à l'équipe de développement QGIS.
Courlis

1
J'ai publié une demande de fonctionnalité pour cette fonctionnalité.
RyanKDalton

Réponses:


6

Lorsque je charge un tas de couches dans QGIS à partir de PostGIS, elles semblent se charger dans l'ordre alphabétique inverse.

Cela semble être un bogue (même dans la branche principale) lors de l'utilisation de l'action d'ajout de couche Ajouter des couches PostGIS ... et doit être signalé sur le suivi des bogues QGIS . Cependant, si vous utilisez le nouveau navigateur pour charger des couches PostGIS, elles ne seront pas inversées. Le nouveau DB Manager n'autorise pas les sélections multiples de tables, donc pas de problème (autre que l'absence de sélection multiple).

Existe-t-il des outils ou des plugins qui vous permettent de trier rapidement la table des matières QGIS dans un ordre différent? Par exemple, je peux penser à quelques options que l'on pourrait souhaiter:

2) Trier les calques par nom (alphabétique, alphabétique inversé).

Cela peut actuellement être fait en utilisant le tri natif des colonnes ou des éléments de la classe de base de QgsLegend ( QTreeWidget ). Cela triera TOUS LES ARTICLES, les couches et les groupes ensemble, pas les groupes regroupés au-dessus ou en dessous des couches de niveau supérieur. Il sera également trié en groupes. Il n'y a PAS UNDO de tri comme celui-ci.

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from qgis.utils import iface

mw = iface.mainWindow()
lgd = mw.findChild(QTreeWidget, "theMapLegend")  # get ref to object by type/objectName
lgd.sortItems(0, Qt.AscendingOrder)  # sort first column (Qt.DescendingOrder to reverse)

Avertissement : si la légende principale contrôle également l'ordre de rendu des calques (par défaut), cela devrait fonctionner correctement. Si le widget d'ancrage Ordre des couches est utilisé séparément pour contrôler l'ordre de rendu, l'ordre de tri dans la légende n'est pas respecté et l'opération de tri suivante peut conduire à des résultats indésirables (en continuant par le haut):

lo = mw.findChild(QListWidget, "theMapLayerOrder")
lo.sortItems(Qt.AscendingOrder)

À partir de ce code, vous pouvez voir que la liste de l'ordre des couches est un QListWidget , pas un QTreeWidget, ce qui signifie que le tri ne prendra en compte aucun regroupement. Tous les calques sont présentés dans une liste plate, comme s'ils étaient tous de niveau supérieur. Ainsi, toutes les couches actuellement imbriquées dans des groupes peuvent être triées au-dessus des couches de niveau inférieur, si vous appliquez le code de tri ci-dessus à QListWidget.

1) Triez les calques par géométrie, où les points sont en haut, puis les lignes, les polys et les rasters.

3) Triez d'abord par géométrie, puis par nom. Ce serait une combinaison de # 1 & # 2. Les couches de points sont triées vers le haut (comme au n ° 1), mais les couches de points sont ensuite triées par ordre alphabétique (point-a, point-b, point-c, etc.).

Actuellement, en utilisant Python, les fonctionnalités de manipulation de QgsLegend sont limitées. Il y a QgsLegendInterface mais cela n'a pas tous les goodies qui sont présents dans QgsLegend , QgsLegendLayer , le QgsLegendItem hérité ou l'une des autres classes associées à QgsLegend.

Bien que, si vous commencez avec un projet propre et que cela ne vous dérange pas d'utiliser des groupes, ce qui suit est actuellement possible (en continuant à partir du bloc de code initial):

li = iface.legendInterface()
li.addGroup('A_Points')
li.addGroup('B_Lines')
li.addGroup('C_Polygons')
li.addGroup('D_Rasters')

for l in li.layers():
  if l.type() == QgsMapLayer.VectorLayer:
    if l.geometryType() == QGis.Point:
      li.moveLayer(l, 0)
    elif l.geometryType() == QGis.Line:
      li.moveLayer(l, 1)
    elif l.geometryType() == QGis.Polygon:
      li.moveLayer(l, 2)
  elif l.type() == QgsMapLayer.RasterLayer:
    li.moveLayer(l, 3)

lgd.sortItems(0, Qt.AscendingOrder)

( Suppose qu'aucun autre groupe n'existe. ) Cela serait exécuté à partir de la console (ou du script ScriptRunner , ou du plugin, ou chargé dans la nouvelle console dans le maître) après l'ajout des couches. Il créera des groupes avec des noms triables, ajoutera des couches aux groupes corrects, puis triera le tout. La même mise en garde s'applique, comme ci-dessus.

Des vérifications supplémentaires des indices de groupe corrects seraient nécessaires pour une solution plus robuste lors de l'ajout de nouvelles couches à un projet existant avec des couches et des groupes déjà chargés.


Un changement pour afficher les couches dans l'ordre alphabétique vient d'être fusionné dans la branche principale: github.com/qgis/QGIS/pull/4965
MatzFan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.