diff --git a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py index 44cc9f96573..91fb25b96c1 100644 --- a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py +++ b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py @@ -132,6 +132,7 @@ from Datasources2Vrt import Datasources2Vrt from CheckValidity import CheckValidity from OrientedMinimumBoundingBox import OrientedMinimumBoundingBox from Smooth import Smooth +from ReverseLineDirection import ReverseLineDirection pluginPath = os.path.normpath(os.path.join( os.path.split(os.path.dirname(__file__))[0], os.pardir)) @@ -180,7 +181,8 @@ class QGISAlgorithmProvider(AlgorithmProvider): SelectByExpression(), HypsometricCurves(), SplitLinesWithLines(), CreateConstantRaster(), FieldsMapper(), SelectByAttributeSum(), Datasources2Vrt(), - CheckValidity(), OrientedMinimumBoundingBox(), Smooth() + CheckValidity(), OrientedMinimumBoundingBox(), Smooth(), + ReverseLineDirection() ] if hasMatplotlib: diff --git a/python/plugins/processing/algs/qgis/ReverseLineDirection.py b/python/plugins/processing/algs/qgis/ReverseLineDirection.py new file mode 100644 index 00000000000..2f2cb87e610 --- /dev/null +++ b/python/plugins/processing/algs/qgis/ReverseLineDirection.py @@ -0,0 +1,84 @@ +# -*- coding: utf-8 -*- + +""" +*************************************************************************** + ReverseLineDirection.py + ----------------------- + Date : November 2015 + Copyright : (C) 2015 by Nyall Dawson + Email : nyall dot dawson at gmail dot com +*************************************************************************** +* * +* This program is free software; you can redistribute it and/or modify * +* it under the terms of the GNU General Public License as published by * +* the Free Software Foundation; either version 2 of the License, or * +* (at your option) any later version. * +* * +*************************************************************************** +""" + +__author__ = 'Nyall Dawson' +__date__ = 'November 2015' +__copyright__ = '(C) 2015, Nyall Dawson' + +# This will get replaced with a git SHA1 when you do a git archive323 + +__revision__ = '$Format:%H$' + +from qgis.core import QGis, QgsGeometry, QgsFeature +from processing.core.GeoAlgorithm import GeoAlgorithm +from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException +from processing.core.parameters import ParameterVector, ParameterNumber +from processing.core.outputs import OutputVector +from processing.tools import dataobjects, vector + + +class ReverseLineDirection(GeoAlgorithm): + + INPUT_LAYER = 'INPUT_LAYER' + OUTPUT_LAYER = 'OUTPUT_LAYER' + + def defineCharacteristics(self): + self.name, self.i18n_name = self.trAlgorithm('Reverse line direction') + self.group, self.i18n_group = self.trAlgorithm('Vector geometry tools') + + self.addParameter(ParameterVector(self.INPUT_LAYER, + self.tr('Input layer'), [ParameterVector.VECTOR_TYPE_LINE])) + self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Reversed'))) + + def processAlgorithm(self, progress): + layer = dataobjects.getObjectFromUri( + self.getParameterValue(self.INPUT_LAYER)) + provider = layer.dataProvider() + + writer = self.getOutputFromName( + self.OUTPUT_LAYER).getVectorWriter( + layer.fields().toList(), + provider.geometryType(), + layer.crs()) + + outFeat = QgsFeature() + + features = vector.features(layer) + total = 100.0 / float(len(features)) + current = 0 + + for inFeat in features: + inGeom = inFeat.constGeometry() + attrs = inFeat.attributes() + + outGeom = None + if inGeom and not inGeom.isEmpty(): + reversedLine = inGeom.geometry().reversed() + if reversedLine is None: + raise GeoAlgorithmExecutionException( + self.tr('Error reversing line')) + outGeom = QgsGeometry(reversedLine) + + outFeat.setGeometry(outGeom) + outFeat.setAttributes(attrs) + writer.addFeature(outFeat) + current += 1 + progress.setPercentage(int(current * total)) + + del writer