25 votos

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

Soy nuevo en python y QGIS. He mirado algunos tutoriales de scripts python para QGIS. Todos ellos crean nuevas capas vectoriales y raster con alguna fuente de datos existente. por ejemplo. 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 / añadir / modificar nuevas características a través de la secuencia de comandos de Python, según sea necesario. Será típicamente una capa vectorial con datos de puntos y símbolos personalizados.

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

23voto

tobes Puntos 19

Esto ya no funciona en qgis3. Ver a respuesta ligeramente modificada .


Eche un vistazo al Proveedor de memoria como se describe en Libro de cocina de PyQGIS .

El proveedor de memoria está pensado para ser utilizado principalmente por desarrolladores de plugins o aplicaciones de terceros. No almacena datos en disco, lo que permite a los desarrolladores utilizarlo como backend 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()

5voto

Rebecca Puntos 51

La respuesta aceptada ya no funciona en QGIS3

Ahora hay que hacer

from qgis.core import QgsVectorLayer, QgsFeature, QgsField, QgsGeometry, QgsPointXY, QgsField, QgsProject

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
# To just create the layer and add features later, delete the four lines from here until Commit changes
fet = QgsFeature()
fet.setGeometry( QgsGeometry.fromPointXY(QgsPointXY(15,60)) )
fet.setAttributes(["Johny",20,0.3])
pr.addFeatures( [ fet ] )
# Commit changes
vl.commitChanges()
# Show in project
QgsProject.instance().addMapLayer(vl)

4voto

Sean A.O. Harney Puntos 101

Si quieres guardar una nueva capa vectorial (.shp) en tu Disco Duro tienes que usar QgsVectorFileWriter() . Toma varios parámetros, la forma más sencilla es utilizar los parámetros del proyecto que está utilizando. Echa un vistazo a esto 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() )

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