Как я могу изменить направление линии в QGIS?


51

Надеюсь, это довольно легко.

Я хотел бы иметь возможность менять направление полилинии / линии в QGIS. Я сделал специальный инструмент для этого в MapInfo пару лет назад, но, похоже, я ничего не могу найти для QGIS.

Кто-нибудь знает инструмент для этого?

Если кого-то не существует, то я счастлив попробовать его, просто не хочу, если он уже сделан.


3
Было бы здорово иметь. Я не знаю ни одной такой встроенной функции QGIS.
Подземье

3
У меня есть хорошая идея, как я могу сделать это довольно легко, я посмотрю, смогу ли я что-нибудь сделать сегодня вечером.
Натан W

Большой! Может быть, его можно добавить в панель инструментов ftools / vector.
Подземье

1
поскольку вы уже позаботились о ядре, есть ли шанс, что вы захотите решить этот вопрос, но для QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

1
Вот билет: hub.qgis.org/issues/4936
Майк Т

Ответы:


62

Хорошо, вот Python, который я использовал для этого:

layer = qgis.utils.iface.mapCanvas().currentLayer()
for feature in layer.selectedFeatures():
   geom = feature.geometry()
   nodes = geom.asPolyline()
   nodes.reverse() 
   newgeom = QgsGeometry.fromPolyline(nodes)
   layer.changeGeometry(feature.id(),newgeom)

Перед запуском вышеуказанного кода:

  1. Выберите слой, который вы хотите редактировать;
  2. Переключить редактирование на;
  3. Выберите объекты в этом слое, которые вы хотите изменить.

Запустите приведенный выше код Python:

  1. Переход к плагинам> Консоль Python;
  2. Копирование и вставка кода в окно;
  3. Нажмите Enter 2x, чтобы запустить.

Он должен вывести «True» для каждой функции, направление которой было поменяно местами. Если он выдает «False», значит, он не меняет направление этой функции. Это произойдет, если на слое не будет включено редактирование.

Довольно легко!

Я обернул его в плагин под названием, Swap Line Directionи он доступен в установщике плагина QGIS.

Этот плагин больше не доступен (по состоянию на 16.11.2015) в установщике плагинов, но вы можете довольно легко создать свой собственный с помощью плагина " Plugin Builder ".

Я посмотрю, как легко интегрироваться с fTools.


1
Итак, вы создали свое собственное решение - хорошо сделано - его можно добавить в ftools?
Mapperz

Я уверен, что это возможно, мне просто нужно посмотреть, как кодируется fTools, и написать патч.
Натан W

Фантастика! Подобные решения - вот причина, по которой мне нравится использовать QGIS. Отличная работа, Натан. Кстати, мне нравится твой маленький плагин типа каталога!
Андо

@ И спасибо! Я бета-тестирую несколько новых идей, просто хочу, чтобы у меня было больше времени для работы над этим, чтобы я мог быстрее его реализовать.
Натан W

3
Это действительно здорово, что вы разработали решение так быстро и элегантно. Сила Open Source снова побеждает!
RyanDalton

14

Если у вас есть плагин GRASS, используйте опцию v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

введите описание изображения здесь


хммм надеялся на более естественный способ QGIS, в данный момент нет установки GRASS. Но это хороший совет для людей, которые делают.
Натан W

было бы хорошо иметь в python и добавить к ftools, отмеченным underdark.
Mapperz

6

Следуя ответу Натана, вы можете создать действие python в слое, где вы хотите поменять местами строки:

layer = QgsMapLayerRegistry.instance().mapLayer("_your_layer_id_")
r = QgsFeatureRequest([% $id %])
f = QgsFeature()
if layer.getFeatures(r).nextFeature(f):
  geom = f.geometry().asPolyline()
  geom.reverse()
  geom = QgsGeometry.fromPolyline(geom)
  if layer.changeGeometry([% $id %], geom):
    qgis.utils.iface.messageBar().pushMessage("Line swaped", QgsMessageBar.INFO, 2)
    qgis.utils.iface.mapCanvas().refresh()
  else:
    qgis.utils.iface.messageBar().pushMessage("Cannot swap line. Turn editing on.", QgsMessageBar.WARNING, 3)
else:
  qgis.utils.iface.messageBar().pushMessage("Cannot edit this feature.", QgsMessageBar.CRITICAL, 3)

Вы сможете менять линии одним щелчком мыши по ним. Это очень удобно!


1
этот код для 2.x
Дени Роузо



4

Основываясь на посте Натана, я создал сценарий обработки для изменения направления функций:

#!/usr/bin/env python
# -*- coding: utf-8 -*-

# define Interface
##QGIS tools (QGIS 2.x)=group
##Reverse vector direction=name
##Input_layer=vector
##Only_selected_features=boolean true

from PyQt4.QtCore import *
from PyQt4.QtGui import *
from PyQt4 import *

from qgis.core import *
from qgis.gui import *
from qgis.utils import *

# get input parameters from GUI
inlayer = processing.getObject(Input_layer)
selected = Only_selected_features

# check 'Only selected features' option
if selected is True and inlayer.selectedFeatureCount () == 0:
    raise RuntimeError('No features selected on Layer \'' + inlayer.name() + '\'.')

# check if input layer is editable
if not inlayer.isEditable():
    inlayer.startEditing()

# reverse vector direction
def reverse():
    geom = feature.geometry()
    nodes = geom.asPolyline()
    nodes.reverse()
    newgeom = QgsGeometry.fromPolyline(nodes)
    inlayer.changeGeometry(feature.id(),newgeom)

if selected is True:
    for feature in inlayer.selectedFeatures():
        reverse()
else:
    for feature in inlayer.getFeatures():
        reverse()

# refresh input layer
inlayer.dataProvider().forceReload()

введите описание изображения здесь


Как вы создали GIF?
Whyzar


К настоящему времени в панели инструментов обработки есть инструмент обратного направления.
AndreJ
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.