Як я можу переключити напрямок лінії в QGIS?


51

Щось, що, сподіваємось, досить легко.

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

Хтось знає про інструмент для цього?

Якщо такої не існує, я щасливий, щоб її зробити, просто не хотів, якщо вона вже була зроблена.


3
Було б здорово мати. Я не знаю жодної такої натурної функції QGIS.
андарм

3
У мене є гарна ідея, як я можу це зробити досить легко, я побачу, чи зможу я сьогодні щось збити.
Натан В

Чудово! Можливо, його можна додати у вікно інструментів 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 2 рази для запуску.

Він повинен виводити "True" для кожної функції, напрямок якої змінився. Якщо він видає "False", то він не змінив напрямок цієї функції. Це станеться, якщо в шарі не буде включено редагування.

Досить просто!

Я завернув його у плагін, який називається, Swap Line Directionі він доступний у програмі установки QGIS.

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

Подивлюсь, як легко взаємодіяти з fTools.


1
тож ви створили власне рішення - молодець - чи можна його додавати до ftools?
Mapperz

Я впевнений, що може, мені просто доведеться подивитися, як кодується fTools, і написати патч.
Натан В

Фантастичний! Такі рішення - це причина, що мені подобається використовувати QGIS. Приємна робота Натан - До речі, мені подобається і ваш маленький плагін типу каталогу!
Андо

@Ando Спасибі! Я бета-тестую кілька нових ідей, просто хочу, щоб у мене було більше часу над цим, щоб я міг швидше вийти з нього.
Натан В

3
Це справді дивовижно, що ви розробили рішення так швидко та елегантно. Сила Open Source знову перемагає!
RyanDalton

14

Якщо у вас є плагін GRASS, використовуйте опцію v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

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


Хммм сподівався на більш рідний QGIS, наразі не встановити GRASS. Але це хороша порада для людей, які це роблять.
Nathan W

було б добре мати в python та додати до ftools, відзначених underdark.
Mapperz

6

Після відповіді Натана, ви можете створити дію пітона в шарі, де потрібно поміняти рядки:

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.