Mais

Copiar atributos da camada de ponto para a camada de cadeia de linha de memória PYQGIS

Copiar atributos da camada de ponto para a camada de cadeia de linha de memória PYQGIS


Eu empilhei um pouco com atributos de cópia.

Eu tenho uma camada de ponto criada a partir de um arquivo .csv. Para cada recurso nesta camada, estou criando uma nova geometria de polilinha na camada de memória. Não é possível adicionar atributos da camada de ponto à polilinha recém-criada.

Este é o meu código:

#mcvLayer - Camada de ponto nl = Create_layer ("New_line", "LineString") nl.show_layer hh = iface.activeLayer () a = QgsPoint (0,0) # Aqui haverá outro ponto para ponto em mcvLayer.dataProvider (). getFeatures (): pattrs = point.attributes () pgeom = point.geometry (). asPoint () nl.create_line (a, pgeom, pattrs) classe Create_layer (objeto): def __init __ (self, name, type): self. type = type self.name = name self.layer = QgsVectorLayer (self.type, self.name, "memory") self.pr = self.layer.dataProvider () def create_line (self, startpoint, endpoint, attributeelist): self .feat = QgsFeature () self.feat.setGeometry (QgsGeometry.fromPolyline ([startpoint, endpoint])) self.pr.addFeatures ([atributelist]) self.layer.updateExtents ()

Mas tudo que consigo é:

TypeError: QgsVectorDataProvider.addFeatures (lista-de-QgsFeature) -> (bool, lista-de-QgsFeature): o argumento 1 tem tipo inesperado 'lista'

Estou usando o QGIS 2.8.1


Você cria uma camada de memória sem campos. Para definir alguns atributos, você precisa dos campos correspondentes. Ao criar camadas de memória, você pode dar definições de campo como parte do tipo de argumento:

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

Para que sua camada funcione, você deve definir os mesmos campos da camada Ponto. Outra forma é adicionar atributos à camada de memória criada.

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

Então em iniciar():

def __init __ (self, name, type, fields): self.type = type self.name = name self.layer = QgsVectorLayer (self.type, self.name, "memory") self.layer.startEditing () para o campo em campos: self.layer.addAttribute (field) self.layer.commitChanges () self.pr = self.layer.dataProvider () QgsMapLayerRegistry.instance (). addMapLayer (self.layer) def create_line (self, startpoint, endpoint, lista de atributos ): feat = QgsFeature (fields) feat.setGeometry (QgsGeometry.fromPolyline ([startpoint, endpoint])) feat.setAttributes (attributeelist) self.pr.addFeatures ([feat]) self.layer.updateExtents ()

Espero que você tenha entendido.