[GIS] PyQGIS – Adding Fields to a Feature Layer

featuresfields-attributespyqgis

I'm new to PyQGIS and am having difficulty adding fields to a feature. I want to plot footprints and assign attributes to each of the footprints. Here is my script.

import csv, ast
from PyQt4.QtCore import QFileInfo, QVariant

fileName = 'C:\\directoryname\\temp.csv'
layer = QgsVectorLayer('Polygon?crs=EPSG:4326', 'poly', 'memory')
pr = layer.dataProvider()
attr = pr.addAttributes([QgsField('Object_ID', QVariant.String)])
poly = QgsFeature()
with open(fileName) as f:
    rows = csv.DictReader(f)
    for row in rows:
        shape = ast.literal_eval(row['footprint'])
        points = []
        for i in range(0,len(shape['coordinates'][0])):
            points.append(QgsPoint(shape['coordinates'][0][i][0],(shape['coordinates'][0][i][1])))
        poly.setGeometry(QgsGeometry.fromPolygon([points]))
        poly.setAttribute('Object_ID', row['object_id'])
        pr.addFeatures([poly])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])
print "Completed!!!"

I receive the error

File "c:/directoryname/tmp9urit7.py", line 19, in

poly.setAttribute('Object_ID', row['object_id']) KeyError: 'Object_ID'

When I add the line caps_string = layer.dataProvider().capabilitiesString(), then printing caps_string yields that I have full privileges to add, modify, and delete features and attributes.

Also, when I print attr, the result is True.

If I comment out the line poly.setAttribute('Object_ID', row['object_id']), the script plots the footprints and completes without error, but I have no attributes for any of the footprints.

What am I doing wrong?

Best Answer

As out turns out, there were problems in the script. First, as @artwork21 pointed out, layer.updateFields() needed to be added update the fields in the layer. In addition, the fields also needed to be set in the features within the layer.

fields = layer.pendingFields()
poly.setFields(fields, True)

Here is the updated script:

import csv, ast
from PyQt4.QtCore import QFileInfo, QVariant

fileName = 'C:\\directoryname\\temp.csv'
layer = QgsVectorLayer('Polygon?crs=EPSG:4326', 'poly', 'memory')
pr = layer.dataProvider()
attr = pr.addAttributes([QgsField('Object_ID', QVariant.String)])
layer.updateFields()
poly = QgsFeature()
fields = layer.pendingFields()
poly.setFields(fields, True)
with open(fileName) as f:
    rows = csv.DictReader(f)
    for row in rows:
        shape = ast.literal_eval(row['footprint'])
        points = []
        for i in range(0,len(shape['coordinates'][0])):
            points.append(QgsPoint(shape['coordinates'][0][i][0],(shape['coordinates'][0][i][1])))
        poly.setGeometry(QgsGeometry.fromPolygon([points]))
        poly.setAttribute('Object_ID', row['object_id'])
        pr.addFeatures([poly])
layer.updateExtents()
QgsMapLayerRegistry.instance().addMapLayers([layer])
print "Completed!!!"