Lặp lại các lớp bản đồ trong QGIS Python?


30

Tôi gặp khó khăn khi tìm cách lặp lại trên các lớp bản đồ. Tôi có thể truy cập lớp hiện được tô sáng trong mục lục thông qua iface.activeLayer()nhưng tôi muốn mã của mình hoạt động trên tất cả các lớp.

Tôi không thấy bất cứ điều gì trong API cung cấp quyền truy cập dễ dàng vào chức năng này và không thể tìm thấy một ví dụ trực tuyến tốt nhưng có lẽ tôi đã bỏ lỡ điều gì đó?


Tôi không thấy các bạn đang sử dụng QssMapLayerRegistry hoặc QssProject. Trong QGIS 3.0.2, điều này không hoạt động. Tuy nhiên, iface.mapCanvas (). Layer () hiện. Vâng, loại. Nó dường như chỉ cung cấp cho bạn các lớp hoạt động (những lớp bạn đã kiểm tra trong ngăn Lớp). Có ai biết làm thế nào để có được danh sách tất cả các Lớp, ngay cả những người không được chọn trong ngăn Lớp không? Ngoài ra, nếu sử dụng Plugin Builder, nó sẽ tạo vỏ cho plugin của bạn. Hàm run có tham số "self", cần sử dụng iface. tức là self.iface.mapCanvas (). layer (), chỉ fyi.
ajpieri

Câu trả lời:


24

Thử...

# substitute 'self' with 'qgis.utils.iface' when run from Python console
# 'self.iface = iface' would usually precede this command in your class 
layers = self.iface.legendInterface().layers()

for layer in layers:
    layerType = layer.type()
    if layerType == QgsMapLayer.VectorLayer:
        # do some stuff here

Được lưu trữ từ hợp nhất từ plugin QConsolidate .

Mô tả về đối tượng QssLegendInterface được trả về từ LegendInterface ().

Chỉnh sửa : thêm thông tin về 'tự' ở trên.


Cảm ơn! Điều đó đã lừa Tôi đoán tôi đã quá quen với thế giới ESRI trong đó huyền thoại là đối tượng trong bố cục bản đồ và mục lục đề cập đến danh sách các lớp.
spencerrecneps

2
Lưu ý rằng có một sự khác biệt trong những gì được trả về giữa kỹ thuật này và kỹ thuật mapCanvas () mà Nathan đề cập. Đối tượng LegendInterface () sẽ trả về tất cả các lớp, ngay cả khi chúng không được hiển thị trong khung vẽ bản đồ, trong khi mapCanvas () chỉ trả về những lớp được hiển thị trên khung vẽ. Sử dụng mapCanvas () là một cách nhanh chóng, tốt đẹp để có được một tham chiếu đến các lớp có thể nhìn thấy.
dakcarto

1
Một lưu ý khác, các phiên bản mới nhất của QGIS (> = 1.8) cho phép người dùng xác định thứ tự kết xuất các lớp riêng biệt với thứ tự được liệt kê trong chú giải (rất hay!). Các phương thức LegendInterface () và mapCanvas () trả về thứ tự lớp cho mỗi thứ tương ứng.
dakcarto

19

Ngoài ra còn có hai cách khác:

layers = self.iface.mapCanvas().layers()

sẽ cung cấp cho bạn một danh sách các lớp

hoặc là

layers = QgsMapLayerRegistry.instance().mapLayers()

for name, layer in layers.iteritems():
     print name, layer.type()

Câu trả lời này dường như không hoạt động trong 2.16và trên
raphael

10

Đối với QGIS 2.6 ở đây là mã để xác định từng lớp và nhóm chúng:

#make the desired groups for layers
toc = self.iface.legendInterface()
root = QgsProject.instance().layerTreeRoot()
group1 = root.insertGroup(0, "Group Point")
group2 = root.insertGroup(1, "Group Line")
group3 = root.insertGroup(2, "Group Polygon")
#get the list of layers  from registry
layers = QgsMapLayerRegistry.instance().mapLayers()
#segregate layers into groups 
for name, layer in layers.iteritems():
    # check the layer geometry type 
    if layer.geometryType() == QGis.Point:
        toc.moveLayer(layer, 0)

    if layer.geometryType() == QGis.Line:
        toc.moveLayer(layer, 1)

    if layer.geometryType() == QGis.Polygon:
        toc.moveLayer(layer, 2)

Lưu ý: Sau khi nhóm tôi phải loại bỏ lớp trùng lặp để tôi sử dụng root.removeLayer(lyr).


9

Đối với QGIS 3, QgsMapLayerRegistrychức năng của đã được chuyển sang QgsProject.

Vì vậy, để lặp lại qua các lớp bản đồ, bạn nên sử dụng cấu trúc đó:

layers = QgsProject.instance().mapLayers()

.mapLayers()trả về một từ điển có cấu trúc như {layer_x_id: layer_x, layer_y_id: layer_y, ....}. Sau đó, bạn có thể lặp qua các lớp như:

for layer_id, layer in layers.items():
    print(layer.name())

.mapLayers()trả về một từ điển ( dict), bạn cũng có thể sử dụng .values()phương thức từ điển chỉ trả về một từ listcó chứa các lớp trong trường hợp đó. Sau đó, bạn có thể lặp qua các lớp như:

layers = QgsProject.instance().mapLayers().values()

for layer in layers:
    print(layer.name())

Nếu bạn thích, bạn có thể lặp lại theo cách này:

layers = QgsProject.instance().mapLayers() # dictionary

for layer in layers.values():
    print(layer.name())

Chào! Cảm ơn đã chia sẻ nó. Để in tên của các lớp hoạt động tốt ... nhưng tôi không thể in các phím của từ điển. Bạn có thể giúp tôi với đó?
caio Villaca

1
for layer in layers: print(layer)Bạn có thể sử dụng tập lệnh để in các phím. Hoặc chỉ sử dụng print(layers.keys())mà không cần forvòng lặp.
Kadir ahbaz
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.