Saturday, 5 October 2019

python - How to copy attribute values of fields in selected features of one layer to another Qgis programmatically?


I am trying to get the values of attributes of the selected features of a layer field by field and copy to another layer that I created in qgis with pyqgis.


Is here a example for this. Every example I found leaded me to the dead end.



Answer



OK so you want to know how to generate polygons centered on selected points in pyQGIS and retain all the attributes of the points in the new polygons? Here's a script to do that: Note that the code was written to apply to a points-containing example shape file I have. You need to remove the section which reads in my example file in order for it to use your 'selected' points features. note also that the result will be better if your layer is in a 'projected' projection such as UTM and not in lat/lon.


Finally, I need to reference the source for the polygon generator code: https://stackoverflow.com/questions/23411688/drawing-polygon-with-n-number-of-sides-in-python-3-2


import os
from PyQt4.QtCore import QSettings

import math

def polygon_generator(sides, radius=1, rotation=0, translation=None):
one_segment = math.pi * 2 / sides

points = [
(math.sin(one_segment * i + rotation) * radius,
math.cos(one_segment * i + rotation) * radius)
for i in range(sides)]


if translation:
points = [[sum(pair) for pair in zip(point, translation)]
for point in points]
QGisPoints=[]

for point in points:
QGisPoints.append(QgsPoint(point[0],point[1]))

return QGisPoints


############OPEN A FILE AND SELECT POINTS ################
#Header to open a file, select the layer, then select all the objects in that layer
point_file_name="building_pnt.shp"
point_file_folder=r"G:\GARMIN\testshapes\AW30"
point_file_path=os.path.join(point_file_folder,point_file_name)
input_layer = QgsVectorLayer(point_file_path, "input layer", "ogr")
input_layer_data_provider=input_layer.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(input_layer)
QGisWKBType=input_layer_data_provider.geometryType()
qgis.utils.iface.setActiveLayer(input_layer)

qgis.utils.iface.zoomToActiveLayer()
input_layer.selectAll()
###################################################

#get active layer
input_layer=qgis.utils.iface.mapCanvas().currentLayer()

#Get/set layer type for new memory layer
QGisLayerType="Polygon"
EPSG_code=int(input_layer_data_provider.crs().authid().split(":")[1])


#Create destination layer in memory
s = QSettings()
oldValidation = s.value( "/Projections/defaultBehaviour")
s.setValue( "/Projections/defaultBehaviour", "useGlobal" )
destination_layer=QgsVectorLayer(QGisLayerType+"?crs=epsg:"+str(EPSG_code)+"index=yes","memory layer","memory")
destination_layer.setCrs( QgsCoordinateReferenceSystem(EPSG_code, QgsCoordinateReferenceSystem.EpsgCrsId) )
s.setValue( "/Projections/defaultBehaviour", oldValidation )
destination_layer_data_provider=destination_layer.dataProvider()
QgsMapLayerRegistry.instance().addMapLayer(destination_layer)


#Generate attributes in destination layer
input_layer_attrib_names = input_layer.dataProvider().fields()
oldattributeList = input_layer.dataProvider().fields().toList()
newattributeList=[]
for attrib in oldattributeList:
if destination_layer.fieldNameIndex(attrib.name())==-1:
newattributeList.append(QgsField(attrib.name(),attrib.type()))
destination_layer_data_provider.addAttributes(newattributeList)
destination_layer.updateFields()


#Read in features and generate n-sided polygons with matched attributes
destination_layer.startEditing()
cfeature = QgsFeature()
polygon_radius=5
polygon_rotation=0
sides=8

for xfeature in input_layer.selectedFeatures():
#for xfeature in input_layer.getFeatures()

cfeatures=[]
xgeometry = xfeature.geometry()
xval=xgeometry.asPoint().x()
yval=xgeometry.asPoint().y()

translation=[xval,yval]
my_polygon=polygon_generator(sides,polygon_radius, polygon_rotation, translation)

new_geom=QgsGeometry.fromPolygon( [ my_polygon ] )
cfeature_Attributes=[]

cfeature_Attributes.extend(xfeature.attributes())
cfeature.setGeometry(new_geom)
cfeature.setAttributes(cfeature_Attributes)
cfeatures.append(cfeature)
destination_layer_data_provider.addFeatures(cfeatures)
destination_layer.commitChanges()

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...