QGIS Python – How to Create New Fields in Multiple Layers Using PyQGIS

field-calculatorpyqgispythonqgis

I have a number of line layers on which I need to perform the same task: add 4 columns with the start and end points of each line.

The expressions that I use to do this are:

$xat(0)
$xat(-1)
$yat(0)
$yat(-1)

However, I must create a new column and update it for every layer, but I am sure that it can be automated. Any ideas on how to perform the creation of 4 new columns on every layer in the layers panel in QGIS?

Best Answer

As mentioned in the comment, you could create a model from the Processing Toolbox but if you want to create a script, you could use the following which creates the start_lat field and updates it for each layer (comments are included which hopefully will help):

# Import required module to create field
from PyQt4.QtCore import QVariant

# For each layer in panel
for layer in QgsMapLayerRegistry.instance().mapLayers().values():
    # Add a real field (which uses decimal)
    layer.dataProvider().addAttributes( [ QgsField("start_lat", QVariant.Double) ] )
    # Update attribute table with new field
    layer.updateFields()
    # Begin editing of layer and finish loop with saving edits
    with edit(layer):
        # Let `idx` = field with name "start_lat"
        idx = layer.fieldNameIndex( "start_lat" )
        # Define expression
        e = QgsExpression( """ $x_at(0) """ )
        e.prepare( layer.pendingFields() )
        # For each feature in layer
        for f in layer.getFeatures():
            # Apply expression
            f[idx] = e.evaluate(f)
            # Update attribute table
            layer.updateFeature(f)

You could then repeat the above by adapting it to create the other 3 fields or extend the loops and create all 4 fields at once.