Come posso cambiare la direzione della linea in QGIS?


51

Qualcosa che si spera sia abbastanza facile.

Vorrei essere in grado di scambiare la direzione di una polilinea / linea in QGIS. Ho creato uno strumento personalizzato per farlo in MapInfo un paio di anni fa, tuttavia non riesco a trovare nulla per QGIS.

Qualcuno sa di uno strumento per farlo?

Se uno non esiste, allora sono felice di provarlo, ma non volevo farlo se uno è già stato creato.


3
Sarebbe bello avere. Non conosco nessuna di queste funzioni QGIS native.
underdark

3
Ho una buona idea di come posso farlo abbastanza facilmente, vedrò se riesco a montare qualcosa stasera.
Nathan W,

Grande! Forse può essere aggiunto alla casella degli strumenti ftools / vector.
underdark

1
dal momento che hai già preso cura del nucleo, hai qualche possibilità di affrontare questa domanda, ma per QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

1
Ecco il biglietto: hub.qgis.org/issues/4936
Mike T

Risposte:


62

Ok ecco il Python che ho usato per farlo:

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)

Prima di eseguire il codice sopra:

  1. Seleziona il livello che desideri modificare;
  2. Attiva Modifica;
  3. Seleziona le caratteristiche di questo livello che vuoi invertire.

Esegui il codice Python sopra indicato da:

  1. Accedere a Plugin> Python Console;
  2. Copia e incolla il codice nella finestra;
  3. Premi Invio 2x per eseguire.

Dovrebbe essere visualizzato "True" per ogni funzione la cui direzione è stata scambiata. Se restituisce "False", non cambia la direzione di quella funzione. Questo accadrà se il layer non ha attivato la modifica.

Molto facile!

L'ho Swap Line Directioninserito in un plug-in chiamato ed è disponibile nel programma di installazione del plug-in QGIS.

Questo plug-in non è più disponibile (a partire dal 16/11/2015) nel programma di installazione del plug-in, ma puoi crearne uno facilmente con il plug-in " Plugin Builder ".

Vedrò quanto è facile integrarsi con fTools.


1
così hai creato la tua soluzione - ben fatta - può essere aggiunta a ftools?
Mapperz

Sono sicuro che può, dovrò solo guardare il modo in cui fTools è codificato e scrivere una patch.
Nathan W,

Fantastico! Soluzioni come questa sono la ragione per cui mi piace usare QGIS. Bel lavoro Nathan - A proposito, mi piace anche il tuo piccolo plugin di tipo catalogo!
Ando,

@Ando Grazie! Sto testando beta alcune nuove idee, vorrei solo avere più tempo per lavorarci su in modo da poterlo realizzare più rapidamente.
Nathan W,

3
È davvero fantastico che tu abbia elaborato una soluzione in modo così rapido ed elegante. Il potere dell'Open Source vince ancora!
Ryan Dalton,


6

Seguendo la risposta di Nathan, puoi creare un'azione Python nel livello in cui desideri scambiare le linee:

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)

Sarai in grado di scambiare le linee con un clic su di esse. È molto facile da usare!


1
questo codice è per 2.x
Denis Rouzaud il



4

Sulla base del post di Nathan ho creato uno script di elaborazione per invertire la direzione delle funzionalità:

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

inserisci qui la descrizione dell'immagine


Come hai creato la gif?
whyzar,


Ormai, c'è uno strumento di direzione inversa nella casella degli strumenti di elaborazione.
AndreJ,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.