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

Вопросы по свободной ГИС QGIS. Сообщения об ошибках, предложения по улучшению, локализация.
Ответить
klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 09 сен 2016, 11:20

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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 09 сен 2016, 13:16

Spatial is now, more than ever, just another column- The Geometry Column.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 12 сен 2016, 03:55

Denis Rykov писал(а):Оно?
Так точно!))) :D Сколько раз смотрел туда, и не замечал)))

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 12 сен 2016, 05:32

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

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

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

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)

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 12 сен 2016, 11:29

С созданием слоя вроде разобрался, как на этот слой правильно добавить сразу несколько точек? Координаты точек у меня хранятся в отдельных списках 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()

Аватара пользователя
Эдуард Казаков
Гуру
Сообщения: 549
Зарегистрирован: 23 апр 2014, 17:11
Репутация: 535
Откуда: Planet Earth
Контактная информация:

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

Сообщение Эдуард Казаков » 12 сен 2016, 13:47

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

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 13 сен 2016, 04:10

Эдуард Казаков писал(а):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

Аватара пользователя
Denis Rykov
Гуру
Сообщения: 3376
Зарегистрирован: 11 апр 2008, 21:09
Репутация: 529
Ваше звание: Author
Контактная информация:

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

Сообщение Denis Rykov » 13 сен 2016, 04:45

Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать:

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

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

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

QgsGeometry.fromMultiPoint([QgsPoint(X, Y)])
Spatial is now, more than ever, just another column- The Geometry Column.

klerk184
Участник
Сообщения: 71
Зарегистрирован: 23 июн 2016, 11:56
Репутация: 0

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

Сообщение klerk184 » 13 сен 2016, 06:36

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()

Ответить

Вернуться в «QGIS»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя