9 votos

¿Cómo crear una capa de memoria y rellenar los campos?

Parece una operación básica usando PyQGIS pero no veo lo que me falta. Quiero crear una capa de memoria con las mismas características y atributos de un shapefile. He mirado varios posts como:

El siguiente script crea una capa de memoria, obtiene los campos correctos y el número correcto de características pero no rellena los campos con datos:

input = "C:/Users/Me/Desktop//example.shp"
layer = QgsVectorLayer(example,"line","ogr")

temp = QgsVectorLayer("LineString?crs=epsg:4326", "result", "memory")
temp_data = temp.dataProvider()
temp.startEditing()

layer_fields = layer.dataProvider().fields().toList()
attr = layer.dataProvider().fields().toList()
temp_data.addAttributes(attr)
temp.updateFields()

feat = QgsFeature()
for elem in layer.getFeatures():
    feat.setGeometry(elem.geometry())
    feat.setAttributes(attr)
    temp.addFeatures([feat])
    temp.updateExtents()

temp.commitChanges()
QgsMapLayerRegistry.instance().addMapLayer(temp)

7voto

Yada Puntos 9489

He modificado su código para considerar una capa vectorial de polígonos. Sin embargo, si obtienes las características de la capa original, sólo necesitas una pequeña porción de tu código original para trabajar adecuadamente (sin ninguna sesión de edición si usas el QgsDataProvider clase). Este es mi código:

input = "/home/zeito/pyqgis_data/polygon8.shp"

layer = QgsVectorLayer(input,"polygon","ogr")

feats = [ feat for feat in layer.getFeatures() ]

temp = QgsVectorLayer("Polygon?crs=epsg:32612", 
                      "result", 
                      "memory")

QgsProject.instance().addMapLayer(temp)

temp_data = temp.dataProvider()

attr = layer.dataProvider().fields().toList()
temp_data.addAttributes(attr)
temp.updateFields()

temp_data.addFeatures(feats)

Cuando el código anterior se ejecutó en la consola de Python de QGIS, los campos de la capa original se copiaron correctamente en la capa de memoria llamada "resultado"; como se puede observar en la siguiente imagen. A mí me ha funcionado.

enter image description here

Por otro lado, tu planteamiento de establecer atributos a una lista de campos en lugar de una lista de valores es correcto porque si comento estas líneas de código:

attr = layer.dataProvider().fields().toList()
temp_data.addAttributes(attr)

no rellena los campos con datos; como también se observa en la siguiente imagen:

enter image description here

0 votos

Agradezco mucho tu respuesta, alternativa mucho más corta a la que tenía. Gracias.

4voto

hyty Puntos 91

Hmm, usted establece los atributos a una lista de campos en lugar de una lista de valores. Prueba con esto:

feat.setAttributes(elem.attributes())

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X