在PyQGIS中按名称获取图层?


15

我有一个插件,可以找到城市列表的缓冲区,并提供距离。州和城市名称取自属性表,并进行相应过滤。我想要的是,我的插件应标识画布中该图层的层名称或顺序,而不管画布中是否存在其他图层,并从该图层访问相应的属性。

我也很好奇,尽管存在其他一些层,但是在代码中指向特定的层名称是否会导致迭代错误?

以下是我的代码,请告诉我应该在哪里进行更改,这将是什么更改?

    if dist and centerCity:
        #QMessageBox.information(self.dlg, "info", "both True")
        st = '"name" = \'' + centerCity + '\''
        exp = QgsExpression(st)
    else:
        QMessageBox.warning(self.dlg, "Enter the distance","Enter the distance and try again.")        
        return          #terminate the function

    layer = self.iface.activeLayer() 
    it = layer.getFeatures(QgsFeatureRequest(exp))
    feature = it.next()
    mbuf = feature.geometry().buffer(dist, 2)       

    iterFeat = layer.getFeatures()

    for f in iterFeat:
        geom2 = f.geometry()
        valTest = QgsGeometry.within(geom2, mbuf)

Answers:


41

更新:10.04.2018

使用QGIS 3.x,您可以通过以下mapLayersByName方式使用QgsProject类中的方法:

layers = QgsProject.instance().mapLayersByName('my layer name')

由于QGIS中的“图层”面板中可以有多个具有相同名称的图层,因此上述方法为您提供了匹配图层的列表。


对于QGIS 2.x

您只需要确保您的图层具有可以区别于其他名称的名称即可。代替layer = self.iface.activeLayer(),执行以下操作:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.name() == "YOUR_LAYER_NAME":
        layer = lyr
        break

如果您不信任图层名称(毕竟,用户可以随时更改它的名称),则可以尝试检查图层源。如果您的图层是Shapefile,则可以通过以下方式检查Shapefile的路径:

layer=None
for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
    if lyr.source() == "/path/to/shapefile.shp":
        layer = lyr
        break

编辑:正如@Jakob在评论中指出的,您可以在一行中编写第一个块:

layerList = QgsMapLayerRegistry.instance().mapLayersByName("YOUR_LAYER_NAME")

要么:

layerList = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "YOUR_LAYER_NAME"]

无论如何,您需要layerList在访问第一个元素之前检查它是否为空:

if layerList: 
    layer = layerList[0]

2
打印[如果lyr.name()==“ LAND”,则QgsMapLayerRegistry.instance()。mapLayers()。values()中lyr的lyr] [0] .name()
Jakob

7
层= QgsMapLayerRegistry.instance()。mapLayersByName(“ mylayername”)[0]
Jakob

为什么layer = none在代码的开头设置?似乎没有必要,尤其是如果它在功能中
user32882 '18

1
这是默认值,因为for中有一个if。如果if从未满足,则for之后的层将根本不存在。因此,仅确保您以后可以读取layer变量。
赫尔曼·卡里略
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.