Classificar camadas no índice QGIS?

12

Quando carrego várias camadas no QGIS do PostGIS, elas parecem carregar em ordem alfabética inversa.

Existem ferramentas ou plugins que permitem classificar rapidamente o QGIS TOC em uma ordem diferente? Por exemplo, posso pensar em algumas opções que alguém pode querer:

  1. Classifique as camadas por geometria, onde os pontos estão no topo, depois linhas, polys e rasters.
  2. Classifique as camadas por nome (alfabético, alfabético reverso).
  3. Classifique primeiro por geometria e depois por nome. Isso seria uma combinação dos nºs 1 e 2. As camadas de pontos são classificadas na parte superior (igual ao nº 1), mas as camadas de pontos são classificadas em ordem alfabética (ponto-a, ponto-b, ponto-c, etc.).

Ao carregar um grande número de camadas, isso ajudaria a criar rapidamente a ordem certa para a produção de mapas.

RyanKDalton
fonte
Idéia muito boa! Eu não acho que existem plugins para executar essa tarefa (se o python for suficiente, eu poderia trabalhar nele, mas acredito que isso seja complicado). Talvez você possa fazer uma solicitação de recurso para a equipe de desenvolvimento do QGIS.
Curlew
1
Publiquei uma solicitação de recurso para esta funcionalidade.
precisa saber é o seguinte

Respostas:

6

Quando carrego várias camadas no QGIS do PostGIS, elas parecem carregar em ordem alfabética inversa.

Isso parece ser um erro (mesmo na ramificação mestre) ao usar a ação Adicionar camada Adicionar camadas PostGIS ... e deve ser relatado no rastreador de erros QGIS . No entanto, se você usar o novo navegador para carregar as camadas PostGIS, elas não serão revertidas. O novo DB Manager não permite várias seleções de tabelas; portanto, não há problema (além da falta de seleção múltipla).

Existem ferramentas ou plugins que permitem classificar rapidamente o QGIS TOC em uma ordem diferente? Por exemplo, posso pensar em algumas opções que alguém pode querer:

2) Classifique as camadas por nome (alfabético, alfabético reverso).

No momento, isso pode ser feito usando a coluna nativa ou a classificação do item da classe base do QgsLegend ( QTreeWidget ). Isso classificará TODOS OS ITENS, camadas e grupos, não grupos agrupados acima ou abaixo das camadas de nível superior. Ele também será classificado dentro de grupos. Não há desfazer de classificação como esta.

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)

Advertência : Se a legenda principal também controla a ordem de renderização da camada (padrão), isso deve funcionar bem. Se o widget de encaixe Order da camada for usado separadamente para controlar a ordem de renderização, a ordem de classificação na legenda não será respeitada e a operação de classificação a seguir poderá levar a resultados indesejados (continuando de cima):

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

Nesse código, você pode ver que a lista de pedidos de camadas é um QListWidget , não um QTreeWidget, o que significa que a classificação NÃO levará em consideração nenhum agrupamento. Todas as camadas são apresentadas em uma lista simples, como se fossem de nível superior. Portanto, qualquer camada atualmente aninhada em grupos pode ser classificada acima das camadas de nível superior, se você aplicar o código de classificação acima ao QListWidget.

1) Classifique as camadas por geometria, onde os pontos estão no topo, depois linhas, polys e rasters.

3) Classifique primeiro por geometria e depois por nome. Isso seria uma combinação dos nºs 1 e 2. As camadas de pontos são classificadas na parte superior (igual ao nº 1), mas as camadas de pontos são classificadas em ordem alfabética (ponto-a, ponto-b, ponto-c, etc.).

Atualmente, usando Python, há funcionalidade limitada para manipular o QgsLegend. Existe o QgsLegendInterface, mas ele não possui todos os presentes presentes no QgsLegend , QgsLegendLayer , no QgsLegendItem herdado ou em qualquer outra classe associada ao QgsLegend.

Embora, se você estiver começando com um projeto limpo e não se importe em usar grupos, atualmente é possível o seguinte (continuando no bloco de código inicial):

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)

( Supõe que nenhum outro grupo exista. ) Isso seria executado no console (ou script ScriptRunner , ou Plugin ou carregado no novo console no master) depois que as camadas fossem adicionadas. Ele criará grupos com nomes classificáveis, adicionará camadas para corrigir grupos e classificará a coisa toda. A mesma ressalva se aplica, como acima.

Seriam necessárias mais verificações para índices de grupo corretos para uma solução mais robusta ao adicionar novas camadas a um projeto existente com camadas e grupos já carregados.

dakcarto
fonte
A mudança para as camadas de exibição em ordem alfabética acaba de ser incorporada pela branch master: github.com/qgis/QGIS/pull/4965
MatzFan