Como posso mudar a direção da linha no QGIS?

51

Algo que é esperançosamente bem fácil.

Gostaria de poder trocar a direção de uma polilinha / linha no QGIS. Eu criei uma ferramenta personalizada para fazer isso no MapInfo há alguns anos, mas não consigo encontrar nada para o QGIS.

Alguém sabe de uma ferramenta para fazer isso?

Se alguém não existe, fico feliz em tentar fazê-lo, só não queria se já tivesse feito.

Nathan W
fonte
3
Seria ótimo ter. Não conheço nenhuma função nativa do QGIS.
Underdark
3
Eu tenho uma boa idéia de como posso fazer isso com muita facilidade, vou ver se consigo preparar alguma coisa hoje à noite.
Nathan W
Ótimo! Talvez ele possa ser adicionado à caixa de ferramentas ftools / vector.
Underdark
11
Como você já cuidou do núcleo, há alguma chance de resolver essa questão, mas para o QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton
11
Aqui está o ticket: hub.qgis.org/issues/4936
Mike T

Respostas:

62

Ok, aqui está o Python que eu costumava fazer:

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 executar o código acima:

  1. Selecione a camada que você deseja editar;
  2. Ative a edição;
  3. Selecione os recursos nesta camada que você deseja reverter.

Execute o código python acima:

  1. Acesse Plugins> Console Python;
  2. Copiando e colando o código na janela;
  3. Pressione Enter 2x para executar.

Ele deve gerar "True" para cada recurso cuja direção foi trocada. Se emitir "False", não trocará a direção desse recurso. Isso acontecerá se a camada não tiver a Edição ativada.

Bem fácil!

Eu o envolvi em um plugin chamado Swap Line Directione está disponível no instalador do plugin QGIS.

Este plug-in não está mais disponível (a partir de 16/11/2015) no instalador do plug-in, mas você pode criar seu próprio facilmente com o plug-in " Plugin Builder ".

Vou dar uma olhada em como é fácil se integrar ao fTools.

Nathan W
fonte
11
então você criou sua própria solução - muito bem - ela pode ser adicionada ao ftools?
Mapperz
Tenho certeza de que sim, precisarei apenas observar como o fTools é codificado e escrever um patch.
Nathan W
Fantástico! Soluções como essa são a razão de eu gostar de usar o QGIS. Bom trabalho Nathan - BTW Eu também gosto do seu pequeno plugin de tipo de catálogo!
Ando
@Ando Thanks! Estou testando beta algumas novas idéias, só gostaria de ter mais tempo para trabalhar nela para que eu possa tirá-lo mais rapidamente.
Nathan W
3
É realmente incrível que você tenha elaborado uma solução com tanta rapidez e elegância. O poder do código aberto vence novamente!
precisa saber é o seguinte
14

Se você possui o plug-in GRASS, use a opção v.flip - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip

insira a descrição da imagem aqui

Mapperz
fonte
hmmm esperava uma maneira mais nativa do QGIS, não tem o GRASS instalado no momento. Mas é uma boa dica para quem faz.
Nathan W
seria bom ter em python e adicionar aos ftools observados pelo underdark.
Mapperz
6

Seguindo a resposta de Nathan, você pode criar uma ação python na camada em que deseja trocar de linha:

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)

Você poderá trocar as linhas com um clique nelas. É muito fácil de usar!

Denis Rouzaud
fonte
11
este código é para 2.x
Denis Rouzaud 12/12
4

Baseado no post de Nathan, criei um script de processamento para inverter a direção dos recursos:

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

insira a descrição da imagem aqui

eclipsed_by_the_moon
fonte
Como você criou o gif?
whyzar
11
askubuntu.com/a/123515/666853
eclipsed_by_the_moon
Até agora, há uma ferramenta de direção reversa na caixa de ferramentas de processamento.
Andrej