Sortować warstwy w spisie treści QGIS?

12

Gdy ładuję wiązkę warstw do QGIS z PostGIS, wydaje się, że ładują się one w odwrotnej kolejności alfabetycznej.

Czy są jakieś narzędzia lub wtyczki, które pozwalają szybko posortować QGIS TOC w innej kolejności? Na przykład mogę wymyślić kilka opcji, które mogą być potrzebne:

  1. Sortuj warstwy według geometrii, gdzie punkty znajdują się na górze, a następnie linie, polisy i rastry.
  2. Sortuj warstwy według nazwy (alfabetycznie, odwrotnie alfabetycznie).
  3. Sortuj najpierw według geometrii, a następnie według nazwy. Byłaby to kombinacja # 1 i # 2. Warstwy punktów są sortowane do góry (tak samo jak nr 1), ale następnie warstwy punktów są sortowane alfabetycznie (punkt-a, punkt-b, punkt-c itp.).

Podczas ładowania dużej liczby warstw pomogłoby to w szybkim opracowaniu właściwej kolejności tworzenia map.

RyanKDalton
źródło
Bardzo fajny pomysł! Nie sądzę, że istnieją jakieś wtyczki do wykonania takiego zadania (jeśli python jest wystarczający, mógłbym nad tym popracować, ale uważam, że jest to skomplikowane). Może możesz poprosić zespół projektantów QGIS o przesłanie funkcji.
Curlew
1
Wysłałem prośbę o tę funkcję.
RyanKDalton,

Odpowiedzi:

7

Gdy ładuję wiązkę warstw do QGIS z PostGIS, wydaje się, że ładują się one w odwrotnej kolejności alfabetycznej.

Wydaje się to być błędem (nawet w gałęzi master) podczas korzystania z akcji dodawania warstwy Dodaj warstwy PostGIS ... i powinno być zgłaszane w narzędziu do śledzenia błędów QGIS . Jeśli jednak użyjesz nowej przeglądarki do załadowania warstw PostGIS, nie zostaną one odwrócone. Nowy DB Manager nie pozwala na wielokrotny wybór tabel, więc nie ma problemu (oprócz braku wielokrotnego wyboru).

Czy są jakieś narzędzia lub wtyczki, które pozwalają szybko posortować QGIS TOC w innej kolejności? Na przykład mogę wymyślić kilka opcji, które mogą być potrzebne:

2) Sortuj warstwy według nazwy (alfabetycznie, odwrotnie alfabetycznie).

Można to obecnie zrobić za pomocą natywnego sortowania kolumn lub elementów w klasie bazowej QgsLegend ( QTreeWidget ). Spowoduje to sortowanie WSZYSTKICH ELEMENTÓW, zarówno warstw, jak i grup, a nie grup zgrupowanych powyżej lub poniżej warstw najwyższego poziomu. Będzie również sortować w grupach. Nie ma takiego cofnięcia sortowania.

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)

Uwaga : jeśli główna legenda kontroluje także kolejność renderowania warstw (domyślnie), powinno to działać OK. Jeśli widżet dokowania Kolejność warstw jest używany osobno do sterowania kolejnością renderowania, kolejność sortowania w legendzie nie jest honorowana, a następująca operacja sortowania może prowadzić do niepożądanych wyników (kontynuacja od góry):

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

Z tego kodu widać, że lista Kolejność warstw jest QListWidget , a nie QTreeWidget, co oznacza, że ​​sortowanie NIE będzie uwzględniać żadnych grup. Wszystkie warstwy są przedstawione na płaskiej liście, tak jakby wszystkie były na najwyższym poziomie. Tak więc wszystkie warstwy obecnie zagnieżdżone w grupach mogą sortować powyżej warstw najwyższego poziomu, jeśli zastosujesz powyższy kod sortujący do QListWidget.

1) Sortuj warstwy według geometrii, gdzie punkty znajdują się na górze, a następnie linie, polisy i rastry.

3) Sortuj najpierw według geometrii, a następnie według nazwy. Byłaby to kombinacja # 1 i # 2. Warstwy punktów są sortowane do góry (tak samo jak nr 1), ale następnie warstwy punktów są sortowane alfabetycznie (punkt-a, punkt-b, punkt-c itp.).

Obecnie, używając Pythona, funkcjonalność QgsLegend jest ograniczona. Istnieje interfejs QgsLegendInterface, ale nie zawiera on wszystkich dodatków, które są obecne w QgsLegend , QgsLegendLayer , odziedziczonej QgsLegendItem lub innej klasie powiązanej z QgsLegend.

Chociaż jeśli zaczynasz od czystego projektu i nie masz nic przeciwko używaniu grup, obecnie możliwe są następujące czynności (kontynuacja od początkowego bloku kodu):

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)

( Zakłada się, że nie istnieją inne grupy ) . Zostanie on uruchomiony z konsoli (lub skryptu ScriptRunner lub wtyczki lub załadowany do nowej konsoli w trybie głównym) po dodaniu warstw. Stworzy grupy z nazwami do sortowania, doda warstwy do poprawnych grup, a następnie posortuje całość. Obowiązuje to samo zastrzeżenie, jak powyżej.

Potrzebne byłyby więcej sprawdzeń poprawności wskaźników grup, aby uzyskać bardziej niezawodne rozwiązanie podczas dodawania nowych warstw do istniejącego projektu z już załadowanymi warstwami i grupami.

dakcarto
źródło
Zmiana wyświetlania warstw w kolejności alfabetycznej została właśnie połączona z gałęzią master: github.com/qgis/QGIS/pull/4965
MatzFan