Jak mogę zmienić kierunek linii w QGIS?


51

Mam nadzieję, że jest to dość łatwe.

Chciałbym móc zamienić kierunek polilinii / linii w QGIS. Kilka lat temu stworzyłem niestandardowe narzędzie do tego w MapInfo, jednak nie mogę znaleźć niczego dla QGIS.

Czy ktoś zna narzędzie do tego?

Jeśli ktoś nie istnieje, cieszę się, że mogę to zrobić, po prostu nie chciałem, jeśli ktoś już go stworzył.


3
Byłoby wspaniale mieć. Nie znam żadnej takiej natywnej funkcji QGIS.
podmrok

3
Mam dobry pomysł, jak mogę to zrobić dość łatwo, zobaczę, czy mogę coś dziś wymieszać.
Nathan W

Wspaniały! Być może można go dodać do przybornika Ftools / Vector.
podmrok

1
skoro masz już zadbany rdzeń, jest szansa, że ​​chcesz rozwiązać to pytanie, ale w przypadku QGIS? gis.stackexchange.com/questions/9286/… resources.arcgis.com/content/kbase?fa=articleShow&d=20961
RyanDalton

Odpowiedzi:


62

Ok, tutaj jest Python, którego użyłem:

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)

Przed uruchomieniem powyższego kodu:

  1. Wybierz warstwę, którą chcesz edytować;
  2. Włącz edycję;
  3. Wybierz funkcje w tej warstwie, które chcesz odwrócić.

Uruchom powyższy kod python przez:

  1. Idź do Wtyczki> Python Console;
  2. Kopiowanie i wklejanie kodu do okna;
  3. Naciśnij Enter 2x, aby uruchomić.

Powinien wyświetlać „True” dla każdej cechy, której kierunek został zamieniony. Jeśli wyświetla „False”, to nie zmienia kierunku tej funkcji. Stanie się tak, jeśli na warstwie nie będzie włączona opcja Edycja.

Całkiem proste!

Założyłem go we wtyczce o nazwie Swap Line Directioni jest ona dostępna w instalatorze wtyczek QGIS.

Ta wtyczka nie jest już dostępna (od 16.11.2015) w instalatorze wtyczek, ale możesz łatwo zbudować własną dzięki wtyczcePlugin Builder ”.

Zobaczę, jak łatwo można zintegrować się z fTools.


1
więc stworzyłeś własne rozwiązanie - dobrze zrobione - czy można je dodać do narzędzi?
Mapperz

Jestem pewien, że tak, muszę tylko spojrzeć na kodowanie fTools i napisać łatkę.
Nathan W

Fantastyczny! Takie rozwiązania to powód, dla którego lubię korzystać z QGIS. Dobra robota, Nathan - BTW Podoba mi się też twoja mała wtyczka typu katalogu!
Ando

@Ando Thanks! Testuję beta kilka nowych pomysłów, chciałbym tylko mieć więcej czasu, aby nad tym popracować, aby móc szybciej je wydobyć.
Nathan W

3
To naprawdę niesamowite, że opracowałeś rozwiązanie tak szybko i elegancko. Moc Open Source znów wygrywa!
RyanDalton


6

Po odpowiedzi Nathana możesz utworzyć akcję pythona w warstwie, w której chcesz zamienić linie:

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)

Będziesz mógł zamieniać linie jednym kliknięciem. Jest bardzo przyjazny dla użytkownika!


1
ten kod dotyczy 2.x
Denis Rouzaud,



4

Na podstawie postu Nathana stworzyłem skrypt przetwarzania, który odwraca kierunek funkcji:

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

wprowadź opis zdjęcia tutaj


Jak stworzyłeś gif?
whyzar


Do tej pory w przyborniku przetwarzania znajduje się narzędzie do zmiany kierunku.
AndreJ
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.