Geographic Information Systems Asked on July 26, 2021
Something that is hopefully pretty easy.
I would like to be able to swap the direction of a polyline/line in QGIS. I made a custom tool to do this in MapInfo a couple of years ago, however I can’t seem to find anything for QGIS.
Does anyone know of a tool to do this?
If one doesn’t exist then I’m happy to have a go at making it, just didn’t want to if one has already been made.
Ok here is the Python that I used to do it:
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)
Before running the above code:
Run the above python code by:
It should output "True" for each feature whose direction was swapped. If it outputs "False" then it didn't swap that feature's direction. This will happen if the layer doesn't have Editing toggled on.
Pretty easy!
I have wrapped it up in a plugin called Swap Line Direction
and it's available in the QGIS plugin installer.
This plugin is no longer available (as of 11/16/2015) in the plugin installer but you can build your own pretty easily with the "Plugin Builder" plugin.
I'll have a look at how easy it is to intergrate with fTools.
Correct answer by Nathan W on July 26, 2021
If you have the GRASS plugin use the v.flip option - http://grass.osgeo.org/wiki/GRASS_AddOns#v.flip
Answered by Mapperz on July 26, 2021
Following Nathan's answer, you can create a python action in the layer where you want to swap lines:
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)
You will be able to swap lines by one click on them. It is much user-friendly!
Answered by Denis Rouzaud on July 26, 2021
This plugin will switch the direction of a polyline.
Answered by GreyHippo on July 26, 2021
This plugin reverses the line direction too:
https://hub.qgis.org/projects/swapvectordirection
You have to select a feature, and turn the layer into edit mode before clicking on the plugin icon.
Answered by AndreJ on July 26, 2021
Based on Nathan's post I've created a processing script to reverse the direction of features:
#!/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()
Answered by eclipsed_by_the_moon on July 26, 2021
(Using QGIS 3.10)
Following @Nathan W 's answer above, here's a solution if your line is a LineStringZ (i.e. a line with an x, y and Z value) - as are most Google Earth KML files (even if that Z value = 0, which is often the case.)
You might get this error when the nodes.reverse call is made in the code below:
TypeError: index 0 has type 'QgsPointXY' but 'QgsPoint' is expected
1 layer = qgis.utils.iface.mapCanvas().currentLayer()
2 for feature in layer.selectedFeatures():
3 geom = feature.geometry()
4 nodes = geom.asPolyline()
5 nodes.reverse()
6 newgeom = QgsGeometry.fromPolyline(nodes)
7 layer.changeGeometry(feature.id(),newgeom)
The solution to that is to use QgsGeometry.fromPolylineXY() instead in line 6:
1 vLayer = qgis.utils.iface.mapCanvas().currentLayer()
2 for feat in vLayer.selectedFeatures():
3 geom = feat.geometry()
4 pointXY_nodes = geom.asPolyline() # >>> returns list of QgsPointXY objects: [<QgsPointXY: POINT(-117.60560599 ..
5 pointXY_nodes.reverse()
6 newgeom = QgsGeometry.fromPolylineXY(pointXY_nodes)
7 vLayer.changeGeometry(feat.id(),newgeom)
8 print("Geom reversed!")
Answered by grego on July 26, 2021
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP