GIS-LAB

Географические информационные системы и дистанционное зондирование

Шпаргалка по консоли Python в QGIS

Максим Дубинин, 23.02.2010

Консоль Python в QGIS – отличное средство в интерактивном режиме прогнать нужный алгоритм и убедиться, что он работает. Проиллюстрируем работу с консолью для решения следующей задачи. Допустим у нас есть 2 линии, оцифрованные стык в стык с прилипанием (на самом деле они могут и пересекаться, но пока допустим что они прилипают). Мы хотим создать из этих двух линий – единую, но не мультилинию, которая появится если использовать инструмент объединения.

Зачем такой инструмент? Очень просто, в проекте по границам, многие цифровали границу таким образом, что она состоит из нескольких фрагментов стык в стык, это неплохо, но аккуратнее будет, если граница будет представлена одной-единственной линией. ?нструмента полного “слияния” линий в QGIS пока нет, но не беда, создадим свой.

Перед тем как бросаться делать расширение, прогоним весь процесс в консоли, используя для примера что-нибудь элементарное.

Для начала получим текущий линейный слой, выделенный в списке слоёв, который содержит линии, их может быть больше чем две, работать будем именно с двумя выделенными:

curLayer = qgis.utils.iface.mapCanvas().currentLayer()

Получим список выделенных объектов в этом слое (в виде списка Id этих линий).

featids = curLayer.selectedFeaturesIds()

Для одного из объектов списка получим его геометрию:

featid = featids[0]
feat = QgsFeature()
curLayer.featureAtId(featid,feat)
featgeom = feat.geometry()

? получим, например, один из узлов:

vertex=featgeom.vertexAt(1)

Другой, более прямой способ, получить объекты сразу:

selfeats = curLayer.selectedFeatures()

? потом возьмем обе линии из списка:

line0 = QgsGeometry(selfeats[0].geometry() )
line1 = QgsGeometry(selfeats[1].geometry() )

Хорошо, получать геометрию мы научились, теперь надо научиться производить с геометрией операции, создавать новые геометрии и объекты и сохранять их в слое.

Схема работы будет простая, сначала обе линии разложим на точки, для простоты представим что в каждой линии по 2 точки, иначе конечно понадобится цикл. Для получения узла используется функция vertexAt():

pnt0 = QgsPoint(line0.vertexAt(0))
pnt1 = QgsPoint(line0.vertexAt(1))
pnt2 = QgsPoint(line1.vertexAt(0))
pnt3 = QgsPoint(line1.vertexAt(1))

Объединяем в один массив, точку pnt2 выкидываем, так как она совпадает (если правильно прилеплена с pnt1):

pnts=[pnt0,pnt1,pnt3]

Новый список используем, чтобы создать линию:

newgeom = QgsGeometry.fromPolyline(pnts)

из которой создадим объект и добавим его в слой:

feat = QgsFeature()
feat.setGeometry(newgeom)
pr=curLayer.dataProvider()

В общем все, задача решена, новая линия создана, теперь остается только удалить исходные куски.

pr.addFeatures([feat])

В таблице появится новый объект, настоящая объединенная линия.

Дальнейшие навороты, типа удаления исходных фрагментов, обработки атрибутики, если она есть и т.п. оставим решать вам самим. А мы пока займемся воплощением того, что узнали в расширение, которое будет решать нашу конкретную задачу.

Комментарии (8) к статье “Шпаргалка по консоли Python в QGIS”

  1. Дмитрий says:

    Спасибо огромное. Давно хотел посмотреть пример чего-либо подобного. Теперь знаю, что делать и куда смотреть, когда возникнет необходимость

  2. Trace says:

    Класс. значит создать линию из точек можно! а как считать точки из таблицы? просто иногда надо построить по точкам линии (профили)

    • sim says:

      Конечно. В QGIS можно очень многое, база есть, надо потихоньку дорабатывать инструменты. Если есть точечный слой, то схема такая же, считать геометрии точек (а не линий), сложить их в линии, записать полученные линии в новый или существующий слой. Можно вообще в памяти временный слой создать.

  3. voltron says:

    Похоже, надо какой-то небольшой мануал по программированию в QGIS сделать. Рассказать где информацию брать, как проверить алгоритм, возможно привести какие-то часто встречающиеся фрагменты кода

  4. Neo says:

    А я бы как при изучении VBA, посмотрел что делают другие инструменты, и “сочинил” бы на их основе свой. Но пока C++ не изучил 🙁

  5. nail83 says:

    Здравствуйте. Подскажите пожалуйста как через консоль Python добавить существующий слой во вьювер?

  6. […] Консоль имеет массу применений, начиная от обкатки алгоритмов будущего расширения и заканчивая автоматизацией часто повторяющихся действий. Краткое введение в использование Консоли Python есть в блоге Г?С-Лаб. […]

Оставьте комментарий


(Геокруг)

Если Вы обнаружили на сайте ошибку, выберите фрагмент текста и нажмите Ctrl+Enter