遍历QGIS Python中的地图图层?


30

我在弄清楚如何遍历地图图层时遇到麻烦。我可以通过以下方式访问目录中当前突出显示的图层,iface.activeLayer()但我希望我的代码在所有图层上均可使用。

我在API中看不到任何可轻松访问此功能的东西,找不到很好的在线示例,但也许我错过了什么?


我看不到你们如何使用QgsMapLayerRegistry或QgsProject。在QGIS 3.0.2中,这不起作用。但是,iface.mapCanvas()。layers()可以。好吧,有点。它似乎只为您提供活动的图层(您在“图层”窗格中检查的图层)。有谁知道如何获取所有图层的列表,甚至包括“图层”窗格中未选中的那些列表?另外,如果使用Plugin Builder,它会为您创建插件的外壳。运行功能具有“ self”参数,使用iface时需要使用该参数。即self.iface.mapCanvas()。layers(),仅供参考。
ajpieri

Answers:


24

尝试...

# 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

从剔除的consolidatethread.pyQConsolidate插件

从legendInterface()返回的QgsLegendInterface对象的描述。

编辑:在上面添加了关于“自我”的信息。


谢谢!做到了。我想我也已经习惯了ESRI世界,其中图例是地图布局中的对象,而目录是指图层列表。
spencerrecneps 2012年

2
请注意,此方法与Nathan提到的mapCanvas()技术之间返回的内容有所不同。legendInterface()对象将返回所有图层,即使它们未在地图画布中显示,而mapCanvas()仅返回在画布上显示的图层。使用mapCanvas()是一种获取可见图层引用的好方法。
dakcarto 2012年

1
另外,最新版本的QGIS(> = 1.8)允许用户定义层的渲染顺序,与图例中列出的顺序分开(非常好!)。legendInterface()和mapCanvas()方法分别返回每个图层的顺序。
dakcarto 2012年

19

还有两种其他方法:

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

会给你一个层列表

要么

layers = QgsMapLayerRegistry.instance().mapLayers()

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

这个答案似乎没有工作2.16及以上
拉斐尔

10

对于QGIS 2.6,下面是用于识别每个层并将其分组的代码:

#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)

注意:分组后,我必须删除重复的图层,因此我使用root.removeLayer(lyr)


9

对于QGIS 3,其QgsMapLayerRegistry功能已移至QgsProject

因此,要遍历地图图层,应使用以下结构:

layers = QgsProject.instance().mapLayers()

.mapLayers()返回结构为的字典{layer_x_id: layer_x, layer_y_id: layer_y, ....}。然后,您可以遍历以下层:

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

因为.mapLayers()返回字典(dict),所以您还可以使用.values()dictionary方法,该方法只返回list包含层的a 。然后,您可以遍历以下层:

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

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

如果愿意,可以通过以下方式进行迭代:

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

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

嗨!感谢分享。打印图层的名称效果很好...但是我无法打印字典的键。你能帮我吗?
caio villaca

1
for layer in layers: print(layer)您可以使用脚本来打印键。或仅使用print(layers.keys())for循环。
KadirŞahbaz
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.