Сортировать слои в содержании QGIS?

12

Когда я загружаю несколько слоев в QGIS из PostGIS, они загружаются в обратном алфавитном порядке.

Существуют ли какие-либо инструменты или плагины, позволяющие быстро отсортировать оглавление QGIS в другом порядке? Например, я могу придумать пару вариантов, которые могут понадобиться:

  1. Сортируйте слои по геометрии, где точки находятся сверху, а затем линии, полисы и растры.
  2. Сортировать слои по имени (алфавитный, обратный алфавитный).
  3. Сортировка сначала по геометрии, затем по имени. Это будет комбинация № 1 и № 2. Слои точек сортируются сверху (так же, как # 1), но затем слои точек сортируются по алфавиту (точка-a, точка-b, точка-c и т. Д.).

При загрузке большого количества слоев это поможет быстро создать правильный порядок создания карт.

RyanKDalton
источник
Очень хорошая идея! Я не думаю, что есть какие-либо плагины для такой задачи (если Python достаточно, я мог бы поработать над этим, но я считаю, что это сложно). Возможно, вы можете отправить запрос на добавление в команду разработчиков QGIS.
Керлью
1
Я разместил запрос функции для этой функции.
RyanKDalton

Ответы:

6

Когда я загружаю несколько слоев в QGIS из PostGIS, они загружаются в обратном алфавитном порядке.

Похоже, что это ошибка (даже в основной ветке) при использовании действия добавления слоя Add PostGIS Layers ... и должна сообщаться в трекере ошибок QGIS . Однако, если вы используете новый браузер для загрузки слоев PostGIS, они не будут обращены вспять. Новый менеджер БД не допускает множественный выбор таблиц, поэтому проблем нет (кроме отсутствия множественного выбора).

Существуют ли какие-либо инструменты или плагины, позволяющие быстро отсортировать оглавление QGIS в другом порядке? Например, я могу придумать пару вариантов, которые могут понадобиться:

2) Сортировка слоев по имени (алфавитный, обратный алфавитный).

В настоящее время это можно сделать с помощью собственной сортировки столбцов или элементов базового класса QgsLegend ( QTreeWidget ). Это позволит отсортировать ВСЕ элементы, как слои, так и группы, а не группы, сгруппированные выше или ниже уровней верхнего уровня. Он также будет сортировать по группам. НЕТ ОТМЕНЫ сортировки, подобной этой.

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)

Предостережение : если основная легенда также контролирует порядок рендеринга слоя (по умолчанию), это должно работать нормально. Если виджет стыковки Order Layer Order используется отдельно для управления порядком рендеринга, то порядок сортировки в легенде не учитывается, и следующая операция сортировки может привести к нежелательным результатам (продолжение сверху):

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

Из этого кода вы можете видеть, что лист Layer Order представляет собой QListWidget , а не QTreeWidget, что означает, что сортировка НЕ ​​будет учитывать какие-либо группировки. Все слои представлены в виде плоского списка, как если бы они были на верхнем уровне. Таким образом, любые слои, в настоящее время вложенные в группы, могут сортироваться выше слоев верхнего уровня, если вы примените вышеуказанный код сортировки к QListWidget.

1) Сортировка слоев по геометрии, где точки находятся сверху, затем линии, полисы и растры.

3) Сортировка сначала по геометрии, затем по имени. Это будет комбинация № 1 и № 2. Слои точек сортируются сверху (так же, как # 1), но затем слои точек сортируются по алфавиту (точка-a, точка-b, точка-c и т. Д.).

В настоящее время, используя Python, существует ограниченная функциональность для манипулирования QgsLegend. Существует QgsLegendInterface, но он не имеет всех полезностей, присутствующих в QgsLegend , QgsLegendLayer , унаследованном QgsLegendItem или любом другом классе, связанном с QgsLegend.

Хотя, если вы начинаете с чистого проекта и не возражаете против использования групп, в настоящее время возможно следующее (продолжение с начального блока кода):

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)

( Предполагается, что других групп не существует. ) Это будет выполнено из консоли (или сценария ScriptRunner , или плагина, или загружена в новую консоль в master) после добавления слоев. Он создаст группы с сортируемыми именами, добавит слои в правильные группы, а затем отсортирует все. Применяется та же оговорка, что и выше.

Для более надежного решения потребуется больше проверок правильности групповых индексов при добавлении новых слоев в существующий проект с уже загруженными слоями и группами.

dakcarto
источник
Изменение отображения слоев в алфавитном порядке было только что объединено с основной веткой: github.com/qgis/QGIS/pull/4965
MatzFan