Wie kann ich die Linienrichtung in QGIS ändern?

51

Etwas, das hoffentlich ziemlich einfach ist.

Ich möchte die Richtung einer Polylinie / Linie in QGIS tauschen können. Ich habe vor ein paar Jahren in MapInfo ein benutzerdefiniertes Tool dafür erstellt, aber ich kann anscheinend nichts für QGIS finden.

Kennt jemand ein Tool, um dies zu tun?

Wenn einer nicht existiert, bin ich froh, dass ich es versuchen kann, wollte es einfach nicht, wenn einer bereits gemacht wurde.

Nathan W
quelle
3
Wäre toll zu haben. Ich kenne keine solche native QGIS-Funktion.
Underdunkel
3
Ich habe eine gute Idee, wie ich das ziemlich einfach machen kann. Ich werde sehen, ob ich heute Abend etwas zaubern kann.
Nathan W
Toll! Vielleicht kann es zu ftools / vector tool box hinzugefügt werden.
Underdunkel
1
Da Sie sich bereits um den Kern gekümmert haben, haben Sie eine Chance, diese Frage anzugehen, aber für QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton
1
Hier ist das Ticket: hub.qgis.org/issues/4936
Mike T

Antworten:

62

Ok, hier ist das Python, mit dem ich es gemacht habe:

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)

Bevor Sie den obigen Code ausführen:

  1. Wählen Sie die Ebene aus, die Sie bearbeiten möchten.
  2. Bearbeitung einschalten;
  3. Wählen Sie die Features in dieser Ebene aus, die Sie umkehren möchten.

Führen Sie den obigen Python-Code folgendermaßen aus:

  1. Gehen Sie zu Plugins> Python Console.
  2. Kopieren und Einfügen des Codes in das Fenster;
  3. Drücke zweimal die Eingabetaste, um zu starten.

Es sollte "True" für jedes Feature ausgeben, dessen Richtung vertauscht wurde. Wenn "False" ausgegeben wird, wurde die Richtung des Features nicht gewechselt. Dies ist der Fall, wenn für die Ebene die Option Bearbeiten nicht aktiviert ist.

Ziemlich einfach!

Ich habe es in ein Plugin namens " Swap Line DirectionQGIS Plugin Installer" gepackt.

Dieses Plugin ist ab dem 16.11.2015 nicht mehr im Plugin-Installer verfügbar, aber Sie können es ganz einfach mit dem Plugin " Plugin Builder " selbst erstellen.

Ich werde sehen, wie einfach es ist, mit fTools zu interagieren.

Nathan W
quelle
1
Sie haben also Ihre eigene Lösung erstellt. Gut gemacht. Kann sie zu ftools hinzugefügt werden?
Mapperz
Ich bin mir sicher, dass dies möglich ist. Ich muss mir nur ansehen, wie fTools codiert ist, und einen Patch schreiben.
Nathan W
Fantastisch! Lösungen wie diese sind der Grund, warum ich QGIS gerne benutze. Nice job Nathan - Übrigens, ich mag auch dein kleines Katalog-Plugin!
Ando
@Ando Danke! Ich bin gerade dabei, ein paar neue Ideen zu testen. Ich wünschte nur, ich hätte mehr Zeit, um daran zu arbeiten, damit ich sie schneller herausbringen kann.
Nathan W
3
Das ist wirklich großartig, dass Sie so schnell und elegant eine Lösung gefunden haben. Die Kraft von Open Source gewinnt wieder!
RyanDalton
14

Wenn Sie das GRASS- Plugin haben, verwenden Sie die Option v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

Bildbeschreibung hier eingeben

Mapperz
quelle
hmmm hoffte auf einen nativeren QGIS-Weg, habe GRASS im Moment nicht installiert. Aber es ist ein guter Tipp für Leute, die es tun.
Nathan W
wäre gut in python zu haben und ftools hinzuzufügen, die von underdark notiert werden.
Mapperz
6

Nach Nathans Antwort können Sie eine Python-Aktion in der Ebene erstellen, in der Sie Linien tauschen möchten:

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)

Sie können die Zeilen mit einem Klick vertauschen. Es ist sehr benutzerfreundlich!

Denis Rouzaud
quelle
1
Dieser Code ist für 2.x
Denis Rouzaud
4

Basierend auf Nathans Beitrag habe ich ein Verarbeitungsskript erstellt, um die Richtung der Features umzukehren:

#!/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()

Bildbeschreibung hier eingeben

verdunkelt durch den Mond
quelle
Wie hast du das GIF erstellt?
Whyzar
1
askubuntu.com/a/123515/666853
eclipsed_by_the_moon
Mittlerweile befindet sich in der Bearbeitungs-Toolbox ein Werkzeug für die umgekehrte Richtung.
AndreJ