I have the following PyQGIS script with QGIS 3 that tries to ask for a layer, add a new field in that layer and modify the value of this field. But the code doesn't work. I get either Seems there is no valid script in the file when I use layer = QgsVectorLayer(Layer)
or AttributeError: 'NoneType' object has no attribute 'isValid' when I use QgsProcessingUtils.mapLayerFromString
:
##Layer=vector
context = QgsProcessingContext()
layer= QgsProcessingUtils.mapLayerFromString(Layer, context)
layer.startEditing()
if layer.dataProvider().fieldNameIndex("new_col_name") == -1:
layer.dataProvider().addAttributes([QgsField("new_col_name", QVariant.String)])
layer.updateFields()
id_new_col= feuilles.dataProvider().fieldNameIndex("new_col_name")
for feature in layer.getFeatures():
column_value= feature["column"]
... some operations ...
layer.changeAttributeValue(feature.id(), id_new_col, new_column_value)
layer.commitChanges()
-
Are you creating a processing script? In QGIS 3.x the Python interface has been redesigned. See gis.stackexchange.com/questions/282773/…Zoltan– Zoltan2019年01月10日 16:17:10 +00:00Commented Jan 10, 2019 at 16:17
1 Answer 1
Not sure how to prompt for a layer, but working code below (with a shapefile) uses the currently selected layer. Note that the new field name was shortened due to name length constraints on shapefiles.
layer = iface.mapCanvas().currentLayer()
layer.startEditing()
if layer.dataProvider().fieldNameIndex("new_col_na") == -1:
layer.dataProvider().addAttributes([QgsField("new_col_na", QVariant.String)])
layer.updateFields()
id_new_col= layer.dataProvider().fieldNameIndex("new_col_na")
for feature in layer.getFeatures():
layer.changeAttributeValue(feature.id(), id_new_col, "val")
layer.commitChanges()
-
If I want to add a specific column to selected layers only in Qgis?MapQuest– MapQuest2022年07月21日 12:45:22 +00:00Commented Jul 21, 2022 at 12:45