[英]How to remove all layers *except* some specific ones in pyqgis?
I need to load several vector layers for my QGIS project, so that I test every function of my script in every one of them.我需要为我的 QGIS 项目加载几个矢量图层,以便我在每个矢量图层中测试我的脚本的每个功能。 However, in the end I want to work only with one or two layers of interest and discard the others, so I would like to do that automatically.
但是,最后我只想处理一两层感兴趣的层而丢弃其他层,所以我想自动执行此操作。
I did that successfully with some layers, but there is one layer that is causing me problems and I haven't figured out why.我在一些层上成功地做到了这一点,但是有一层给我带来了问题,我还没有弄清楚原因。
Here's some code:这是一些代码:
Loading layers (these shouldn't be the problem almost for sure):加载层(这些几乎肯定不是问题):
a2 = iface.addVectorLayer(path + ardida2, "", "ogr")
if not a2:
print("Layer failed to load!")
a3 = iface.addVectorLayer(path + ardida3, "", "ogr")
if not a3:
print("Layer failed to load!")
Now this is the function I've created to delete all of the loaded layers except the ones that I want to work with.现在这是我创建的函数,用于删除所有加载的图层,除了我想要使用的图层。 The
prints
where only because I was trying to understand the problem. prints
地方只是因为我试图理解这个问题。
def RemoveAllLayersExcept(*layers):
layer_ids = []
for l in layers:
layer_ids.append(l.id())
print('layer_ids', layer_ids)
for lyr in QgsProject.instance().mapLayers():
print(lyr)
if lyr not in layer_ids:
print('not')
QgsProject.instance().removeMapLayer(lyr)
else:
pass
Then I created a new layer - the one that is causing me problems.然后我创建了一个新层——那个给我带来了问题的层。 I need to edit this layer in an iterative process later.
稍后我需要在迭代过程中编辑此图层。 I followed a step-by-step example in OpenSourceOptions tutorial titled PyQGIS: Create a Shapefile :
我在名为PyQGIS: Create a Shapefile 的OpenSourceOptions 教程中遵循了一个分步示例:
# OPENSOURCEOPTIONS TUTORIAL - PYQGIS: Create a Shapefile
# create fields
layerFields = QgsFields()
layerFields.append(QgsField('ID', QVariant.Int))
layerFields.append(QgsField('Value', QVariant.Double))
layerFields.append(QgsField('Name', QVariant.String))
# Now define the file path for the new shapefile
# Note: the CRS used here is NAD 1983 UTM Zone 11 N
fn = 'D:/Sara/Trabalho/QGIS/pnogas/fireball_points.shp'
writer = QgsVectorFileWriter(fn, 'UTF-8', layerFields, QgsWkbTypes.Point,QgsCoordinateReferenceSystem('EPSG:26912'), 'ESRI Shapefile')
# For each feature we need to set the geometry (in this case a point)
# set the attribute values, then add it to the vector layer.
feat = QgsFeature() # create an empty QgsFeature()
feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(cx14, cy14))) # create a point and use it to set the feature geometry
feat.setAttributes([1, 1.1, 'one']) # set the attribute values
writer.addFeature(feat) # add the feature to the layer
layer_fireball = iface.addVectorLayer(fn, '', 'ogr')
if not layer_fireball:
print("Layer failed to load!")
del(writer)
Then I remove the layers don't interest me:然后我删除我不感兴趣的图层:
RemoveAllLayersExcept(layer, layer_fireball)
And this is it.就是这样。 When I run the program for the first time, nothing happens.
当我第一次运行程序时,没有任何反应。 Here's what I get:
这是我得到的:
layer_ids ['COS2018_ardida2018_3_clip_cbf56f4b_e668_4c2e_9259_7d22d5943097', 'fireball_points_f92b32e0_f8bf_42c1_95e6_b317ddf6ee84']
COS2018_ardida2018_2_clip_45b241c4_fb9b_4654_9916_5ff08514c559
not
COS2018_ardida2018_3_clip_cbf56f4b_e668_4c2e_9259_7d22d5943097
fireball_points_f92b32e0_f8bf_42c1_95e6_b317ddf6ee84
which is in accordance to what I was expecting.这符合我的预期。 But in a second and n-th times, I get:
但在第二次和第 n 次,我得到:
Layer failed to load!
Traceback (most recent call last):
File "C:\PROGRA~1\QGIS3~1.10\apps\Python37\lib\code.py", line 90, in runcode
exec(code, self.locals)
File "<input>", line 1, in <module>
File "<string>", line 676, in <module>
File "<string>", line 104, in RemoveAllLayersExcept
AttributeError: 'NoneType' object has no attribute 'id'
Can you detect where the problem is?你能发现问题出在哪里吗? Why this error?
为什么会出现这个错误? And why does it happen only from the 2nd run on?
为什么它只从第二次运行开始?
Thanks!谢谢!
Change RemoveAllLayersExcept
method like below:更改
RemoveAllLayersExcept
方法,如下所示:
def RemoveAllLayersExcept(*keep_layers):
layers = QgsProject.instance().mapLayers().values()
will_be_deleted = [l for l in layers if l not in keep_layers]
for layer in will_be_deleted:
QgsProject.instance().removeMapLayer(layer)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.