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

Нанесение нумерации на узлы

Добавлено: 29 авг 2016, 10:06
klerk184
Всем добрый день!

Вопрос следующий, можно ли как то нанести нумерацию узлов объектов, на слой? пример нарисовал.
2016-08-29_14-01-15.png
2016-08-29_14-01-15.png (54.37 КБ) 7332 просмотра
Подобное я делал на мапинфо, там есть такая возможность, есть для этого косметический слой. Если я правильно понимаю, то в qgis только через создание точек?

Мне нужно это реализовать программно, т.е. чтоб работало через плагин. Плагин уже начал делать.

Re: Нанесение нумерации на узлы

Добавлено: 29 авг 2016, 12:42
Игорь Белов
В тулбоксе в геоалгоритмах QGIS найдите "Extract nodes" и запустите. На входе укажете слой линий, на выходе получите слой узлов.

В калькуляторе полей создайте целочисленное поле и заполните его выражением "$id + 1".

Выведите подписи.

Re: Нанесение нумерации на узлы

Добавлено: 30 авг 2016, 05:53
klerk184
Игорь Белов писал(а):В тулбоксе в геоалгоритмах QGIS найдите "Extract nodes" и запустите. На входе укажете слой линий, на выходе получите слой узлов.

В калькуляторе полей создайте целочисленное поле и заполните его выражением "$id + 1".

Выведите подписи.

Этот вариант пользовательский. Мне то нужно это реализовать в своем плагине, чтоб нажал кнопку, и указанные слои нумеровались.

Может кто подскажет, на какие API Python'a стоит обратить внимание? Буду очень благодарен.

Re: Нанесение нумерации на узлы

Добавлено: 30 авг 2016, 12:03
Эдуард Казаков
Работайте по алгоритму, который описал Игорь, только через PyQGIS API.
Что-то типа:

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

import processing
...
# извлечение узлов
processing.runalg('qgis:extractnodes',...)

# калькулятор атрибутов
processing.runalg('qgis:fieldcalculator',...)

# для слоя извлеченных узлов с расчитанными атрибутами задать подписи.
palyr = QgsPalLayerSettings()
palyr.readFromLayer(field_calculator_output_layer)
palyr.enabled = True
palyr.fieldName = 'Node containing field'
palyr.placement= QgsPalLayerSettings.OverPoint
palyr.setDataDefinedProperty(QgsPalLayerSettings.Size,True,True,'8','')
palyr.writeToLayer(field_calculator_output_layer)

# делаем сам слой прозрачным
field_calculator_output_layer.setLayerTransparency(100)

iface.mapCanvas().refresh()

Re: Нанесение нумерации на узлы

Добавлено: 30 авг 2016, 13:05
axinax
processing это что за библиотека? Не могу найти ее Qgis API

Re: Нанесение нумерации на узлы

Добавлено: 30 авг 2016, 13:25
Эдуард Казаков
Это то, что доступно в processing toolbox в штатном плагине processing.
Можете побаловаться через консоль в самом qgis, а потом то же самое использовать в своём плагине

https://docs.qgis.org/2.2/en/docs/user_ ... nsole.html

Re: Нанесение нумерации на узлы

Добавлено: 02 сен 2016, 10:49
klerk184
Добрый день, пытаюсь реализовать алгоритм через плагин, что-то не выходит

import processing сделал

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

def buttonRun(self):
		uri = QgsDataSourceURI()
		#задаем имя хоста, порта, название базы данных, имя пользователя и пароль
		uri.setConnection("localhost", "1313", "postgres", "postgres", "2709")
		#задается схема, название таблицы, поле геометрии и, опционально, подмножество (условие WHERE)
		uri.setDataSource("public", "LI_DATA_LSK", "geom", "")
		LSK =  QgsVectorLayer(uri.uri(), "LI_DATA_LSK", "postgres")
		
		uri = QgsDataSourceURI()
		#задаем имя хоста, порта, название базы данных, имя пользователя и пароль
		uri.setConnection("localhost", "1313", "postgres", "postgres", "2709")
		#задается схема, название таблицы, поле геометрии и, опционально, подмножество (условие WHERE)
		uri.setDataSource("public", "LI_DATA_LSKPR", "geom", "")
		LSKPR = QgsVectorLayer(uri.uri(), "LI_DATA_LSKPR", "postgres")
		##LSK=name
		##lskpr=vector
		##lsk=vector
		##nodes=output vector
		outputs_QGISEXTRACTNODES_2=processing.runalg('qgis:extractnodes', LSK,None)
		outputs_QGISEXTRACTNODES_1=processing.runalg('qgis:extractnodes', LSKPR,None)
		outputs_QGISMERGEVECTORLAYERS_1=processing.runalg('qgis:mergevectorlayers', [outputs_QGISEXTRACTNODES_1['OUTPUT'],outputs_QGISEXTRACTNODES_2['OUTPUT']],None)
		outputs_QGISDELETEDUPLICATEGEOMETRIES_1=processing.runalg('qgis:deleteduplicategeometries', outputs_QGISMERGEVECTORLAYERS_1['OUTPUT'],"C:/NODES.shp")
		
		vlayer = QgsVectorLayer("C:/NODES.shp", "nodes", "ogr")
		#добавляем загруженный слой в "панель слоев"
		QgsMapLayerRegistry.instance().addMapLayer(vlayer)
Что я делаю не так?

Re: Нанесение нумерации на узлы

Добавлено: 02 сен 2016, 13:36
Эдуард Казаков
Ошибка или что не так?
Временные файлы генерируются? Что в них?

Re: Нанесение нумерации на узлы

Добавлено: 05 сен 2016, 04:30
klerk184
Разобрался, если указываю на диск D и тогда все нормально. Как можно сделать так, чтоб можно было на диск С ?

Re: Нанесение нумерации на узлы

Добавлено: 05 сен 2016, 07:18
Vladimir_R
Плохая идея писать в корень системного диска.
Если же такая необходимость сохраняется, то можете изменить настройки целостности https://blog.windowsnt.lv/2011/11/23/lo ... e-russian/.

Re: Нанесение нумерации на узлы

Добавлено: 05 сен 2016, 10:58
klerk184
Да файл решил создавать в ТЕМПы.

Не могу понять следующее, не срабатывает процедура калькулятора полей, посмотрите пожалуйста, может кто знает в чем дело

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

	def buttonRun(self):
		#записываем в переменные слои
		LSK = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "LI_DATA_LSK"][0].name()
		LSKPR = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "LI_DATA_LSKPR"][0].name()
		
		##LSK=name
		##lskpr=vector
		##lsk=vector
		##nodes=output vector
		outputs_QGISEXTRACTNODES_2=processing.runalg('qgis:extractnodes', LSK,None)
		outputs_QGISEXTRACTNODES_1=processing.runalg('qgis:extractnodes', LSKPR,None)
		outputs_QGISMERGEVECTORLAYERS_1=processing.runalg('qgis:mergevectorlayers', [outputs_QGISEXTRACTNODES_1['OUTPUT'],outputs_QGISEXTRACTNODES_2['OUTPUT']],None)
		outputs_QGISDELETEDUPLICATEGEOMETRIES_1=processing.runalg('qgis:deleteduplicategeometries', outputs_QGISMERGEVECTORLAYERS_1['OUTPUT'],"C:\Windows\Temp\nodes.shp")	
		vlayer = QgsVectorLayer("C:\Windows\Temp\nodes.shp", "nodes", "ogr")
		#добавляем загруженный слой в "панель слоев"
		QgsMapLayerRegistry.instance().addMapLayer(vlayer)
		#записываем в переменную добавленный слой
		layerNodes = [lyr for lyr in QgsMapLayerRegistry.instance().mapLayers().values() if lyr.name() == "nodes"][0].name()
		#процедура калькулятора полей, создание поля Number и проставление чисел
		outputs_QGISFIELDCALCULATOR_1=processing.runalg('qgis:fieldcalculator', layerNodes,'Number',1,3.0,3.0,True,'$id + 1',None)
	
Вопрос закрыт. Всем спасибо!

Re: Нанесение нумерации на узлы

Добавлено: 21 сен 2016, 21:39
VeterR63
klerk184,
привет. Полезный плагин пишете.
Планируете поделится с сообществом или для личных нужд?

Re: Нанесение нумерации на узлы

Добавлено: 26 сен 2016, 04:55
klerk184
VeterR63 писал(а):klerk184,
привет. Полезный плагин пишете.
Планируете поделится с сообществом или для личных нужд?
Пока не думал на эту тему)

В данный момент застрял на API. Не могу разобраться, как задавать стили отображения слоев.)