Comment créer par programmation une nouvelle couche vectorielle vide?

21

Je suis nouveau sur python et QGIS. J'ai regardé quelques tutoriels de scripts python pour QGIS. Tous créent de nouvelles couches vectorielles et raster avec une source de données existante. par exemple. table de base de données shapefile ou geotiff ou postgis.

Est-il possible de créer une couche QGIS via un script python, où je peux créer / ajouter / modifier de nouvelles fonctionnalités via le script python, selon les besoins. Ce sera généralement une couche vectorielle avec des données ponctuelles et des symboles personnalisés.

Est-ce que cela sera possible? Y a-t-il un exemple que je peux regarder?

Theuns Heydenrych
la source

Réponses:

19

Jetez un œil au fournisseur de mémoire comme décrit dans PyQGIS Cookbook .

Le fournisseur de mémoire est destiné à être utilisé principalement par des développeurs de plugins ou d'applications tierces. Il ne stocke pas de données sur le disque, ce qui permet aux développeurs de l'utiliser comme backend rapide pour certaines couches temporaires.

# 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()
obscur
la source
Merci pour la réponse, c'était certainement utile. Cependant, lorsque j'utilise le script, j'obtiens l'erreur suivante. "NameError: le nom 'QVariant' n'est pas défini" J'ai laissé la partie "addAttributes" et j'ai réussi à mettre un point sur la carte, donc ça marche, merci. J'utilise Ubuntu 12.04 et QGIS 1.8.0-Lisboa Mais qu'est-ce qui peut provoquer l'erreur mentionnée ci-dessus?
Theuns Heydenrych
1
Il semble que ce setAttributeMapne soit plus une méthode des classes QgsFeature, donc cette solution ne fonctionne pas pour le QGIS le plus récent (son 2016).
Spacedman
4

Si vous souhaitez enregistrer une nouvelle couche vectorielle (.shp) sur votre disque dur, vous devez utiliser QgsVectorFileWriter () . Cela prend plusieurs paramètres, la manière la plus simple est d'utiliser les paramètres du projet que vous utilisez. Jetez un œil à ce site .

   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
la source
1
Mais cela crée le fichier .shpfile vide.Si je veux enregistrer le fichier de formes existant dans le chemin spécifié, comment puis-je faire cela?
user99