Временный слой в PyQgis
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Временный слой в PyQgis
Добрый день!
Подскажите пожалуйста, какие API Python посмотреть, про временный слой. Задача у меня следующая:
Мне нужно взять узлы определенных объектов из разных слоев, поместить их на временный слой и сделать им подписи. Проблема в том, что я не могу найти, как создать временный слой на питоне. Буду благодарен за помощь!
Подскажите пожалуйста, какие API Python посмотреть, про временный слой. Задача у меня следующая:
Мне нужно взять узлы определенных объектов из разных слоев, поместить их на временный слой и сделать им подписи. Проблема в том, что я не могу найти, как создать временный слой на питоне. Буду благодарен за помощь!
Последний раз редактировалось klerk184 15 сен 2016, 05:32, всего редактировалось 1 раз.
- Denis Rykov
- Гуру
- Сообщения: 3376
- Зарегистрирован: 11 апр 2008, 21:09
- Репутация: 529
- Ваше звание: Author
- Контактная информация:
Re: Временный слой в PyQgis
Оно?
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Временный слой в PyQgis
Так точно!)))Denis Rykov писал(а):Оно?

-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Временный слой в PyQgis
Что-то я не совсем понимаю, пытаюсь добавить временный слой, но он не отображается и с него считать данные не получается. Правильно ли я понимаю, что его нужно, так сказать, создавать вручную и все объекты добавлять в него так же?
Вот что я пытаюсь сделать:
Вот что я пытаюсь сделать:
Код: Выделить всё
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)
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Временный слой в PyQgis
С созданием слоя вроде разобрался, как на этот слой правильно добавить сразу несколько точек? Координаты точек у меня хранятся в отдельных списках 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
pr.addFeatures([fet]) должно быть в цикле, очевидно, ведь fet это один объект типа QgsFeature, вы его всякий раз перезаписываете, а потом последний вариант добавляете в слой.
И ещё наверное нужно сделать vl.commitChanges() перед updateExtents()
И ещё наверное нужно сделать vl.commitChanges() перед updateExtents()
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Временный слой в PyQgis
Сделал вот так:Эдуард Казаков писал(а):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
Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать: ну или
Код: Выделить всё
QgsGeometry.fromPoint(QgsPoint(X, Y))
Код: Выделить всё
QgsGeometry.fromMultiPoint([QgsPoint(X, Y)])
Spatial is now, more than ever, just another column- The Geometry Column.
-
- Участник
- Сообщения: 71
- Зарегистрирован: 23 июн 2016, 11:56
- Репутация: 0
Re: Временный слой в PyQgis
Оба варианта почему-то не срабатывают, QGis просто виснет. На самой первой операции, первая операция у меня извлечение узлов через процессы.Denis Rykov писал(а):Потому что нет такого класса QgsMultiPoint. Вам, видимо, нужно просто написать:ну илиКод: Выделить всё
QgsGeometry.fromPoint(QgsPoint(X, Y))
Код: Выделить всё
QgsGeometry.fromMultiPoint([QgsPoint(X, Y)])
потом я координаты записываю в разные списки и пытаюсь добавить временный слой. Вот код:
Код: Выделить всё
# создаем временный слой
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()
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость