Sortir layer dalam daftar isi QGIS?

12

Ketika saya memuat banyak layer ke QGIS dari PostGIS, mereka sepertinya memuat dalam urutan abjad terbalik.

Apakah ada alat atau plugin yang memungkinkan Anda dengan cepat mengurutkan QGIS TOC dalam urutan yang berbeda? Misalnya saya dapat memikirkan beberapa opsi yang mungkin diinginkan:

  1. Urutkan layer berdasarkan geometri, di mana titik berada di atas, lalu garis, polys, & raster.
  2. Urutkan Layers berdasarkan nama (abjad, abjad terbalik).
  3. Urutkan terlebih dahulu berdasarkan geometri, lalu berdasarkan nama. Ini akan menjadi kombinasi dari # 1 & # 2. Lapisan poin diurutkan ke atas (sama seperti # 1), tetapi kemudian lapisan poin diurutkan secara alfabet (titik-a, titik-b, titik-c, dll).

Ketika memuat sejumlah besar lapisan, ini akan membantu untuk dengan cepat membangun pemesanan yang tepat untuk produksi peta.

RyanKDalton
sumber
Ide yang sangat bagus! Saya tidak berpikir bahwa ada plugin untuk melakukan tugas seperti itu (jika python cukup saya bisa bekerja di dalamnya, tetapi saya percaya ini rumit). Mungkin Anda bisa membuat permintaan fitur ke tim pengembang QGIS.
Curlew
1
Saya telah mengirim permintaan fitur untuk fungsi ini.
RyanKDalton

Jawaban:

6

Ketika saya memuat banyak layer ke QGIS dari PostGIS, mereka sepertinya memuat dalam urutan abjad terbalik.

Ini tampaknya merupakan bug (bahkan di cabang master) saat menggunakan tindakan add layer Add PostGIS Layers ... dan harus dilaporkan pada pelacak bug QGIS . Namun, jika Anda menggunakan browser baru untuk memuat layer PostGIS, mereka tidak akan terbalik. DB Manager yang baru tidak mengizinkan beberapa pilihan tabel, jadi tidak ada masalah di sana (selain kurangnya pilihan ganda).

Apakah ada alat atau plugin yang memungkinkan Anda dengan cepat mengurutkan QGIS TOC dalam urutan yang berbeda? Misalnya saya dapat memikirkan beberapa opsi yang mungkin diinginkan:

2) Urutkan Layers berdasarkan nama (abjad, abjad terbalik).

Ini saat ini dapat dilakukan dengan menggunakan kolom asli atau penyortiran item dari kelas dasar QgsLegend ( QTreeWidget ). Ini akan mengurutkan SEMUA ITEM, baik lapisan dan grup bersama-sama, bukan grup yang dikelompokkan di atas atau di bawah lapisan tingkat atas. Ini juga akan mengurutkan dalam grup. Tidak ada penyortiran seperti ini.

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)

Peringatan : Jika legenda utama juga mengontrol urutan render layer (default), ini akan berfungsi OK. Jika widget dock Order Layer digunakan secara terpisah untuk mengontrol urutan render, maka urutan sortir dalam legenda tidak dihormati dan operasi sortir berikut dapat menyebabkan hasil yang tidak diinginkan (melanjutkan dari atas):

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

Dari kode ini Anda dapat melihat bahwa daftar Layer Order adalah QListWidget , bukan QTreeWidget, yang berarti pengurutan TIDAK akan memperhitungkan pengelompokan apa pun. Semua lapisan disajikan dalam daftar datar, seolah-olah semuanya adalah tingkat atas. Jadi, setiap lapisan yang saat ini bersarang dalam grup dapat mengurutkan di atas di bawah lapisan tingkat atas, jika Anda menerapkan kode penyortiran di atas ke QListWidget.

1) Urutkan layer berdasarkan geometri, di mana titik berada di atas, lalu garis, polis, & raster.

3) Urutkan terlebih dahulu berdasarkan geometri, lalu nama. Ini akan menjadi kombinasi dari # 1 & # 2. Lapisan poin diurutkan ke atas (sama seperti # 1), tetapi kemudian lapisan poin diurutkan secara alfabet (titik-a, titik-b, titik-c, dll).

Saat ini, menggunakan Python, ada fungsi terbatas untuk memanipulasi QgsLegend. Ada QgsLegendInterface tetapi ini tidak memiliki semua barang yang ada di QgsLegend , QgsLegendLayer , mewarisi QgsLegendItem , atau salah satu dari kelas-kelas lain terkait dengan QgsLegend.

Meskipun, jika Anda memulai dengan proyek bersih, dan tidak keberatan menggunakan grup, berikut ini dimungkinkan (melanjutkan dari blok kode awal):

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)

( Asumsikan tidak ada grup lain. ) Ini akan dijalankan dari konsol (atau skrip ScriptRunner , atau Plugin, atau dimuat ke konsol master baru) setelah lapisan ditambahkan. Ini akan membuat grup dengan nama yang dapat diurutkan, menambahkan layer ke grup yang benar, kemudian mengurutkan semuanya. Peringatan yang sama berlaku, seperti di atas.

Pemeriksaan lebih lanjut untuk indeks grup yang benar akan diperlukan untuk solusi yang lebih kuat ketika menambahkan layer baru ke proyek yang sudah ada dengan layer dan grup yang sudah dimuat.

dakcarto
sumber
Perubahan untuk menampilkan lapisan dalam urutan abjad baru saja digabungkan ke cabang master: github.com/qgis/QGIS/pull/4965
MatzFan