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

我在API中看不到任何可以轻松访问此功能的内容,并且找不到很好的在线示例,但也许我错过了一些东西?

评论

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

#1 楼

试试...

# 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


从QConsolidate插件的consolidatethread.py中删除。

从legendInterface()返回的QgsLegendInterface对象的描述。 />
编辑:在上方添加了有关“自我”的信息。

评论


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

– spencerrecneps
2012年5月26日23:53

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

– dakcarto
2012年5月27日下午2:00

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

– dakcarto
2012年5月27日在2:07

#2 楼

还有两种其他方法:

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


将为您提供层列表



layers = QgsMapLayerRegistry.instance().mapLayers()

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


评论


这个答案似乎在2.16及更高版本中不起作用

–拉斐尔
16 Dec 28 '21:27

#3 楼

对于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()方法,该方法仅返回包含图层的list在这种情况下。然后,您可以遍历以下层:

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
19年6月18日在18:39



对于层中的层:print(layer)您可以使用脚本来打印键。或者只使用print(layers.keys())而不进行for循环。

– KadirŞahbaz
19年6月18日在21:01



@Kadir大家好,我如何首先按组名在QGIS 3中的组层中进行迭代,然后再对该组中的nam层进行迭代?

–nmokht97
20 Jul 30'15:27



#4 楼

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