简体   繁体   English

如何删除所有图层*除了*pyqgis中的某些特定图层?

[英]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.

相关问题 如何将除少数特定列之外的所有列转换为小写? - How to convert to lowercase all columns except a few specific ones? 如何使用 python 中的正则表达式删除除某些特殊字符外的所有特殊字符 - How to remove all special characters except for some, using regex in python 如何获取属于Python 3中特定类的所有属性(继承的属性除外)的值 - How to get values of all properties (except inherited ones) that belong to specific class in Python 3 删除所有数字,除了使用 python regex 组合成字符串的数字 - Remove all numbers except for the ones combined to string using python regex 如何删除文件中除第一个字符外的所有行? - How to remove all lines in a file containing a specific character except for the first? python:如何获取数组中除条件以外的所有成员 - python: how to get all members of an array except for ones that match a condition 如何查询所有 model 对象,除了已经在另一个 model 中的对象? - How to query all model objects except the ones that already are in another model? 如何打印所有已定义的变量,除了等于0的变量 - Python3 - How to print all defined variables except for the ones that are equal to 0 - Python3 如何缩放除 pandas dataframe 中的某些列之外的所有列? - How to scale all columns except certain ones in pandas dataframe? 如何删除DataFrame中除某些列外的所有列? - How to delete all columns in DataFrame except certain ones?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM