Ebenen im QGIS-Inhaltsverzeichnis sortieren?

12

Wenn ich eine Reihe von Ebenen aus PostGIS in QGIS lade, werden sie scheinbar in umgekehrter alphabetischer Reihenfolge geladen.

Gibt es Tools oder Plugins, mit denen Sie das QGIS-Inhaltsverzeichnis schnell in einer anderen Reihenfolge sortieren können? Zum Beispiel kann ich mir ein paar Optionen vorstellen, die man sich wünschen könnte:

  1. Sortieren Sie die Ebenen nach Geometrie, wobei sich die Punkte oben befinden, dann nach Linien, Polys und Rastern.
  2. Ebenen nach Namen sortieren (alphabetisch, umgekehrt alphabetisch).
  3. Sortieren Sie zuerst nach Geometrie und dann nach Namen. Dies wäre eine Kombination aus Nr. 1 und Nr. 2. Punktebenen werden nach oben sortiert (wie # 1), aber dann werden Punktebenen alphabetisch sortiert (Punkt-a, Punkt-b, Punkt-c usw.).

Dies würde beim Laden einer großen Anzahl von Layern helfen, schnell die richtige Reihenfolge für die Kartenproduktion aufzubauen.

RyanKDalton
quelle
Sehr schöne Idee! Ich glaube nicht, dass es Plugins gibt, um eine solche Aufgabe zu erledigen (wenn Python ausreicht, könnte ich daran arbeiten, aber ich glaube, das ist zu kompliziert). Vielleicht können Sie eine Feature-Anfrage an das QGIS-Entwicklerteam stellen.
Brachvogel
1
Ich habe eine Funktionsanforderung für diese Funktionalität gesendet.
RyanKDalton

Antworten:

6

Wenn ich eine Reihe von Ebenen aus PostGIS in QGIS lade, werden sie scheinbar in umgekehrter alphabetischer Reihenfolge geladen.

Dies scheint ein Fehler zu sein (auch im Hauptzweig), wenn die Aktion " PostGIS-Layer hinzufügen" ... verwendet wird, und sollte auf dem QGIS-Bug-Tracker gemeldet werden . Wenn Sie jedoch den neuen Browser zum Laden von PostGIS-Layern verwenden, werden diese nicht rückgängig gemacht. Der neue DB-Manager erlaubt keine Mehrfachauswahl von Tabellen, daher gibt es kein Problem (außer dem Fehlen einer Mehrfachauswahl).

Gibt es Tools oder Plugins, mit denen Sie das QGIS-Inhaltsverzeichnis schnell in einer anderen Reihenfolge sortieren können? Zum Beispiel kann ich mir ein paar Optionen vorstellen, die man sich wünschen könnte:

2) Sortiere die Ebenen nach Namen (alphabetisch, umgekehrt alphabetisch).

Dies kann derzeit mithilfe der systemeigenen Spalten- oder Elementsortierung der Basisklasse von QgsLegend ( QTreeWidget ) erfolgen. Dadurch werden ALLE EINZELTEILE sortiert, sowohl Ebenen als auch Gruppen, nicht Gruppen, die über oder unter Ebenen der obersten Ebene gruppiert sind. Es wird auch in Gruppen sortiert. Es gibt kein Rückgängigmachen einer solchen Sortierung.

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)

Vorsichtsmaßnahme : Wenn die Hauptlegende auch die Renderreihenfolge der Ebenen steuert (Standard), sollte dies in Ordnung sein. Wenn das Andock-Widget „Ebenenreihenfolge“ separat zum Steuern der Renderreihenfolge verwendet wird, wird die Sortierreihenfolge in der Legende nicht berücksichtigt und der folgende Sortiervorgang kann zu unerwünschten Ergebnissen führen (Fortsetzung von oben):

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

Anhand dieses Codes können Sie erkennen, dass es sich bei der Auflistung der Ebenenreihenfolge um ein QListWidget und nicht um ein QTreeWidget handelt. Das bedeutet, dass beim Sortieren KEINE Gruppierungen berücksichtigt werden. Alle Ebenen werden in einer flachen Liste dargestellt, als ob sie alle oberste Ebene wären. Wenn Sie den obigen Sortiercode auf das QListWidget anwenden, werden derzeit in Gruppen verschachtelte Ebenen möglicherweise über den Ebenen der obersten Ebene sortiert.

1) Sortieren Sie die Ebenen nach Geometrie, wobei sich die Punkte oben befinden, dann nach Linien, Polys und Rastern.

3) Sortieren Sie zuerst nach Geometrie und dann nach Namen. Dies wäre eine Kombination aus Nr. 1 und Nr. 2. Punktebenen werden nach oben sortiert (wie # 1), aber dann werden Punktebenen alphabetisch sortiert (Punkt-a, Punkt-b, Punkt-c usw.).

Gegenwärtig gibt es in Python nur eingeschränkte Funktionen zum Bearbeiten von QgsLegend. Es gibt das QgsLegendInterface, aber dieses enthält nicht alle Extras , die in QgsLegend , QgsLegendLayer , dem geerbten QgsLegendItem oder einer der anderen mit QgsLegend verknüpften Klassen vorhanden sind.

Wenn Sie mit einem sauberen Projekt beginnen und keine Probleme mit der Verwendung von Gruppen haben, ist derzeit Folgendes möglich (Fortsetzung vom ersten Codeblock):

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)

(Es wird davon ausgegangen, dass keine anderen Gruppen vorhanden sind. ) Dies wird über die Konsole (oder das ScriptRunner- Skript oder das Plug-in) ausgeführt oder in die neue Konsole im Master geladen, nachdem die Ebenen hinzugefügt wurden. Es werden Gruppen mit sortierbaren Namen erstellt, Ebenen zu korrekten Gruppen hinzugefügt und dann das Ganze sortiert. Es gilt der gleiche Vorbehalt wie oben.

Weitere Überprüfungen für korrekte Gruppenindizes wären für eine robustere Lösung erforderlich, wenn einem vorhandenen Projekt mit bereits geladenen Layern und Gruppen neue Layer hinzugefügt werden.

dakcarto
quelle
Eine Änderung bei der Anzeige von Ebenen in alphabetischer Reihenfolge wurde soeben in der Hauptniederlassung zusammengefasst: github.com/qgis/QGIS/pull/4965
MatzFan