¿Cómo puedo cambiar la dirección de la línea en QGIS?

46

Algo que espero que sea bastante fácil.

Me gustaría poder intercambiar la dirección de una polilínea / línea en QGIS. Hice una herramienta personalizada para hacer esto en MapInfo hace un par de años, sin embargo no puedo encontrar nada para QGIS.

¿Alguien sabe de una herramienta para hacer esto?

Si no existe uno, estoy contento de intentarlo, no quería hacerlo si ya se ha hecho uno.

    
pregunta Nathan W 04.05.2011 - 06:08

6 respuestas

60

Ok, aquí está el Python que solía hacerlo:

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)

Antes de ejecutar el código anterior:

  1. Seleccione la capa que desea editar;
  2. Activar edición en;
  3. Seleccione las funciones en esta capa que desea revertir.

Ejecuta el código de Python anterior mediante:

  1. yendo a Complementos > Consola de Python;
  2. Copiando y pegando el código en la ventana;
  3. pulsa Enter 2x para ejecutar.

Debería mostrarse "Verdadero" para cada función cuya dirección se haya cambiado. Si muestra "False", entonces no cambió la dirección de esa función. Esto sucederá si la capa no se ha activado la Edición.

¡Muy fácil!

Lo envolví en un complemento llamado Swap Line Direction y está disponible en el instalador del complemento QGIS.

Este complemento ya no está disponible (a partir del 11/16/2015) en el instalador del complemento, pero puedes crear el tuyo fácilmente con el " Plugin Builder " plugin.

Echaré un vistazo a lo fácil que es integrarse con fTools.

    
respondido por el Nathan W 04.05.2011 - 23:20
14

Si tiene el complemento GRASS use la opción v.flip - enlace

    
respondido por el Mapperz 04.05.2011 - 06:23
6

Siguiendo la respuesta de Nathan, puedes crear una acción de python en la capa donde deseas intercambiar líneas:

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)

Podrás intercambiar líneas con un clic en ellas. Es muy fácil de usar!

    
respondido por el Denis Rouzaud 10.12.2013 - 08:05
4

Este complemento cambiará la dirección de una polilínea.

enlace

    
respondido por el GreyHippo 15.03.2016 - 15:44
4

Este complemento también invierte la dirección de la línea:

enlace

Tienes que seleccionar una función y convertir la capa en modo de edición antes de hacer clic en el icono del complemento.

    
respondido por el AndreJ 04.11.2016 - 08:45
4

Basado en la publicación de Nathan, he creado un script de procesamiento para revertir la dirección de las funciones:

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

    
respondido por el eclipsed_by_the_moon 18.03.2017 - 17:11

Lea otras preguntas en las etiquetas