29
29
import os
30
30
31
31
from qgis .PyQt .QtGui import QIcon
32
- from qgis .core import QgsProcessingUtils
32
+ from qgis .core import (QgsProcessingUtils ,
33
+ QgsProcessingParameterFeatureSource ,
34
+ QgsProcessingParameterField ,
35
+ QgsProcessingParameterFolderOutput ,
36
+ QgsProcessingOutputFolder ,
37
+ QgsExpression ,
38
+ QgsFeatureRequest )
33
39
34
40
from processing .algs .qgis .QgisAlgorithm import QgisAlgorithm
35
41
from processing .core .parameters import ParameterVector
@@ -55,11 +61,17 @@ def group(self):
55
61
56
62
def __init__ (self ):
57
63
super ().__init__ ()
58
- self .addParameter (ParameterVector (self .INPUT ,
59
- self .tr ('Input layer' )))
60
- self .addParameter (ParameterTableField (self .FIELD ,
61
- self .tr ('Unique ID field' ), self .INPUT ))
62
- self .addOutput (OutputDirectory (self .OUTPUT , self .tr ('Output directory' )))
64
+
65
+ self .addParameter (QgsProcessingParameterFeatureSource (self .INPUT ,
66
+ self .tr ('Input layer' )))
67
+
68
+ self .addParameter (QgsProcessingParameterField (self .FIELD ,
69
+ self .tr ('Unique ID field' ), None , self .INPUT ))
70
+
71
+ self .addParameter (QgsProcessingParameterFolderOutput (self .OUTPUT ,
72
+ self .tr ('Output directory' )))
73
+
74
+ self .addOutput (QgsProcessingOutputFolder (self .OUTPUT , self .tr ('Output directory' )))
63
75
64
76
def name (self ):
65
77
return 'splitvectorlayer'
@@ -68,29 +80,42 @@ def displayName(self):
68
80
return self .tr ('Split vector layer' )
69
81
70
82
def processAlgorithm (self , parameters , context , feedback ):
71
- layer = QgsProcessingUtils . mapLayerFromString ( self .getParameterValue ( self .INPUT ) , context )
72
- fieldName = self .getParameterValue ( self .FIELD )
73
- directory = self .getOutputValue ( self .OUTPUT )
83
+ source = self .parameterAsSource ( parameters , self .INPUT , context )
84
+ fieldName = self .parameterAsString ( parameters , self .FIELD , context )
85
+ directory = self .parameterAsString ( parameters , self .OUTPUT , context )
74
86
75
87
mkdir (directory )
76
88
77
- fieldIndex = layer .fields ().lookupField (fieldName )
78
- uniqueValues = QgsProcessingUtils .uniqueValues (layer , fieldIndex , context )
79
- baseName = os .path .join (directory , '{0}_{1} ' .format (layer . name (), fieldName ))
89
+ fieldIndex = source .fields ().lookupField (fieldName )
90
+ uniqueValues = source .uniqueValues (fieldIndex )
91
+ baseName = os .path .join (directory , '{0}' .format (fieldName ))
80
92
81
- fields = layer .fields ()
82
- crs = layer . crs ()
83
- geomType = layer .wkbType ()
93
+ fields = source .fields ()
94
+ crs = source . sourceCrs ()
95
+ geomType = source .wkbType ()
84
96
85
97
total = 100.0 / len (uniqueValues )
86
98
87
99
for current , i in enumerate (uniqueValues ):
100
+ if feedback .isCanceled ():
101
+ break
88
102
fName = u'{0}_{1}.shp' .format (baseName , str (i ).strip ())
103
+ feedback .pushInfo (self .tr ('Creating layer: {}' ).format (fName ))
89
104
90
- writer , dest = QgsProcessingUtils .createFeatureSink (fName , context , fields , geomType , crs )
91
- for f in QgsProcessingUtils .getFeatures (layer , context ):
92
- if f [fieldName ] == i :
93
- writer .addFeature (f )
94
- del writer
105
+ sink , dest = QgsProcessingUtils .createFeatureSink (fName , context , fields , geomType , crs )
106
+
107
+ filter = '{} = {}' .format (QgsExpression .quotedColumnRef (fieldName ), QgsExpression .quotedValue (i ))
108
+ req = QgsFeatureRequest ().setFilterExpression (filter )
109
+
110
+ count = 0
111
+ for f in source .getFeatures (req ):
112
+ if feedback .isCanceled ():
113
+ break
114
+ sink .addFeature (f )
115
+ count += 1
116
+ feedback .pushInfo (self .tr ('Added {} features to layer' ).format (count ))
117
+ del sink
95
118
96
119
feedback .setProgress (int (current * total ))
120
+
121
+ return {self .OUTPUT : directory }
0 commit comments