QGISコンテンツウィンドウでレイヤーを並べ替えますか?


12

PostGISから多数のレイヤーをQGISに読み込むと、逆のアルファベット順に読み込まれているようです。

QGIS TOCを別の順序ですばやくソートできるツールまたはプラグインはありますか?たとえば、私が望むかもしれないいくつかのオプションを考えることができます:

  1. ポイントが一番上にあるジオメトリでレイヤーを並べ替え、次にライン、ポリゴン、ラスターで並べ替えます。
  2. レイヤーを名前で並べ替えます(アルファベット順、逆アルファベット順)。
  3. 最初にジオメトリでソートし、次に名前でソートします。これは、#1と#2の組み合わせになります。ポイントレイヤーは最上位に並べ替えられます(#1と同じ)が、ポイントレイヤーはアルファベット順に並べ替えられます(ポイントa、ポイントb、ポイントcなど)。

多数のレイヤーをロードする場合、これにより、マップ作成の適切な順序を迅速に構築できます。


とてもいいアイデアです!私はそのようなタスクを実行するプラグインがあるとは思わない(pythonで十分な場合、私はそれに取り組むことができるが、これは複雑だと思う)。QGIS開発チームに機能のリクエストを行うことができます。
カーリュー

1
この機能の機能要求を投稿しました。
RyanKDalton

回答:


6

PostGISから多数のレイヤーをQGISに読み込むと、逆のアルファベット順に読み込まれているようです。

これは、(マスターブランチであっても)レイヤーの追加アクションPostGISレイヤーの追加...を使用する場合のバグのようであり、QGISバグトラッカーで報告する必要があります。ただし、新しいブラウザーを使用し PostGISレイヤーを読み込む場合、それらは元に戻されません。新しいDBマネージャーはテーブルの複数選択を許可していないため、そこに問題はありません(複数選択がないことを除く)。

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)

このコードから、Layer OrderリストはQTreeWidgetではなくQListWidgetであることがわかります。つまり、並べ替えはグループ化を考慮しません。すべてのレイヤーは、すべてトップレベルであるかのように、フラットリストに表示されます。したがって、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ブランチにマージされました:github.com/qgis/QGIS/pull/4965
MatzFan
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.