Suite

Copie d'attributs de la couche de points vers la couche de chaîne de ligne mémoire PYQGIS


J'ai empilé un peu avec des attributs de copie.

J'ai un calque de points créé à partir d'un fichier .csv. Pour chaque entité de cette couche, je crée une nouvelle géométrie Polyline dans la couche mémoire. Impossible d'ajouter des attributs de la couche de points à la polyligne nouvellement créée.

Voici mon code :

#mcvLayer - Point Layer nl = Create_layer("New_line", "LineString") nl.show_layer hh = iface.activeLayer() a = QgsPoint(0,0) # Voici un autre point pour point dans mcvLayer.dataProvider(). getFeatures() : pattrs = point.attributes() pgeom = point.geometry().asPoint() nl.create_line(a, pgeom, pattrs) classe Create_layer(object): def __init__(self,name,type): self. type = type self.name = nom self.layer = QgsVectorLayer(self.type, self.name, "memory") self.pr = self.layer.dataProvider() def create_line(self, startpoint, endpoint, attributelist): self .feat = QgsFeature() self.feat.setGeometry(QgsGeometry.fromPolyline([startpoint,endpoint])) self.pr.addFeatures([attributelist]) self.layer.updateExtents()

Mais tout ce que j'obtiens c'est :

TypeError: QgsVectorDataProvider.addFeatures(list-of-QgsFeature) -> (bool, list-of-QgsFeature): l'argument 1 a un type inattendu 'list'

J'utilise QGIS 2.8.1


Vous créez une couche mémoire sans aucun champ. Pour définir certains attributs, vous avez besoin des champs correspondants. Lors de la création de couches de mémoire, vous pouvez donner des définitions de champ dans le cadre du type d'argument :

self.layer = QgsVectorLayer(self.type+'?field_a:string(20)&field_b:int', self.name, "memory")

Pour que votre couche fonctionne, vous devez définir les mêmes champs que pour la couche Point. Une autre façon consiste à ajouter des attributs à la couche mémoire créée.

prov = mcvLayer.dataProvider() champs = prov.fields() nl = Create_layer("New_line", "LineString", champs)

Puis dans init():

def __init__(self, name, type, fields): self.type = type self.name = name self.layer = QgsVectorLayer(self.type, self.name, "memory") self.layer.startEditing() pour le champ dans champs : self.layer.addAttribute(field) self.layer.commitChanges() self.pr = self.layer.dataProvider() QgsMapLayerRegistry.instance().addMapLayer(self.layer) def create_line(self, startpoint, endpoint, attributelist ): feat = QgsFeature(fields) feat.setGeometry(QgsGeometry.fromPolyline([startpoint,endpoint])) feat.setAttributes(attributelist) self.pr.addFeatures([feat]) self.layer.updateExtents()

J'espère que vous avez l'idée.


Voir la vidéo: QGIS Python PyQGIS - Measure distance between features (Octobre 2021).