diff --git a/python/plugins/processing/algs/qgis/MergeLines.py b/python/plugins/processing/algs/qgis/MergeLines.py index 8941217e430..736b5fe5450 100644 --- a/python/plugins/processing/algs/qgis/MergeLines.py +++ b/python/plugins/processing/algs/qgis/MergeLines.py @@ -27,23 +27,18 @@ __revision__ = '$Format:%H$' import os -from qgis.core import QgsFeature, QgsFeatureSink, QgsProcessingUtils +from qgis.core import (QgsProcessing, + QgsWkbTypes) from qgis.PyQt.QtGui import QIcon -from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm -from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException -from processing.core.parameters import ParameterVector -from processing.core.outputs import OutputVector -from processing.tools import dataobjects +from processing.algs.qgis.QgisAlgorithm import QgisFeatureBasedAlgorithm + pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0] -class MergeLines(QgisAlgorithm): - - INPUT_LAYER = 'INPUT_LAYER' - OUTPUT_LAYER = 'OUTPUT_LAYER' +class MergeLines(QgisFeatureBasedAlgorithm): def icon(self): return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'to_lines.png')) @@ -57,41 +52,27 @@ class MergeLines(QgisAlgorithm): def __init__(self): super().__init__() - def initAlgorithm(self, config=None): - self.addParameter(ParameterVector(self.INPUT_LAYER, - self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE])) - self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Merged'), datatype=[dataobjects.TYPE_VECTOR_LINE])) - def name(self): return 'mergelines' def displayName(self): return self.tr('Merge lines') - def processAlgorithm(self, parameters, context, feedback): - layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context) + def outputName(self): + return self.tr('Merged') - writer = self.getOutputFromName( - self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context) + def outputType(self): + return QgsProcessing.TypeVectorLine - features = QgsProcessingUtils.getFeatures(layer, context) - total = 100.0 / layer.featureCount() if layer.featureCount() else 0 + def outputWkbType(self, input_wkb): + return QgsWkbTypes.MultiLineString - for current, inFeat in enumerate(features): - outFeat = QgsFeature() - attrs = inFeat.attributes() - outFeat.setAttributes(attrs) + def processFeature(self, feature, feedback): + input_geometry = feature.geometry() + if input_geometry: + output_geometry = input_geometry.mergeLines() + if not output_geometry: + feedback.reportError(self.tr('Error merging lines for feature {}').format(feature.id())) - inGeom = inFeat.geometry() - if inGeom: - outGeom = inGeom.mergeLines() - if outGeom is None: - raise GeoAlgorithmExecutionException( - self.tr('Error merging lines')) - - outFeat.setGeometry(outGeom) - - writer.addFeature(outFeat, QgsFeatureSink.FastInsert) - feedback.setProgress(int(current * total)) - - del writer + feature.setGeometry(output_geometry) + return feature diff --git a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py index 3c6794203d5..7e1b00d919e 100644 --- a/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py +++ b/python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py @@ -73,6 +73,7 @@ from .LinesIntersection import LinesIntersection from .LinesToPolygons import LinesToPolygons from .MeanCoords import MeanCoords from .Merge import Merge +from .MergeLines import MergeLines from .NearestNeighbourAnalysis import NearestNeighbourAnalysis from .OffsetLine import OffsetLine from .Orthogonalize import Orthogonalize @@ -158,7 +159,6 @@ from .ZonalStatistics import ZonalStatistics # from .DefineProjection import DefineProjection # from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable # from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed -# from .MergeLines import MergeLines # from .PointsAlongGeometry import PointsAlongGeometry # from .Relief import Relief # from .IdwInterpolation import IdwInterpolation @@ -213,7 +213,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider): # OrientedMinimumBoundingBox(), # SpatialIndex(), DefineProjection(), # RectanglesOvalsDiamondsVariable(), - # RectanglesOvalsDiamondsFixed(), MergeLines(), + # RectanglesOvalsDiamondsFixed(), # PointsAlongGeometry(), # Relief(), # IdwInterpolation(), TinInterpolation(), @@ -258,6 +258,7 @@ class QGISAlgorithmProvider(QgsProcessingProvider): LinesToPolygons(), MeanCoords(), Merge(), + MergeLines(), NearestNeighbourAnalysis(), OffsetLine(), Orthogonalize(), diff --git a/python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml b/python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml index 828aaef28e0..08636d90d51 100644 --- a/python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml +++ b/python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml @@ -389,18 +389,18 @@ tests: # compare: # geometry: # precision: 7 -# -# - algorithm: qgis:mergelines -# name: Merge lines algorithm -# params: -# INPUT_LAYER: -# name: multilines.gml -# type: vector -# results: -# OUTPUT_LAYER: -# name: expected/merge_lines.gml -# type: vector -# + + - algorithm: qgis:mergelines + name: Merge lines algorithm + params: + INPUT: + name: multilines.gml + type: vector + results: + OUTPUT: + name: expected/merge_lines.gml + type: vector + - algorithm: native:multiparttosingleparts name: Multiparts to singleparts params: