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

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

下面是我的代码,请告诉我在哪里我应该进行更改吗?会发生什么变化?

    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)


#1 楼

更新: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]


评论


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

–雅各布
15年2月26日在14:08

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

–雅各布
15年6月17日在9:09

为什么在代码开头设置layer = none?似乎没有必要,尤其是在功能上

–user32882
18 Sep 12'在5:02

这是默认值,因为for中有一个if。如果if从未满足,则for之后的层将根本不存在。因此,仅确保您以后可以读取layer变量。

–盖尔曼·卡里略(GermánCarrillo)
18-09-14在1:19