Jak utworzyć nową pustą warstwę wektorową programowo?

21

Jestem nowy w Pythonie i QGIS. Przejrzałem kilka samouczków skryptów Pythona dla QGIS. Wszystkie tworzą nowe warstwy wektorowe i rastrowe z istniejącym źródłem danych. na przykład. shapefile lub geotiff lub tabela bazy danych postgis.

Czy jest możliwe utworzenie warstwy QGIS za pomocą skryptu python, w którym mogę tworzyć / dodawać / modyfikować nowe funkcje za pomocą skryptu python, w razie potrzeby. Będzie to zazwyczaj warstwa wektorowa z danymi punktowymi i niestandardowymi symbolami.

Czy to będzie możliwe? Czy jest jakiś przykład, na który mogę spojrzeć?

Theuns Heydenrych
źródło

Odpowiedzi:

19

Spójrz na dostawcę pamięci zgodnie z opisem w książce kucharskiej PyQGIS .

Dostawca pamięci jest przeznaczony głównie do użytku przez wtyczki lub zewnętrznych twórców aplikacji. Nie przechowuje danych na dysku, dzięki czemu programiści mogą wykorzystać je jako szybki backend dla niektórych warstw tymczasowych.

# 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()
podmrok
źródło
Dziękuję za odpowiedź, z pewnością była pomocna. Jednak podczas korzystania ze skryptu pojawia się następujący błąd. „NameError: nazwa„ QVariant ”nie jest zdefiniowana” Opuściłem część „addAttributes” i udało mi się umieścić kropkę na mapie, więc działa, dziękuję. Używam Ubuntu 12.04 i QGIS 1.8.0-Lisboa Ale co może powodować wyżej wymieniony błąd?
Theuns Heydenrych
1
Wydaje się, że setAttributeMapnie jest to już metoda klas QgsFeature, więc to rozwiązanie nie działa w przypadku najnowszego (jego 2016) QGIS.
Spacedman,
4

Jeśli chcesz zapisać nową warstwę wektorową (.shp) na dysku twardym, musisz użyć QgsVectorFileWriter () . Wymaga kilku parametrów, najprostszym sposobem jest użycie parametrów z używanego projektu. Zajrzyj na tę stronę .

   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
źródło
1
Ale to tworzy pusty plik .shp.Jeśli chcę zapisać istniejący plik kształtu do określonej ścieżki, jak to zrobić?
user99