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

51

Algo que espero 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, parece que no puedo encontrar nada para QGIS.

¿Alguien sabe de una herramienta para hacer esto?

Si no existe uno, entonces estoy feliz de intentarlo, pero no quería hacerlo si ya se ha creado.

Nathan W
fuente
3
Sería genial tenerlo. No conozco ninguna función nativa de QGIS.
oscuro
3
Tengo una buena idea de cómo puedo hacer esto con bastante facilidad, veré si puedo preparar algo esta noche.
Nathan W
¡Excelente! Tal vez se pueda agregar a ftools / vector tool box.
oscuro
1
Dado que ya se ha ocupado del núcleo, ¿hay alguna posibilidad de que desee abordar esta pregunta, pero para QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton
1
Aquí está el boleto: hub.qgis.org/issues/4936
Mike T

Respuestas:

62

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;
  3. Seleccione las características en esta capa que desea revertir.

Ejecute el código de Python anterior por:

  1. Ir a Complementos> Consola Python;
  2. Copiar y pegar el código en la ventana;
  3. Presiona Enter 2x para correr.

Debería mostrar "Verdadero" para cada característica cuya dirección fue intercambiada. Si genera "Falso", entonces no cambió la dirección de esa característica. Esto sucederá si la capa no tiene activada la edición.

¡Muy fácil!

Lo he envuelto en un complemento llamado Swap Line Directiony está disponible en el instalador del complemento QGIS.

Este complemento ya no está disponible (a partir del 16/11/2015) en el instalador del complemento, pero puede crear el suyo con bastante facilidad con el complemento " Creador de complementos".

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

Nathan W
fuente
1
así que creaste tu propia solución, bien hecho, ¿se puede agregar a ftools?
Mapperz
Estoy seguro de que sí, solo tendré que mirar la forma en que fTools está codificado y escribir un parche.
Nathan W
¡Fantástico! Soluciones como esta son la razón por la que me gusta usar QGIS. Buen trabajo Nathan - Por cierto, ¡también me gusta tu pequeño complemento tipo catálogo!
Ando
@Ando Gracias! Estoy probando algunas ideas nuevas en versión beta, solo desearía tener más tiempo para trabajar en ellas para poder sacarlas más rápido.
Nathan W
3
Es realmente asombroso que hayas ideado una solución tan rápida y elegante. ¡El poder del código abierto vuelve a ganar!
RyanDalton
14

Si tiene el complemento GRASS, use la opción v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

ingrese la descripción de la imagen aquí

Mapperz
fuente
hmmm esperaba una forma más nativa de QGIS, no tengo GRASS instalado en este momento. Pero es un buen consejo para las personas que lo hacen.
Nathan W
Sería bueno tenerlo en Python y agregarlo a las herramientas notadas por underdark.
Mapperz
6

Siguiendo la respuesta de Nathan, puede crear una acción de Python en la capa donde desea 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á intercambiar líneas con un clic sobre ellas. ¡Es muy fácil de usar!

Denis Rouzaud
fuente
1
este código es para 2.x
Denis Rouzaud
4

Basado en la publicación de Nathan, he creado un script de procesamiento para invertir la dirección de las características:

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

ingrese la descripción de la imagen aquí

eclipsado_por_la_luna
fuente
¿Cómo creaste el gif?
whyzar
1
askubuntu.com/a/123515/666853
eclipsed_by_the_moon
Por ahora, hay una herramienta de dirección inversa en la caja de herramientas de procesamiento.
AndreJ