Страница 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 писал(а):Оно?
Так точно!)))

Сколько раз смотрел туда, и не замечал)))
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.fromMultiPoint([QgsPoint(X, Y)])
Re: Временный слой в PyQgis
Добавлено: 13 сен 2016, 06:36
klerk184
Denis Rykov писал(а):Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать:
ну или
Код: Выделить всё
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()