Wie erstelle ich programmgesteuert eine neue leere Vektorebene?

21

Ich bin neu in Python und QGIS. Ich habe mir einige Tutorials zu Python-Skripten für QGIS angesehen. Alle von ihnen erstellen neue Vektor- und Rasterebenen mit einer vorhandenen Datenquelle. z.B. Shapefile- oder Geotiff- oder Postgis-Datenbanktabelle.

Ist es möglich, eine QGIS-Ebene über ein Python-Skript zu erstellen, in dem ich bei Bedarf über das Python-Skript neue Funktionen erstellen / hinzufügen / ändern kann? Dies ist normalerweise eine Vektorebene mit Punktdaten und benutzerdefinierten Symbolen.

Wird das möglich sein? Gibt es ein Beispiel, das ich mir ansehen kann?

Theuns Heydenrych
quelle

Antworten:

19

Schauen Sie sich den Speicheranbieter an, wie in PyQGIS Cookbook beschrieben .

Der Speicheranbieter ist hauptsächlich für Entwickler von Plugins oder Apps von Drittanbietern vorgesehen. Es werden keine Daten auf der Festplatte gespeichert, sodass Entwickler sie als schnelles Backend für einige temporäre Ebenen verwenden können.

# 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()
Underdunkel
quelle
Vielen Dank für die Antwort, es war sicherlich hilfreich. Bei Verwendung des Skripts erhalte ich jedoch den folgenden Fehler. "NameError: Name 'QVariant' ist nicht definiert" Ich habe den Teil "addAttributes" weggelassen und es geschafft, einen Punkt auf der Karte zu platzieren, damit es funktioniert, danke. Ich verwende Ubuntu 12.04 und QGIS 1.8.0-Lisboa. Aber was kann den oben genannten Fehler verursachen?
Theuns Heydenrych
1
Scheint, dass dies setAttributeMapkeine Methode von QgsFeature-Klassen mehr ist, sodass diese Lösung für das neueste (dessen 2016) QGIS nicht funktioniert.
Spacedman
4

Wenn Sie eine neue Vektorebene (.shp) auf Ihrer Festplatte speichern möchten, müssen Sie QgsVectorFileWriter () verwenden . Es sind mehrere Parameter erforderlich. Am einfachsten ist es, die Parameter aus dem verwendeten Projekt zu verwenden. Schauen Sie sich diese Seite an .

   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
quelle
1
Aber dies erstellt die leere .shpfile. Wenn ich das vorhandene Shapefile auf den angegebenen Pfad speichern möchte, wie kann ich das tun?
Benutzer99