Консоль 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]) |
В таблице появится новый объект, настоящая объединенная линия.
Дальнейшие навороты, типа удаления исходных фрагментов, обработки атрибутики, если она есть и т.п. оставим решать вам самим. А мы пока займемся воплощением того, что узнали в расширение, которое будет решать нашу конкретную задачу.
Спасибо огромное. Давно хотел посмотреть пример чего-либо подобного. Теперь знаю, что делать и куда смотреть, когда возникнет необходимость
Класс. значит создать линию из точек можно! а как считать точки из таблицы? просто иногда надо построить по точкам линии (профили)
Конечно. В QGIS можно очень многое, база есть, надо потихоньку дорабатывать инструменты. Если есть точечный слой, то схема такая же, считать геометрии точек (а не линий), сложить их в линии, записать полученные линии в новый или существующий слой. Можно вообще в памяти временный слой создать.
Похоже, надо какой-то небольшой мануал по программированию в QGIS сделать. Рассказать где информацию брать, как проверить алгоритм, возможно привести какие-то часто встречающиеся фрагменты кода
Это было бы прекрасно.
А я бы как при изучении VBA, посмотрел что делают другие инструменты, и “сочинил” бы на их основе свой. Но пока C++ не изучил 🙁
Здравствуйте. Подскажите пожалуйста как через консоль Python добавить существующий слой во вьювер?
[…] Консоль имеет массу применений, начиная от обкатки алгоритмов будущего расширения и заканчивая автоматизацией часто повторяющихся действий. Краткое введение в использование Консоли Python есть в блоге Г?С-Лаб. […]