Como criar uma nova camada de vetor vazia programaticamente?

21

Eu sou novo em python e QGIS. Eu olhei para alguns tutoriais de scripts python para QGIS. Todos eles criam novas camadas de vetor e varredura com alguma fonte de dados existente. por exemplo. tabela de banco de dados shapefile ou geotiff ou postgis.

É possível criar uma camada QGIS através de um script python, onde eu posso criar / adicionar / modificar novos recursos através do script python, conforme a necessidade. Normalmente, é uma camada vetorial com dados de pontos e símbolos personalizados.

Isso será possível? Existe um exemplo que eu possa ver?

Theuns Heydenrych
fonte

Respostas:

19

Dê uma olhada no provedor de memória, conforme descrito no PyQGIS Cookbook .

O provedor de memória deve ser usado principalmente por desenvolvedores de plug-ins ou de terceiros. Ele não armazena dados no disco, permitindo que os desenvolvedores os usem como um back-end rápido para algumas camadas temporárias.

# 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()
underdark
fonte
Obrigado pela resposta, foi certamente útil. No entanto, ao usar o script, recebo o seguinte erro. "NameError: o nome 'QVariant' não está definido" Deixei a parte "addAttributes" de fora e consegui colocar um ponto no mapa, para que funcione, obrigado. Estou usando o Ubuntu 12.04 e o QGIS 1.8.0-Lisboa. Mas o que pode causar o erro acima mencionado?
Theuns Heydenrych
1
Parece que esse setAttributeMapnão é mais um método das classes QgsFeature, portanto, esta solução não funciona para o QGIS mais recente (seu 2016).
Spacedman 8/08/16
4

Se você deseja salvar uma nova camada de vetor (.shp) no disco rígido, use QgsVectorFileWriter () . São necessários vários parâmetros, a maneira mais simples é usar os parâmetros do projeto que você está usando. Dê uma olhada neste 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
fonte
1
Mas isso está criando o .shpfile vazio. Se eu quiser salvar o shapefile existente no caminho especificado, como posso fazer isso?
usar o seguinte comando