Сортувати шари в змісті QGIS?


12

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

Чи є інструменти чи плагіни, які дозволяють швидко сортувати QCIS TOC в іншому порядку? Наприклад, я можу придумати кілька варіантів, які можна захотіти:

  1. Сортуйте шари за геометрією, де точки знаходяться зверху, а потім лінії, поліси та растри.
  2. Сортуйте шари за назвою (за алфавітом, за зворотним алфавітом).
  3. Сортуйте спочатку за геометрією, потім за назвою. Це було б поєднання №1 та №2. Шари точок сортуються до верху (так само, як №1), але потім шари точок сортуються за алфавітом (точка-а, точка-b, точка-с тощо).

Завантажуючи велику кількість шарів, це допоможе швидко створити правильне замовлення для виготовлення карт.


Дуже приємна ідея! Я не думаю, що є якісь плагіни для виконання такої задачі (якщо python є достатньою, я міг би над ним працювати, але я вважаю, що це складно). Можливо, ви можете зробити запит на особливості до команди розробників QGIS.
Curlew

1
Я опублікував запит на цю функцію.
RyanKDalton

Відповіді:


7

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

Це, здається, є помилкою (навіть у головній гілці), коли використовується додавання рівня шару Додати шари PostGIS ..., і про це слід повідомити у трекері помилок QGIS . Однак якщо ви використовуєте новий браузер для завантаження шарів PostGIS, вони не будуть повернені. Новий диспетчер БД не дозволяє проводити багаторазовий вибір таблиць, тому жодної проблеми там немає (крім відсутності багаторазового вибору).

Чи є інструменти чи плагіни, які дозволяють швидко сортувати QCIS TOC в іншому порядку? Наприклад, я можу придумати кілька варіантів, які можна захотіти:

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)

Caveat : Якщо головна легенда також керує порядком візуалізації шарів (за замовчуванням), це повинно працювати нормально. Якщо віджет доки Layer Order використовується окремо для управління порядком візуалізації, то порядок сортування в легенді не шанується, і наступна операція сортування може призвести до небажаних результатів (продовження зверху):

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

З цього коду видно, що перелік порядку замовлення шарів - це QListWidget , а не QTreeWidget, а це означає, що сортування НЕ враховує жодних угруповань. Усі шари представлені в плоскому списку, ніби всі вони вищого рівня. Отже, будь-які шари, які зараз вкладені в групи, можуть сортувати вище під шарами верхнього рівня, якщо застосувати вищезазначений код сортування до QListWidget.

1) Сортуйте шари за геометрією, де точки вгорі, а потім лінії, поліси та растри.

3) Сортуйте спочатку за геометрією, потім за назвою. Це було б поєднання №1 та №2. Шари точок сортуються до верху (так само, як №1), але потім шари точок сортуються за алфавітом (точка-а, точка-b, точка-с тощо).

В даний час, використовуючи 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 , або плагін, або завантажено в нову консоль в майстер). Це створить групи з сортованими іменами, додасть шари для виправлення груп, а потім сортуватиме все. Це ж застереження застосовується, як і вище.

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


Зміни для відображення шарів в алфавітному порядку щойно були об'єднані в головну гілку: github.com/qgis/QGIS/pull/4965
MatzFan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.