¿Ordenar capas en la tabla de contenido QGIS?

12

Cuando cargo un montón de capas en QGIS desde PostGIS, parecen cargarse en orden alfabético inverso.

¿Hay alguna herramienta o complemento que le permita clasificar rápidamente la QGIS TOC en un orden diferente? Por ejemplo, puedo pensar en un par de opciones que uno podría desear:

  1. Ordene las capas por geometría, donde los puntos están en la parte superior, luego las líneas, los polis y los rásteres.
  2. Ordenar capas por nombre (alfabético, alfabético inverso).
  3. Ordenar primero por geometría, luego por nombre. Esta sería una combinación de # 1 y # 2. Las capas de puntos se ordenan en la parte superior (igual que # 1), pero luego las capas de puntos se ordenan alfabéticamente (punto-a, punto-b, punto-c, etc.).

Al cargar una gran cantidad de capas, esto ayudaría a construir rápidamente el orden correcto para la producción de mapas.

RyanKDalton
fuente
Muy buena idea! No creo que haya complementos para hacer tal tarea (si Python es suficiente, podría trabajar en ello, pero creo que esto es demasiado complicado). Tal vez pueda hacer una solicitud de características al equipo de desarrollo de QGIS.
Curlew
1
He publicado una solicitud de función para esta funcionalidad.
RyanKDalton

Respuestas:

6

Cuando cargo un montón de capas en QGIS desde PostGIS, parecen cargarse en orden alfabético inverso.

Esto parece ser un error (incluso en la rama maestra) cuando se usa la acción Agregar capa Agregar capas PostGIS ... y debe informarse en el rastreador de errores QGIS . Sin embargo, si usa el nuevo navegador para cargar capas PostGIS, no se revertirán. El nuevo DB Manager no permite múltiples selecciones de tablas, por lo que no hay problema allí (aparte de la falta de selección múltiple).

¿Hay alguna herramienta o complemento que le permita clasificar rápidamente la QGIS TOC en un orden diferente? Por ejemplo, puedo pensar en un par de opciones que uno podría desear:

2) Ordenar capas por nombre (alfabético, alfabético inverso).

Esto se puede hacer actualmente utilizando la columna nativa o la clasificación de elementos de la clase base de QgsLegend ( QTreeWidget ). Esto ordenará TODOS LOS ELEMENTOS, tanto las capas como los grupos, no los grupos agrupados por encima o por debajo de las capas de nivel superior. También se ordenará en grupos. No hay que deshacer de ordenar de esta manera.

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)

Advertencia : si la leyenda principal también controla el orden de representación de capa (predeterminado), esto debería funcionar bien. Si el widget de acoplamiento de Orden de capa se usa por separado para controlar el orden de representación, entonces el orden de clasificación en la leyenda no se respeta y la siguiente operación de clasificación puede conducir a resultados no deseados (continuando desde arriba):

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

A partir de este código, puede ver que la lista de pedidos de capa es un QListWidget , no un QTreeWidget, lo que significa que la clasificación NO tendrá en cuenta ninguna agrupación. Todas las capas se presentan en una lista plana, como si todas fueran de nivel superior. Por lo tanto, cualquier capa actualmente anidada en grupos puede clasificarse por encima de las capas de nivel superior, si aplica el código de clasificación anterior al QListWidget.

1) Ordene las capas por geometría, donde los puntos están en la parte superior, luego líneas, polis y rásteres.

3) Ordenar primero por geometría, luego por nombre. Esta sería una combinación de # 1 y # 2. Las capas de puntos se ordenan en la parte superior (igual que # 1), pero luego las capas de puntos se ordenan alfabéticamente (punto-a, punto-b, punto-c, etc.).

Actualmente, usando Python, hay una funcionalidad limitada para manipular QgsLegend. Existe QgsLegendInterface, pero no tiene todas las ventajas que están presentes en QgsLegend , QgsLegendLayer , el QgsLegendItem heredado o cualquiera de las otras clases asociadas con QgsLegend.

Sin embargo, si está comenzando con un proyecto limpio y no le importa usar grupos, lo siguiente es actualmente posible (continuando desde el bloque 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)

( Asume que no existen otros grupos ) . Esto se ejecutará desde la consola (o script ScriptRunner , o Plugin, o se cargará en la nueva consola en master) después de que se agregaron las capas. Creará grupos con nombres ordenables, agregará capas para corregir los grupos y luego ordenará todo. Se aplica la misma advertencia, como arriba.

Se necesitarían más comprobaciones para los índices de grupo correctos para una solución más sólida al agregar nuevas capas a un proyecto existente con capas y grupos ya cargados.

dakcarto
fuente
Un cambio para mostrar capas en orden alfabético acaba de fusionarse en la rama maestra: github.com/qgis/QGIS/pull/4965
MatzFan