Как удалить все слои * кроме * некоторых в pyqgis?
Мне нужно загрузить несколько векторных слоев для моего проекта QGIS, чтобы я тестировал каждую функцию моего скрипта в каждом из них. Однако, в конце концов, я хочу работать только с одним или двумя интересными слоями и отбрасывать остальные, поэтому я хотел бы сделать это автоматически.
Я успешно сделал это с некоторыми слоями, но есть один слой, который вызывает у меня проблемы, и я не понял, почему.
Вот код:
Загрузка слоев (это не должно быть проблемой почти наверняка):
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!")
Теперь это функция, которую я создал для удаления всех загруженных слоев, кроме тех, с которыми я хочу работать. В
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
Затем я создал новый слой - тот, который вызывает у меня проблемы. Позже мне нужно будет отредактировать этот слой итеративно. Я последовал пошаговому примеру в учебнике OpenSourceOptions под названием PyQGIS: Create a Shapefile:
# 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)
Потом убираю слои, которые меня не интересуют:
RemoveAllLayersExcept(layer, layer_fireball)
Вот и все. При первом запуске программы ничего не происходит. Вот что я получаю:
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
что соответствует тому, что я ожидал. Но через второй и 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'
Можете ли вы определить, в чем проблема? Почему эта ошибка? И почему это происходит только со 2-го пробега?
Благодаря!
1 ответ
+ Изменить
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)