[Qgis-developer] how to add a new field to an existing layer?

Ricardo Filipe Soares Garcia da ricardo.garcia.silva at gmail.com
Tue Aug 10 19:53:10 EDT 2010


Oh... nevermind. I just realized after sending the previous e-mail
that I had a typo in my code (was calling the ChangeAttributeValues
method with a capital C in the beginning).
Please excuse the noise, and thanks Martin for your help :)

On Wed, Aug 11, 2010 at 12:49 AM, Ricardo Filipe Soares Garcia da
<ricardo.garcia.silva at gmail.com> wrote:
> Hi Martin, list
>
> I did as you recommended, but now I'm getting the following error:
>
> Traceback (most recent call last):
>  File "/home/ricardo/.qgis/python/plugins/ChannelFromPoints/ChannelFromPointsDialog.py",
> line 41, in accept
>    self.callbackFunction(pLayer, params)
>  File "/home/ricardo/.qgis/python/plugins/ChannelFromPoints/ChannelFromPoints.py",
> line 119, in calculate_channel
>    provider.ChangeAttributeValues(values)
> TypeError: 'Capability' object is not callable
>
> My revised code:
>
>
> provider = pointLayer.dataProvider()
> newField = QgsField("channel", QVariant.Double)
> provider.addAttributes([newField])
> newFieldIndex = provider.fieldNameIndex(newField.name())
> #more code
> allAttrs = provider.attributeIndexes()
> provider.select(allAttrs)
> feat = QgsFeature()
> while provider.nextFeature(feat):
>    # more code, calculating the value of the 'channelValue' variable
>    values = {feat.id() : {newFieldIndex: QVariant(channel)}}
>    provider.ChangeAttributeValues(values)
>
>
> Do you have some insight on this error? Thanks for you help
>
> On Tue, Aug 10, 2010 at 9:55 PM, Martin Dobias <wonder.sk at gmail.com> wrote:
>> Hi Ricardo
>>
>> On Mon, Aug 9, 2010 at 2:50 PM, Ricardo Filipe Soares Garcia da
>> <ricardo.garcia.silva at gmail.com> wrote:
>>> Hello list
>>>
>>> How can I add a new field to an existing layer and insert some new
>>> values in it? In the following example, pointLayer refers to an
>>> existing layer, previously created using the memory provider. This
>>> code is creating the new field, but I cannot insert the values in it.
>>> Although it runs without any error, when I look at the layer's
>>> attribute table, the new field is there, but every feature has it as
>>> NULL.
>>
>> The problem is that in your code you only modify a local copy of the
>> data - your change is not propagated to the provider. To actually
>> modify the data, use something like this:
>>
>> values = { fid : { attr_1 : QVariant(value_1), attr_2 :
>> QVariant(value_2) }, ... }
>> provider.changeAttributeValues( values )
>>
>> You pass the provider a dictionary where keys are feature IDs, values
>> are dictionaries of changed attributes (key = attribute index, value =
>> new attribute value).
>>
>>> By the way, I think this kind of operation would be a nice thing
>>> to go into the pyqgis cookbook
>>
>> Sure, it just needs some time :-)
>>
>> Regards
>> Martin
>>
>
>
>
> --
> ___________________________ ___ __
> Ricardo Garcia Silva
>



-- 
___________________________ ___ __
Ricardo Garcia Silva


More information about the Qgis-developer mailing list