Ordinare i livelli nell'indice di QGIS?


12

Quando carico un gruppo di livelli in QGIS da PostGIS, sembrano caricarsi in ordine alfabetico inverso.

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:

  1. Ordina i livelli per geometria, dove i punti sono in cima, quindi linee, poligoni e raster.
  2. Ordina i livelli per nome (alfabetico, alfabetico inverso).
  3. Ordina prima per geometria, quindi 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.).

Quando si carica un numero elevato di livelli, ciò contribuirebbe a creare rapidamente il giusto ordine per la produzione di mappe.


Ottima idea! Non penso che ci siano plugin per svolgere tale compito (se python è sufficiente potrei lavorarci sopra, ma credo che sia complicato). Forse puoi fare una richiesta di funzionalità al team di sviluppo di QGIS.
Chiurlo

1
Ho pubblicato una richiesta di funzionalità per questa funzionalità.
RyanKDalton,

Risposte:


6

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.


Una modifica per visualizzare i livelli in ordine alfabetico è stata appena fusa nel ramo principale: github.com/qgis/QGIS/pull/4965
MatzFan
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.