2727
2828import os
2929
30- from qgis .core import QgsFeature , QgsFeatureSink , QgsProcessingUtils
30+ from qgis .core import (QgsProcessing ,
31+ QgsWkbTypes )
3132
3233from 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
0 commit comments