¿Cómo crear una nueva capa vectorial vacía mediante programación?

21

Soy nuevo en Python y QGIS. He visto algunos tutoriales de scripts de python para QGIS. Todos ellos crean nuevas capas vectoriales y ráster con alguna fuente de datos existente. p.ej. shapefile o geotiff o tabla de base de datos postgis.

¿Es posible crear una capa QGIS a través de un script de Python, donde puedo crear / agregar / modificar nuevas características a través del script de Python, según sea necesario? Normalmente será una capa vectorial con datos de puntos y símbolos personalizados.

¿Será esto posible? ¿Hay algún ejemplo que pueda mirar?

Theuns Heydenrych
fuente

Respuestas:

19

Eche un vistazo al proveedor de memoria como se describe en PyQGIS Cookbook .

El proveedor de memoria está destinado a ser utilizado principalmente por plugins o desarrolladores de aplicaciones de terceros. No almacena datos en el disco, lo que permite a los desarrolladores usarlo como un back-end rápido para algunas capas temporales.

# To avoid 'QVariant' is not defined error
from PyQt4.QtCore import *

# create layer
vl = QgsVectorLayer("Point", "temporary_points", "memory")
pr = vl.dataProvider()

# Enter editing mode
vl.startEditing()

# add fields
pr.addAttributes( [ QgsField("name", QVariant.String),
                QgsField("age",  QVariant.Int),
                QgsField("size", QVariant.Double) ] )

# add a feature
fet = QgsFeature()
fet.setGeometry( QgsGeometry.fromPoint(QgsPoint(10,10)) )
fet.setAttributeMap( { 0 : QVariant("Johny"),
                   1 : QVariant(20),
                   2 : QVariant(0.3) } )
pr.addFeatures( [ fet ] )

# Commit changes
vl.commitChanges()
bajo oscuro
fuente
Gracias por la respuesta, sin duda fue útil. Sin embargo, cuando uso el script obtengo el siguiente error. "NameError: el nombre 'QVariant' no está definido" Dejé la parte "addAttributes" y logré poner un punto en el mapa, así que funciona, gracias. Estoy usando Ubuntu 12.04 y QGIS 1.8.0-Lisboa Pero, ¿qué puede causar el error mencionado anteriormente?
Theuns Heydenrych
1
Parece que setAttributeMapya no es un método de clases QgsFeature, por lo que esta solución no funciona para el QGIS más reciente (2016).
Spacedman
4

Si desea guardar una nueva capa vectorial (.shp) en su Disco Duro, debe usar QgsVectorFileWriter () . Toma varios parámetros, la forma más simple es usar los parámetros del proyecto que está usando. Echa un vistazo a este sitio .

   cLayer = qgis.utils.iface.mapCanvas().currentLayer()
   provider = cLayer.dataProvider()
   writer = QgsVectorFileWriter( "output_path_and_name.shp", provider.encoding(), provider.fields(),QGis.WKBPolygon, provider.crs() )
GM
fuente
1
Pero esto está creando el archivo .shp vacío. Si quiero guardar el archivo de forma existente en la ruta especificada, ¿cómo puedo hacer eso?
user99