Come creare un nuovo livello vettoriale vuoto a livello di codice?


21

Sono nuovo di Python e QGIS. Ho esaminato alcuni tutorial di script Python per QGIS. Tutti creano nuovi livelli vettoriali e raster con alcune origini dati esistenti. per esempio. tabella di database shapefile o geotiff o postgis.

È possibile creare un livello QGIS tramite uno script Python, dove posso creare / aggiungere / modificare nuove funzionalità tramite lo script Python, in caso di necessità. Sarà in genere un livello vettoriale con dati punto e simboli personalizzati.

Sarà possibile? C'è un esempio che posso guardare?

Risposte:


19

Dai un'occhiata al provider di memoria come descritto nel ricettario PyQGIS .

Il provider di memoria deve essere utilizzato principalmente da plugin o sviluppatori di app di terze parti. Non memorizza i dati su disco, consentendo agli sviluppatori di usarli come backend veloce per alcuni livelli temporanei.

# 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()

Grazie per la risposta, è stato sicuramente utile. Tuttavia quando si utilizza lo script ottengo il seguente errore. "NameError: il nome 'QVariant' non è definito" Ho lasciato la parte "addAttributes" e sono riuscito a mettere un punto sulla mappa, quindi funziona, grazie. Sto usando Ubuntu 12.04 e QGIS 1.8.0-Lisboa Ma cosa può causare l'errore sopra menzionato?
Theuns Heydenrych,

1
Sembra che setAttributeMapnon sia più un metodo delle classi QgsFeature, quindi questa soluzione non funziona con il QGIS più recente (il 2016).
Spacedman

4

Se vuoi salvare un nuovo livello vettoriale (.shp) sul tuo Hard Disk devi usare QgsVectorFileWriter () . Sono necessari diversi parametri, il modo più semplice è utilizzare i parametri del progetto che si sta utilizzando. Dai un'occhiata a questo sito .

   cLayer = qgis.utils.iface.mapCanvas().currentLayer()
   provider = cLayer.dataProvider()
   writer = QgsVectorFileWriter( "output_path_and_name.shp", provider.encoding(), provider.fields(),QGis.WKBPolygon, provider.crs() )

1
Ma questo sta creando il file .shp vuoto. Se voglio salvare il file di forma esistente nel percorso specificato, come posso farlo?
user99,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.