Skip to content

Commit 5585805

Browse files
committed
Port merge lines algorithm to new API
1 parent 95be6d1 commit 5585805

File tree

3 files changed

+34
-52
lines changed

3 files changed

+34
-52
lines changed

python/plugins/processing/algs/qgis/MergeLines.py

Lines changed: 19 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -27,23 +27,18 @@
2727

2828
import os
2929

30-
from qgis.core import QgsFeature, QgsFeatureSink, QgsProcessingUtils
30+
from qgis.core import (QgsProcessing,
31+
QgsWkbTypes)
3132

3233
from qgis.PyQt.QtGui import QIcon
3334

34-
from processing.algs.qgis.QgisAlgorithm import QgisAlgorithm
35-
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
36-
from processing.core.parameters import ParameterVector
37-
from processing.core.outputs import OutputVector
38-
from processing.tools import dataobjects
35+
from processing.algs.qgis.QgisAlgorithm import QgisFeatureBasedAlgorithm
3936

40-
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4137

38+
pluginPath = os.path.split(os.path.split(os.path.dirname(__file__))[0])[0]
4239

43-
class MergeLines(QgisAlgorithm):
4440

45-
INPUT_LAYER = 'INPUT_LAYER'
46-
OUTPUT_LAYER = 'OUTPUT_LAYER'
41+
class MergeLines(QgisFeatureBasedAlgorithm):
4742

4843
def icon(self):
4944
return QIcon(os.path.join(pluginPath, 'images', 'ftools', 'to_lines.png'))
@@ -57,41 +52,27 @@ def group(self):
5752
def __init__(self):
5853
super().__init__()
5954

60-
def initAlgorithm(self, config=None):
61-
self.addParameter(ParameterVector(self.INPUT_LAYER,
62-
self.tr('Input layer'), [dataobjects.TYPE_VECTOR_LINE]))
63-
self.addOutput(OutputVector(self.OUTPUT_LAYER, self.tr('Merged'), datatype=[dataobjects.TYPE_VECTOR_LINE]))
64-
6555
def name(self):
6656
return 'mergelines'
6757

6858
def displayName(self):
6959
return self.tr('Merge lines')
7060

71-
def processAlgorithm(self, parameters, context, feedback):
72-
layer = QgsProcessingUtils.mapLayerFromString(self.getParameterValue(self.INPUT_LAYER), context)
73-
74-
writer = self.getOutputFromName(
75-
self.OUTPUT_LAYER).getVectorWriter(layer.fields(), layer.wkbType(), layer.crs(), context)
76-
77-
features = QgsProcessingUtils.getFeatures(layer, context)
78-
total = 100.0 / layer.featureCount() if layer.featureCount() else 0
79-
80-
for current, inFeat in enumerate(features):
81-
outFeat = QgsFeature()
82-
attrs = inFeat.attributes()
83-
outFeat.setAttributes(attrs)
61+
def outputName(self):
62+
return self.tr('Merged')
8463

85-
inGeom = inFeat.geometry()
86-
if inGeom:
87-
outGeom = inGeom.mergeLines()
88-
if outGeom is None:
89-
raise GeoAlgorithmExecutionException(
90-
self.tr('Error merging lines'))
64+
def outputType(self):
65+
return QgsProcessing.TypeVectorLine
9166

92-
outFeat.setGeometry(outGeom)
67+
def outputWkbType(self, input_wkb):
68+
return QgsWkbTypes.MultiLineString
9369

94-
writer.addFeature(outFeat, QgsFeatureSink.FastInsert)
95-
feedback.setProgress(int(current * total))
70+
def processFeature(self, feature, feedback):
71+
input_geometry = feature.geometry()
72+
if input_geometry:
73+
output_geometry = input_geometry.mergeLines()
74+
if not output_geometry:
75+
feedback.reportError(self.tr('Error merging lines for feature {}').format(feature.id()))
9676

97-
del writer
77+
feature.setGeometry(output_geometry)
78+
return feature

python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,7 @@
7373
from .LinesToPolygons import LinesToPolygons
7474
from .MeanCoords import MeanCoords
7575
from .Merge import Merge
76+
from .MergeLines import MergeLines
7677
from .NearestNeighbourAnalysis import NearestNeighbourAnalysis
7778
from .OffsetLine import OffsetLine
7879
from .Orthogonalize import Orthogonalize
@@ -158,7 +159,6 @@
158159
# from .DefineProjection import DefineProjection
159160
# from .RectanglesOvalsDiamondsVariable import RectanglesOvalsDiamondsVariable
160161
# from .RectanglesOvalsDiamondsFixed import RectanglesOvalsDiamondsFixed
161-
# from .MergeLines import MergeLines
162162
# from .PointsAlongGeometry import PointsAlongGeometry
163163
# from .Relief import Relief
164164
# from .IdwInterpolation import IdwInterpolation
@@ -213,7 +213,7 @@ def getAlgs(self):
213213
# OrientedMinimumBoundingBox(),
214214
# SpatialIndex(), DefineProjection(),
215215
# RectanglesOvalsDiamondsVariable(),
216-
# RectanglesOvalsDiamondsFixed(), MergeLines(),
216+
# RectanglesOvalsDiamondsFixed(),
217217
# PointsAlongGeometry(),
218218
# Relief(),
219219
# IdwInterpolation(), TinInterpolation(),
@@ -258,6 +258,7 @@ def getAlgs(self):
258258
LinesToPolygons(),
259259
MeanCoords(),
260260
Merge(),
261+
MergeLines(),
261262
NearestNeighbourAnalysis(),
262263
OffsetLine(),
263264
Orthogonalize(),

python/plugins/processing/tests/testdata/qgis_algorithm_tests.yaml

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -389,18 +389,18 @@ tests:
389389
# compare:
390390
# geometry:
391391
# precision: 7
392-
#
393-
# - algorithm: qgis:mergelines
394-
# name: Merge lines algorithm
395-
# params:
396-
# INPUT_LAYER:
397-
# name: multilines.gml
398-
# type: vector
399-
# results:
400-
# OUTPUT_LAYER:
401-
# name: expected/merge_lines.gml
402-
# type: vector
403-
#
392+
393+
- algorithm: qgis:mergelines
394+
name: Merge lines algorithm
395+
params:
396+
INPUT:
397+
name: multilines.gml
398+
type: vector
399+
results:
400+
OUTPUT:
401+
name: expected/merge_lines.gml
402+
type: vector
403+
404404
- algorithm: native:multiparttosingleparts
405405
name: Multiparts to singleparts
406406
params:

0 commit comments

Comments
 (0)