Страница 1 из 1

Временный слой в PyQgis

Добавлено: 09 сен 2016, 11:20
klerk184
Добрый день!
Подскажите пожалуйста, какие API Python посмотреть, про временный слой. Задача у меня следующая:
Мне нужно взять узлы определенных объектов из разных слоев, поместить их на временный слой и сделать им подписи. Проблема в том, что я не могу найти, как создать временный слой на питоне. Буду благодарен за помощь!

Re: Временный слой в PyQgis

Добавлено: 09 сен 2016, 13:16
Denis Rykov

Re: Временный слой в PyQgis

Добавлено: 12 сен 2016, 03:55
klerk184
Denis Rykov писал(а):Оно?
Так точно!))) :D Сколько раз смотрел туда, и не замечал)))

Re: Временный слой в PyQgis

Добавлено: 12 сен 2016, 05:32
klerk184
Что-то я не совсем понимаю, пытаюсь добавить временный слой, но он не отображается и с него считать данные не получается. Правильно ли я понимаю, что его нужно, так сказать, создавать вручную и все объекты добавлять в него так же?

Вот что я пытаюсь сделать:

Код: Выделить всё

LSK=None
		for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
			if lyr.name() == "LI_DATA_LSK":
				LSK = lyr
				break
		LSKPR=None
		for lyr in QgsMapLayerRegistry.instance().mapLayers().values():
			if lyr.name() == "LI_DATA_LSKPR":
				LSKPR = lyr
				break
		
		outputs_QGISEXTRACTNODES_3=processing.runalg('qgis:extractnodes', LSK,None)
		vl = QgsVectorLayer(outputs_QGISEXTRACTNODES_3['OUTPUT'], "temporary_layer", "memory")		
		QgsMapLayerRegistry.instance().addMapLayer(vl)

Re: Временный слой в PyQgis

Добавлено: 12 сен 2016, 11:29
klerk184
С созданием слоя вроде разобрался, как на этот слой правильно добавить сразу несколько точек? Координаты точек у меня хранятся в отдельных списках list_x и list_y
Не смог найти как правильно передавать сразу несколько точек:

Код: Выделить всё

# создаем временный слой
		vl = QgsVectorLayer("MultiPoint", "temporary_points", "memory")
		QgsMapLayerRegistry.instance().addMapLayer(vl)
		pr = vl.dataProvider()
		# добавляются поля
		pr.addAttributes([QgsField("num", QVariant.Int)])
		vl.updateFields()
		# добавляется объект
		fet = QgsFeature()
		
		i = 0
		dist = len(list_x) - 1
		while i <= dist:
			X = list_x[i]
			Y = list_y[i]		
			fet.setGeometry(QgsGeometry.fromMultiPoint(QgsMultiPoint(X,Y)))
			i+=1
			fet.setAttributes([i])
			i-=1
		pr.addFeatures([fet])		
		# после добавления новых объектов обновляем охват слоя
		# т.к. изменение охвата в провайдере не распространяется на слой
		vl.updateExtents()

Re: Временный слой в PyQgis

Добавлено: 12 сен 2016, 13:47
Эдуард Казаков
pr.addFeatures([fet]) должно быть в цикле, очевидно, ведь fet это один объект типа QgsFeature, вы его всякий раз перезаписываете, а потом последний вариант добавляете в слой.
И ещё наверное нужно сделать vl.commitChanges() перед updateExtents()

Re: Временный слой в PyQgis

Добавлено: 13 сен 2016, 04:10
klerk184
Эдуард Казаков писал(а):pr.addFeatures([fet]) должно быть в цикле, очевидно, ведь fet это один объект типа QgsFeature, вы его всякий раз перезаписываете, а потом последний вариант добавляете в слой.
И ещё наверное нужно сделать vl.commitChanges() перед updateExtents()
Сделал вот так:

Код: Выделить всё

i = 0
		dist = len(list_x) - 1
		while i <= dist:
			X = list_x[i]
			Y = list_y[i]
			fet = QgsFeature()
			fet.setGeometry(QgsGeometry.fromMultiPoint(QgsMultiPoint(X,Y)))
			i+=1
			fet.setAttributes([i])
			i-=1
			pr.addFeatures([fet])		
		# после добавления новых объектов обновляем охват слоя
		# т.к. изменение охвата в провайдере не распространяется на слой
		vl.commitChanges()
		vl.updateExtents()
Как Вы и сказали, но почему-то выдает ошибку:
fet.setGeometry(QgsGeometry.fromMultiPoint(QgsMultiPoint(X,Y)))
NameError: global name 'QgsMultiPoint' is not defined

Re: Временный слой в PyQgis

Добавлено: 13 сен 2016, 04:45
Denis Rykov
Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать:

Код: Выделить всё

QgsGeometry.fromPoint(QgsPoint(X, Y))
ну или

Код: Выделить всё

QgsGeometry.fromMultiPoint([QgsPoint(X, Y)])

Re: Временный слой в PyQgis

Добавлено: 13 сен 2016, 06:36
klerk184
Denis Rykov писал(а):Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать:

Код: Выделить всё

QgsGeometry.fromPoint(QgsPoint(X, Y))
ну или

Код: Выделить всё

QgsGeometry.fromMultiPoint([QgsPoint(X, Y)])
Оба варианта почему-то не срабатывают, QGis просто виснет. На самой первой операции, первая операция у меня извлечение узлов через процессы.
потом я координаты записываю в разные списки и пытаюсь добавить временный слой. Вот код:

Код: Выделить всё

# создаем временный слой
		vl = QgsVectorLayer("MultiPoint?crs=epsg:4326", "temporary_points", "memory")
		QgsMapLayerRegistry.instance().addMapLayer(vl)
		pr = vl.dataProvider()
		# добавляются поля
		pr.addAttributes([QgsField("num", QVariant.Int)])
		vl.updateFields()
		# добавляется объект
		
		
		i = 0
		dist = len(list_x) - 1
		while i <= dist:
			X = list_x[i]
			Y = list_y[i]
			fet = QgsFeature()
			fet.setGeometry(QgsGeometry.fromPoint(QgsPoint(X,Y)))
			i+=1
			fet.setAttributes([i])
			i-=1
			pr.addFeatures([fet])		
		# после добавления новых объектов обновляем охват слоя
		# т.к. изменение охвата в провайдере не распространяется на слой
		vl.commitChanges()
		vl.updateExtents()