Sắp xếp các lớp trong bảng nội dung của QGIS?


12

Khi tôi tải một loạt các lớp vào QGIS từ PostGIS, chúng dường như tải theo thứ tự bảng chữ cái ngược.

Có công cụ hay plugin nào cho phép bạn nhanh chóng sắp xếp TOCIS theo thứ tự khác không? Ví dụ tôi có thể nghĩ ra một vài lựa chọn mà người ta có thể muốn:

  1. Sắp xếp các lớp theo hình học, trong đó các điểm nằm trên cùng, sau đó là các đường thẳng, polys và raster.
  2. Sắp xếp các lớp theo tên (bảng chữ cái, bảng chữ cái ngược).
  3. Sắp xếp đầu tiên theo hình học, sau đó theo tên. Đây sẽ là sự kết hợp của # 1 & # 2. Các lớp điểm được sắp xếp lên trên cùng (giống như # 1), nhưng sau đó các lớp điểm được sắp xếp theo thứ tự abc (điểm-a, điểm-b, điểm-c, v.v.).

Khi tải một số lượng lớn các lớp, điều này sẽ giúp nhanh chóng xây dựng đúng thứ tự cho sản xuất bản đồ.


Ý tưởng rất hay! Tôi không nghĩ rằng có bất kỳ plugin nào để thực hiện một nhiệm vụ như vậy (nếu python đủ tôi có thể làm việc với nó, nhưng tôi tin rằng điều này là phức tạp). Có lẽ bạn có thể thực hiện một yêu cầu tính năng cho nhóm nhà phát triển QGIS.
Curlew

1
Tôi đã đăng một yêu cầu tính năng cho chức năng này.
RyanKDalton

Câu trả lời:


6

Khi tôi tải một loạt các lớp vào QGIS từ PostGIS, chúng dường như tải theo thứ tự bảng chữ cái ngược.

Đây có vẻ là một lỗi (ngay cả trong nhánh chính) khi sử dụng hành động thêm lớp Thêm lớp PostGIS ... và phải được báo cáo trên trình theo dõi lỗi của QGIS . Tuy nhiên, nếu bạn sử dụng trình duyệt mới để tải các lớp PostGIS, chúng sẽ không bị đảo ngược. Trình quản lý DB mới không cho phép nhiều lựa chọn các bảng, do đó không có vấn đề gì ở đó (ngoài việc thiếu nhiều lựa chọn).

Có công cụ hay plugin nào cho phép bạn nhanh chóng sắp xếp TOCIS theo thứ tự khác không? Ví dụ tôi có thể nghĩ ra một vài lựa chọn mà người ta có thể muốn:

2) Sắp xếp các lớp theo tên (bảng chữ cái, bảng chữ cái ngược).

Điều này hiện có thể được thực hiện bằng cách sử dụng cột gốc hoặc sắp xếp mục của lớp cơ sở của QssLegend ( QTreeWidget ). Điều này sẽ sắp xếp TẤT CẢ CÁC MẶT HÀNG, cả hai lớp và các nhóm với nhau, không phải các nhóm được nhóm ở trên hoặc dưới các lớp cấp cao nhất. Nó cũng sẽ sắp xếp trong các nhóm. KHÔNG CÓ UNDO sắp xếp như thế này.

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)

Hãy cẩn thận: Nếu chú giải chính cũng kiểm soát thứ tự kết xuất lớp (mặc định), điều này sẽ hoạt động tốt. Nếu tiện ích dock Thứ tự lớp được sử dụng riêng để kiểm soát thứ tự kết xuất, thì thứ tự sắp xếp trong chú giải không được thực hiện và thao tác sắp xếp sau có thể dẫn đến kết quả không mong muốn (tiếp tục từ trên):

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

Từ mã này, bạn có thể thấy rằng danh sách Thứ tự lớp là QListWidget , không phải là QTreeWidget, có nghĩa là sắp xếp sẽ KHÔNG tính đến bất kỳ nhóm nào. Tất cả các lớp được trình bày trong một danh sách phẳng, như thể chúng đều là cấp cao nhất. Vì vậy, bất kỳ lớp nào hiện được lồng trong các nhóm có thể sắp xếp bên dưới các lớp cấp cao nhất, nếu bạn áp dụng mã sắp xếp ở trên cho QListWidget.

1) Sắp xếp các lớp theo hình học, trong đó các điểm nằm trên cùng, sau đó là các đường thẳng, polys và raster.

3) Sắp xếp đầu tiên theo hình học, sau đó theo tên. Đây sẽ là sự kết hợp của # 1 & # 2. Các lớp điểm được sắp xếp lên trên cùng (giống như # 1), nhưng sau đó các lớp điểm được sắp xếp theo thứ tự abc (điểm-a, điểm-b, điểm-c, v.v.).

Hiện tại, bằng cách sử dụng Python, có chức năng giới hạn để thao tác QssLegend. Có QSSLegendInterface nhưng điều này không có tất cả các tính năng có trong QssLegend , QssLegendLayer , QSSLegendItem được kế thừa hoặc bất kỳ lớp nào khác được liên kết với QgsLegend.

Mặc dù, nếu bạn đang bắt đầu với một dự án sạch và không ngại sử dụng các nhóm, hiện tại có thể thực hiện được (tiếp tục từ khối mã ban đầu):

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)

( Giả sử không có nhóm nào khác tồn tại. ) Điều này sẽ được chạy từ bảng điều khiển (hoặc tập lệnh ScriptRunner hoặc Plugin hoặc được tải vào bảng điều khiển mới trong tổng thể) sau khi các lớp được thêm vào. Nó sẽ tạo các nhóm với các tên có thể sắp xếp, thêm các lớp để sửa các nhóm, sau đó sắp xếp toàn bộ. Cùng cảnh báo áp dụng, như trên.

Cần kiểm tra thêm cho các chỉ số nhóm chính xác cho một giải pháp mạnh mẽ hơn khi thêm các lớp mới vào một dự án hiện có với các lớp và các nhóm đã được tải.


Một thay đổi để hiển thị các lớp theo thứ tự chữ cái vừa được sáp nhập vào nhánh chính: github.com/qgis/QGIS/pull/4965
MatzFan
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.