30
30
from qgis .PyQt .QtGui import QIcon
31
31
from qgis .PyQt .QtCore import QVariant
32
32
from qgis .core import (QgsFields ,
33
- QgsProcessingUtils )
33
+ QgsProcessingUtils ,
34
+ QgsProcessingParameterMultipleLayers ,
35
+ QgsProcessingParameterDefinition ,
36
+ QgsProcessingParameterFeatureSink ,
37
+ QgsProcessingOutputVectorLayer ,
38
+ QgsMapLayer )
34
39
35
40
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
36
41
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
@@ -53,11 +58,12 @@ def group(self):
53
58
54
59
def __init__ (self ):
55
60
super ().__init__ ()
56
- self .addParameter (ParameterMultipleInput (self .LAYERS ,
57
- self .tr ('Layers to merge' ),
58
- datatype = dataobjects . TYPE_VECTOR_ANY ))
61
+ self .addParameter (QgsProcessingParameterMultipleLayers (self .LAYERS ,
62
+ self .tr ('Layers to merge' ),
63
+ QgsProcessingParameterDefinition . TypeVectorAny ))
59
64
60
- self .addOutput (OutputVector (self .OUTPUT , self .tr ('Merged' )))
65
+ self .addParameter (QgsProcessingParameterFeatureSink (self .OUTPUT , self .tr ('Merged' )))
66
+ self .addOutput (QgsProcessingOutputVectorLayer (self .OUTPUT , self .tr ('Merged' )))
61
67
62
68
def name (self ):
63
69
return 'mergevectorlayers'
@@ -66,13 +72,15 @@ def displayName(self):
66
72
return self .tr ('Merge vector layers' )
67
73
68
74
def processAlgorithm (self , parameters , context , feedback ):
69
- inLayers = self .getParameterValue ( self .LAYERS )
75
+ input_layers = self .parameterAsLayerList ( parameters , self .LAYERS , context )
70
76
71
77
layers = []
72
78
fields = QgsFields ()
73
79
totalFeatureCount = 0
74
- for layerSource in inLayers .split (';' ):
75
- layer = QgsProcessingUtils .mapLayerFromString (layerSource , context )
80
+ for layer in input_layers :
81
+ if layer .type () != QgsMapLayer .VectorLayer :
82
+ raise GeoAlgorithmExecutionException (
83
+ self .tr ('All layers must be vector layers!' ))
76
84
77
85
if (len (layers ) > 0 ):
78
86
if (layer .wkbType () != layers [0 ].wkbType ()):
@@ -96,12 +104,15 @@ def processAlgorithm(self, parameters, context, feedback):
96
104
fields .append (sfield )
97
105
98
106
total = 100.0 / totalFeatureCount
99
- writer = self .getOutputFromName ( self .OUTPUT ). getVectorWriter ( fields , layers [ 0 ]. wkbType () ,
100
- layers [0 ].crs (), context )
107
+ ( sink , dest_id ) = self .parameterAsSink ( parameters , self .OUTPUT , context ,
108
+ fields , layers [0 ].wkbType (), layers [ 0 ]. crs () )
101
109
102
110
featureCount = 0
103
111
for layer in layers :
104
112
for feature in layer .getFeatures ():
113
+ if feedback .isCanceled ():
114
+ break
115
+
105
116
sattributes = feature .attributes ()
106
117
dattributes = []
107
118
for dindex , dfield in enumerate (fields ):
@@ -123,8 +134,8 @@ def processAlgorithm(self, parameters, context, feedback):
123
134
dattributes .append (dattribute )
124
135
125
136
feature .setAttributes (dattributes )
126
- writer .addFeature (feature )
137
+ sink .addFeature (feature )
127
138
featureCount += 1
128
139
feedback .setProgress (int (featureCount * total ))
129
140
130
- del writer
141
+ return { self . OUTPUT : dest_id }
0 commit comments