在QGIS目录中对图层进行排序?


12

当我从PostGIS将一堆图层加载到QGIS中时,它们似乎以相反的字母顺序加载。

是否有任何工具或插件可让您以其他顺序快速对QGIS TOC进行排序?例如,我可以想到一个可能需要的几个选项:

  1. 按几何对图层进行排序,点在最上面,然后是线,多边形和栅格。
  2. 按名称对图层排序(字母,反向字母)。
  3. 首先按几何排序,然后按名称排序。这将是#1&#2的组合。点图层排在顶部(与#1相同),但随后按字母顺序对点图层进行排序(a点,b点,c点等)。

加载大量图层时,这将有助于快速建立正确的地图生成顺序。


很好的主意!我不认为有任何插件可以执行这样的任务(如果python足够我可以进行处理,但是我认为这很复杂)。也许您可以向QGIS开发团队提出功能请求。
Curlew 2012年

1
我已经为此功能发布了功能请求
RyanKDalton

Answers:


7

当我从PostGIS将一堆图层加载到QGIS中时,它们似乎以相反的字母顺序加载。

使用添加层操作“ 添加PostGIS层...”时,这似乎是一个错误(甚至在主分支中),并且应在QGIS错误跟踪器上报告。但是,如果您使用新的浏览器加载PostGIS图层,则将不会撤消它们。新的数据库管理器不允许对表进行多重选择,因此在那里没有问题(除了缺乏多重选择)。

是否有任何工具或插件可让您以其他顺序快速对QGIS 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)

注意:如果主图例也控制图层的渲染顺序(默认),则此方法可以正常运行。如果单独使用“图层顺序”停靠小部件来控制渲染顺序,则图例中的排序顺序将不被接受,并且以下排序操作可能会导致不良结果(从上继续):

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

从此代码中,您可以看到“层顺序”列表是QListWidget,而不是QTreeWidget,这意味着排序将不考虑任何分组。所有图层均显示在平面列表中,就好像它们都是顶层的一样。因此,如果您将上述排序代码应用于QListWidget,则当前嵌套在组中的所有图层都可以在顶级图层的上方进行排序。

1)按几何排序图层,其中点在最上面,然后是线,多边形和栅格。

3)首先按几何排序,然后按名称排序。这将是#1&#2的组合。点图层排在顶部(与#1相同),但随后按字母顺序对点图层进行排序(a点,b点,c点等)。

当前,使用Python来操作QgsLegend的功能有限。有QgsLegendInterface,但是它没有QgsLegendQgsLegendLayer,继承的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中的新控制台)中运行。它将创建具有可排序名称的组,添加图层以更正组,然后对整个事物进行排序。如上所述,同样的警告。

将新层添加到具有已加载的层和组的现有项目中时,需要进行更多检查以确保组索引正确,从而获得更可靠的解决方案。


按字母顺序显示图层的更改已合并到master分支中:github.com/qgis/QGIS/pull/4965
MatzFan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.