@@ -52,22 +52,22 @@ def processAlgorithm(self, progress):
52
52
fieldname = self .getParameterValue (Dissolve .FIELD )
53
53
vlayerA = dataobjects .getObjectFromUri (
54
54
self .getParameterValue (Dissolve .INPUT ))
55
- field = vlayerA .fieldNameIndex (fieldname )
56
55
vproviderA = vlayerA .dataProvider ()
57
- fields = vproviderA .fields ()
56
+ fields = vlayerA .fields ()
58
57
writer = self .getOutputFromName (
59
58
Dissolve .OUTPUT ).getVectorWriter (fields ,
60
59
vproviderA .geometryType (),
61
60
vproviderA .crs ())
62
61
outFeat = QgsFeature ()
63
62
nElement = 0
64
- nFeat = vproviderA .featureCount ()
63
+ features = vector .features (vlayerA )
64
+ nFeat = len (features )
65
+
65
66
if not useField :
66
67
first = True
67
- features = vector .features (vlayerA )
68
68
for inFeat in features :
69
69
nElement += 1
70
- progress .setPercentage (int (nElement / nFeat * 100 ))
70
+ progress .setPercentage (int (nElement * 100 / nFeat ))
71
71
if first :
72
72
attrs = inFeat .attributes ()
73
73
tmpInGeom = QgsGeometry (inFeat .geometry ())
@@ -85,37 +85,49 @@ def processAlgorithm(self, progress):
85
85
outFeat .setAttributes (attrs )
86
86
writer .addFeature (outFeat )
87
87
else :
88
- unique = vector .getUniqueValues (vlayerA , int (field ))
89
- nFeat = nFeat * len (unique )
88
+ fieldIdx = vlayerA .fieldNameIndex (fieldname )
89
+ unique = vector .getUniqueValues (vlayerA , int (fieldIdx ))
90
+ nFeat = len (unique )
91
+ myDict = {}
92
+ attrDict = {}
90
93
for item in unique :
91
- first = True
92
- add = True
93
- features = vector .features (vlayerA )
94
- for inFeat in features :
95
- nElement += 1
96
- progress .setPercentage (int (nElement / nFeat * 100 ))
97
- atMap = inFeat .attributes ()
98
- tempItem = atMap [field ]
99
- if unicode (tempItem ).strip () == unicode (item ).strip ():
100
- if first :
101
- QgsGeometry (inFeat .geometry ())
102
- tmpInGeom = QgsGeometry (inFeat .geometry ())
103
- outFeat .setGeometry (tmpInGeom )
104
- first = False
105
- attrs = inFeat .attributes ()
106
- else :
107
- tmpInGeom = QgsGeometry (inFeat .geometry ())
108
- tmpOutGeom = QgsGeometry (outFeat .geometry ())
109
- try :
110
- tmpOutGeom = QgsGeometry (
111
- tmpOutGeom .combine (tmpInGeom ))
112
- outFeat .setGeometry (tmpOutGeom )
113
- except :
114
- raise GeoAlgorithmExecutionException (
115
- self .tr ('Geometry exception while dissolving' ))
116
- if add :
117
- outFeat .setAttributes (attrs )
118
- writer .addFeature (outFeat )
94
+ myDict [unicode (item ).strip ()] = []
95
+ attrDict [unicode (item ).strip ()] = None
96
+
97
+ unique = None
98
+
99
+ for inFeat in features :
100
+ attrs = inFeat .attributes ()
101
+ tempItem = attrs [fieldIdx ]
102
+ tmpInGeom = QgsGeometry (inFeat .geometry ())
103
+
104
+ if attrDict [unicode (tempItem ).strip ()] == None :
105
+ # keep attributes of first feature
106
+ attrDict [unicode (tempItem ).strip ()] = attrs
107
+
108
+ myDict [unicode (tempItem ).strip ()].append (tmpInGeom )
109
+
110
+ features = None
111
+
112
+ for key , value in myDict .items ():
113
+ nElement += 1
114
+ progress .setPercentage (int (nElement * 100 / nFeat ))
115
+ for i in range (len (value )):
116
+ tmpInGeom = value [i ]
117
+
118
+ if i == 0 :
119
+ tmpOutGeom = tmpInGeom
120
+ else :
121
+ try :
122
+ tmpOutGeom = QgsGeometry (
123
+ tmpOutGeom .combine (tmpInGeom ))
124
+ except :
125
+ raise GeoAlgorithmExecutionException (
126
+ self .tr ('Geometry exception while dissolving' ))
127
+ outFeat .setGeometry (tmpOutGeom )
128
+ outFeat .setAttributes (attrDict [key ])
129
+ writer .addFeature (outFeat )
130
+
119
131
del writer
120
132
121
133
def defineCharacteristics (self ):
0 commit comments