Как программно создать новый пустой векторный слой?

21

Я новичок в Python и QGIS. Я посмотрел несколько учебных пособий по сценариям Python для QGIS. Все они создают новые векторные и растровые слои с некоторым существующим источником данных. например. шейп-файл или таблица базы данных geotiff или postgis.

Можно ли создать слой QGIS с помощью скрипта Python, где я могу создавать / добавлять / изменять новые функции с помощью скрипта Python по мере необходимости. Обычно это векторный слой с точечными данными и пользовательскими символами.

Будет ли это возможно? Есть ли пример, на который я могу посмотреть?

Теунс Гейденрих
источник

Ответы:

19

Посмотрите на провайдера памяти, как описано в кулинарной книге PyQGIS .

Поставщик памяти предназначен в основном для разработчиков плагинов или сторонних приложений. Он не хранит данные на диске, что позволяет разработчикам использовать его как быстрый бэкэнд для некоторых временных слоев.

# 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()
Подземье
источник
Спасибо за ответ, это было конечно полезно. Однако при использовании скрипта я получаю следующую ошибку. «NameError: имя« QVariant »не определено» Я оставил часть «addAttributes» и сумел поставить точку на карте, так что она работает, спасибо. Я использую Ubuntu 12.04 и QGIS 1.8.0-Lisboa Но что может вызвать вышеупомянутую ошибку?
Theuns Heydenrych
1
Кажется, что setAttributeMapэто больше не метод классов QgsFeature, поэтому это решение не работает для самой последней (его 2016) QGIS.
Spacedman
4

Если вы хотите сохранить новый векторный слой (.shp) на жестком диске, вы должны использовать QgsVectorFileWriter () . Он принимает несколько параметров, самый простой способ - использовать параметры из проекта, который вы используете. Посмотрите на этот сайт .

   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
источник
1
Но это создает пустой .shpfile. Если я хочу сохранить существующий шейп-файл по указанному пути, как я могу это сделать?
user99