Quando carico un gruppo di livelli in QGIS da PostGIS, sembrano caricarsi in ordine alfabetico inverso.
Questo sembra essere un bug (anche nel ramo principale) quando si utilizza l'azione Aggiungi livello Aggiungi livelli PostGIS ... e deve essere segnalato sul tracciatore di bug QGIS . Tuttavia, se si utilizza il nuovo browser per caricare i livelli PostGIS, questi non verranno invertiti. Il nuovo DB Manager non consente selezioni multiple di tabelle, quindi nessun problema lì (a parte la mancanza di selezione multipla).
Esistono strumenti o plugin che ti consentono di ordinare rapidamente il QOC TOC in un ordine diverso? Ad esempio, posso pensare a un paio di opzioni che uno potrebbe desiderare:
2) Ordina i livelli per nome (alfabetico, alfabetico inverso).
Attualmente è possibile farlo utilizzando la colonna nativa o l'ordinamento degli elementi della classe base di QgsLegend ( QTreeWidget ). Questo ordinerà TUTTI GLI ARTICOLI, sia i livelli che i gruppi insieme, non i gruppi raggruppati sopra o sotto i livelli di livello superiore. Ordinerà anche all'interno dei gruppi. Non esiste UNDO di smistamento come questo.
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)
Avvertenza : se la legenda principale controlla anche l'ordine di rendering dei livelli (impostazione predefinita), dovrebbe funzionare correttamente. Se il widget dock Ordine livelli viene utilizzato separatamente per controllare l'ordine di rendering, l'ordinamento nella legenda non viene rispettato e la seguente operazione di ordinamento può portare a risultati indesiderati (continuando dall'alto):
lo = mw.findChild(QListWidget, "theMapLayerOrder")
lo.sortItems(Qt.AscendingOrder)
Da questo codice puoi vedere che l'elenco degli ordini dei livelli è un QListWidget , non un QTreeWidget, il che significa che l'ordinamento NON terrà conto di nessun raggruppamento. Tutti i livelli sono presentati in un elenco semplice, come se fossero tutti di livello superiore. Pertanto, qualsiasi livello attualmente nidificato in gruppi può ordinare sopra i livelli di livello superiore, se si applica il codice di ordinamento sopra a QListWidget.
1) Ordina i livelli per geometria, dove i punti sono in alto, quindi linee, poligoni e raster.
3) Ordina prima per geometria, poi per nome. Questa sarebbe una combinazione di # 1 e # 2. I livelli di punti vengono ordinati in alto (uguale al numero 1), ma i livelli di punti vengono ordinati alfabeticamente (punto-a, punto-b, punto-c, ecc.).
Attualmente, usando Python, ci sono funzionalità limitate per manipolare QgsLegend. C'è QgsLegendInterface ma questo non ha tutte le chicche presenti in QgsLegend , QgsLegendLayer , in QgsLegendItem ereditato o in qualsiasi altra classe associata a QgsLegend.
Tuttavia, se stai iniziando con un progetto pulito e non ti dispiace usare i gruppi, al momento è possibile quanto segue (proseguendo dal blocco di codice iniziale):
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)
( Suppone che non esistano altri gruppi. ) Questo verrebbe eseguito dalla console (o script ScriptRunner , o Plugin, o caricato in una nuova console nel master) dopo l'aggiunta dei layer. Creerà gruppi con nomi ordinabili, aggiungerà livelli ai gruppi corretti, quindi ordinerà il tutto. Si applica lo stesso avvertimento, come sopra.
Ulteriori controlli per indici di gruppo corretti sarebbero necessari per una soluzione più solida quando si aggiungono nuovi layer a un progetto esistente con layer e gruppi già caricati.