Sunday, 14 June 2015

qgis - Add the attributes of selected features to my new layer in PyQGIS


I am trying to create a layer from the selected points coordinates. I am drawing a circle to the coordinate of selected points. I also need to add initial attributes of my selected features to my new layer. I tried some examples but every time I failed. Can anyone help me with this. Need to add something before "provider.addFeatures( [feature] )"


def draw_circle_to_selected_coordinates(self):
"""

Gets the coordinate of selected features and draws the circles for desired radius in qgis
"""

#set active layer as layer
layer = utils.iface.activeLayer()
selected_features = layer.selectedFeatures()


#creating layer structure using selected layer fields.
fields = layer.pendingFields()

fields_in="Polygon?"
field_counter=1

for field in fields:
fields_in=fields_in+'field='+str(field.name())+ ':'+str(field.typeName())+'&'
field_counter+=field_counter


fields_in= fields_in+('field=Band:Double')



#creates new memory layer for radial bands with selected layer attributes
vpoly = QgsVectorLayer(fields_in, "RadialBand", "memory")
feature = QgsFeature()
provider = vpoly.dataProvider()
vpoly.startEditing()

#get band radiuses from the file
list=[]
f=open("radial_band.nodelete", "r")

with open('radial_band.nodelete') as openfileobject:
for line in openfileobject:
value=float(line.strip())
list.append(value)
f.close()

#filling radial band table with selected feature coordinates and desired radiuses
for f in selected_features:
geom = f.geometry()
x=float(geom.asPoint().x())

y=float(geom.asPoint().y())
item=0
for item in range(0, len(list)):
radius=list[item]
#draw circle to the selected coordinates and radius one by one
feature.setGeometry( QgsGeometry.fromPoint(QgsPoint(x,y)).buffer(radius,100))

#need to add something here to get the values from selected features and add the radius value to the Band field
provider.addFeatures( [feature] )
item+=item



vpoly.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(vpoly)

Answer



You can add an attribute field and get its id with:


res = provider.addAttributes( [ QgsField("RADIUS", QVariant.Float) ] )
RADIUS_idx = vlayer.fieldNameIndex('RADIUS')

If, as you requested, want to set up all the attributes BEFORE you add the feature you need to know all the attributes in advance then create them with:



feature.setAttributes([attrib_id0_val,attrib_id1_val, attrib_id2_val ...])

However I think you might prefer to subsiquently alter some attributes after feature creation with:


fid=feature.id()
attrs = { RADIUS_idx : RADIUS_value}
provider.changeAttributeValues({ fid : attrs })

No comments:

Post a Comment

arcpy - Changing output name when exporting data driven pages to JPG?

Is there a way to save the output JPG, changing the output file name to the page name, instead of page number? I mean changing the script fo...