Skip to content

Commit 8803cb4

Browse files
committed
Merge pull request #2437 from bstroebl/improveDissolve
[PROCESSING] Speed up dissolve without changing parameters
2 parents b741986 + cfb932a commit 8803cb4

File tree

1 file changed

+47
-35
lines changed

1 file changed

+47
-35
lines changed

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

+47-35
Original file line numberDiff line numberDiff line change
@@ -52,22 +52,22 @@ def processAlgorithm(self, progress):
5252
fieldname = self.getParameterValue(Dissolve.FIELD)
5353
vlayerA = dataobjects.getObjectFromUri(
5454
self.getParameterValue(Dissolve.INPUT))
55-
field = vlayerA.fieldNameIndex(fieldname)
5655
vproviderA = vlayerA.dataProvider()
57-
fields = vproviderA.fields()
56+
fields = vlayerA.fields()
5857
writer = self.getOutputFromName(
5958
Dissolve.OUTPUT).getVectorWriter(fields,
6059
vproviderA.geometryType(),
6160
vproviderA.crs())
6261
outFeat = QgsFeature()
6362
nElement = 0
64-
nFeat = vproviderA.featureCount()
63+
features = vector.features(vlayerA)
64+
nFeat = len(features)
65+
6566
if not useField:
6667
first = True
67-
features = vector.features(vlayerA)
6868
for inFeat in features:
6969
nElement += 1
70-
progress.setPercentage(int(nElement / nFeat * 100))
70+
progress.setPercentage(int(nElement * 100 / nFeat))
7171
if first:
7272
attrs = inFeat.attributes()
7373
tmpInGeom = QgsGeometry(inFeat.geometry())
@@ -85,37 +85,49 @@ def processAlgorithm(self, progress):
8585
outFeat.setAttributes(attrs)
8686
writer.addFeature(outFeat)
8787
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 = {}
9093
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+
119131
del writer
120132

121133
def defineCharacteristics(self):

0 commit comments

Comments
 (0)