我也很好奇,尽管存在其他一些层,但是在代码中指向特定的层名称是否会导致迭代错误?
下面是我的代码,请告诉我在哪里我应该进行更改吗?会发生什么变化?
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