Comment changer de direction de ligne dans QGIS?

51

Quelque chose qui est assez facile, espérons-le.

J'aimerais pouvoir échanger la direction d'une polyligne / ligne dans QGIS. J'ai créé un outil personnalisé pour le faire dans MapInfo il y a quelques années. Cependant, je ne trouve rien qui puisse trouver pour QGIS.

Est-ce que quelqu'un connaît un outil pour faire cela?

S'il n'en existe pas, je suis heureux de pouvoir le faire, mais je ne voulais pas le faire si un a déjà été fait.

Nathan W
la source
3
Ce serait génial d'avoir. Je ne connais aucune fonction QGIS native de ce type.
underdark
3
J'ai une bonne idée de la façon dont je peux le faire assez facilement. Je verrai si je peux préparer quelque chose ce soir.
Nathan W
Génial! Peut-être qu'il peut être ajouté à la boîte à outils ftools / vector.
underdark
1
puisque vous avez déjà pris soin du noyau, avez-vous une chance de vous attaquer à cette question, mais pour QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton
1
Voici le billet: hub.qgis.org/issues/4936
Mike T

Réponses:

62

Ok voici le Python que j'avais l'habitude de faire:

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)

Avant d'exécuter le code ci-dessus:

  1. Sélectionnez le calque que vous souhaitez modifier.
  2. Basculer l'édition sur;
  3. Sélectionnez les entités de cette couche que vous souhaitez inverser.

Exécutez le code python ci-dessus en:

  1. Aller à Plugins> Console Python;
  2. Copier et coller le code dans la fenêtre;
  3. Appuyez sur Entrée 2x pour courir.

Il doit générer "True" pour chaque entité dont la direction a été permutée. Si le résultat est "False", la direction de cette fonction n'est pas inversée. Cela se produira si le calque n'est pas activé.

Plutôt facile!

Je l'ai emballé dans un plugin appelé Swap Line Directionet il est disponible dans le programme d'installation du plugin QGIS.

Ce plugin n'est plus disponible (à partir du 16/11/2015) dans le programme d'installation du plugin, mais vous pouvez créer votre propre fichier facilement avec le plugin " Plugin Builder ".

Je vais voir à quel point il est facile de s’intégrer à fTools.

Nathan W
la source
1
vous avez donc créé votre propre solution - bien faite - peut-elle être ajoutée à ftools?
Mapperz
Je suis sûr que c'est possible, je vais devoir regarder comment fTools est codé et écrire un patch.
Nathan W
Fantastique! Des solutions comme celle-ci sont la raison pour laquelle j'aime utiliser QGIS. Beau travail Nathan - BTW J'aime aussi votre petit plugin de type catalogue!
Ando
@Ando Merci! Je suis en train de tester quelques nouvelles idées en bêta. J'aimerais seulement avoir plus de temps pour travailler dessus afin de pouvoir les diffuser plus rapidement.
Nathan W
3
C’est vraiment génial que vous ayez trouvé une solution aussi rapidement et élégamment. Le pouvoir de l'Open Source gagne encore!
RyanDalton
14

Si vous avez le plugin GRASS, utilisez l' option v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

entrez la description de l'image ici

Mapperz
la source
hmmm espérait une version plus native de QGIS, ne pas installer GRASS pour le moment. Mais c'est un bon conseil pour les gens qui le font.
Nathan W
serait bien d’avoir en python et d’ajouter aux outils notés par underdark.
Mapperz
6

Suite à la réponse de Nathan, vous pouvez créer une action Python dans le calque où vous souhaitez échanger des lignes:

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)

Vous pourrez échanger des lignes d'un clic sur celles-ci. C'est beaucoup convivial!

Denis Rouzaud
la source
1
ce code est pour 2.x
Denis Rouzaud
4

Sur la base du message de Nathan, j'ai créé un script de traitement pour inverser le sens des fonctionnalités:

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

entrez la description de l'image ici

eclipsed_by_the_moon
la source
Comment as-tu créé le gif?
whyzar
1
askubuntu.com/a/123515/666853
eclipsed_by_the_moon
A présent, il existe un outil de direction inverse dans la boîte à outils de traitement.
AndreJ