Skip to content

Commit 64bf3a8

Browse files
author
Bernhard Ströbl
committedOct 20, 2015
[PROCESSING] Undo recent changes to Dissolve
1 parent 08527af commit 64bf3a8

File tree

1 file changed

+45
-62
lines changed

1 file changed

+45
-62
lines changed
 

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

Lines changed: 45 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@
2525

2626
__revision__ = '$Format:%H$'
2727

28-
from PyQt4.QtCore import QVariant
29-
from qgis.core import QgsFeature, QgsGeometry, QgsField, QgsFields
28+
from qgis.core import QgsFeature, QgsGeometry
3029
from processing.core.GeoAlgorithm import GeoAlgorithm
3130
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
3231
from processing.core.parameters import ParameterVector
32+
from processing.core.parameters import ParameterBoolean
3333
from processing.core.parameters import ParameterTableField
3434
from processing.core.outputs import OutputVector
3535
from processing.tools import vector, dataobjects
@@ -40,109 +40,92 @@ class Dissolve(GeoAlgorithm):
4040
INPUT = 'INPUT'
4141
OUTPUT = 'OUTPUT'
4242
FIELD = 'FIELD'
43+
DISSOLVE_ALL = 'DISSOLVE_ALL'
4344

4445
#==========================================================================
4546
#def getIcon(self):
4647
# return QtGui.QIcon(os.path.dirname(__file__) + "/icons/dissolve.png")
4748
#==========================================================================
4849

4950
def processAlgorithm(self, progress):
51+
useField = not self.getParameterValue(Dissolve.DISSOLVE_ALL)
52+
fieldname = self.getParameterValue(Dissolve.FIELD)
5053
vlayerA = dataobjects.getObjectFromUri(
5154
self.getParameterValue(Dissolve.INPUT))
55+
field = vlayerA.fieldNameIndex(fieldname)
5256
vproviderA = vlayerA.dataProvider()
53-
fields = QgsFields()
54-
fieldname = self.getParameterValue(Dissolve.FIELD)
55-
try:
56-
fieldIdx = vlayerA.fieldNameIndex(fieldname)
57-
field = vlayerA.fields().field(fieldname)
58-
fields.append(field)
59-
useField = True
60-
except:
61-
useField = False
62-
63-
countField = QgsField("count", QVariant.Int, '', 10, 0)
64-
fields.append(countField)
57+
fields = vproviderA.fields()
6558
writer = self.getOutputFromName(
6659
Dissolve.OUTPUT).getVectorWriter(fields,
6760
vproviderA.geometryType(),
6861
vproviderA.crs())
6962
outFeat = QgsFeature()
70-
outFeat.initAttributes(fields.count())
7163
nElement = 0
72-
nFeat = vlayerA.selectedFeatureCount()
73-
74-
if nFeat == 0:
75-
nFeat = vlayerA.featureCount()
76-
64+
nFeat = vproviderA.featureCount()
7765
if not useField:
7866
first = True
7967
features = vector.features(vlayerA)
8068
for inFeat in features:
8169
nElement += 1
82-
progress.setPercentage(int(nElement * 100 / nFeat))
70+
progress.setPercentage(int(nElement / nFeat * 100))
8371
if first:
84-
tmpOutGeom = QgsGeometry(inFeat.geometry())
72+
attrs = inFeat.attributes()
73+
tmpInGeom = QgsGeometry(inFeat.geometry())
74+
outFeat.setGeometry(tmpInGeom)
8575
first = False
8676
else:
8777
tmpInGeom = QgsGeometry(inFeat.geometry())
78+
tmpOutGeom = QgsGeometry(outFeat.geometry())
8879
try:
8980
tmpOutGeom = QgsGeometry(tmpOutGeom.combine(tmpInGeom))
81+
outFeat.setGeometry(tmpOutGeom)
9082
except:
9183
raise GeoAlgorithmExecutionException(
9284
self.tr('Geometry exception while dissolving'))
93-
outFeat.setGeometry(tmpOutGeom)
94-
outFeat[0] = nElement
85+
outFeat.setAttributes(attrs)
9586
writer.addFeature(outFeat)
9687
else:
97-
unique = vector.getUniqueValues(vlayerA, int(fieldIdx))
98-
nFeat = len(unique)
99-
myDict = {}
88+
unique = vector.getUniqueValues(vlayerA, int(field))
89+
nFeat = nFeat * len(unique)
10090
for item in unique:
101-
myDict[unicode(item).strip()] = []
102-
103-
features = vector.features(vlayerA)
104-
for inFeat in features:
105-
attrs = inFeat.attributes()
106-
tempItem = attrs[fieldIdx]
107-
tmpInGeom = QgsGeometry(inFeat.geometry())
108-
109-
if len(myDict[unicode(tempItem).strip()]) == 0:
110-
myDict[unicode(tempItem).strip()].append(tempItem)
111-
112-
myDict[unicode(tempItem).strip()].append(tmpInGeom)
113-
114-
for key, value in myDict.items():
115-
nElement += 1
116-
progress.setPercentage(int(nElement * 100 / nFeat))
117-
for i in range(len(value)):
118-
if i == 0:
119-
tempItem = value[i]
120-
continue
121-
else:
122-
tmpInGeom = value[i]
123-
124-
if i == 1:
125-
tmpOutGeom = tmpInGeom
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()
126106
else:
107+
tmpInGeom = QgsGeometry(inFeat.geometry())
108+
tmpOutGeom = QgsGeometry(outFeat.geometry())
127109
try:
128110
tmpOutGeom = QgsGeometry(
129111
tmpOutGeom.combine(tmpInGeom))
112+
outFeat.setGeometry(tmpOutGeom)
130113
except:
131114
raise GeoAlgorithmExecutionException(
132115
self.tr('Geometry exception while dissolving'))
133-
outFeat.setGeometry(tmpOutGeom)
134-
outFeat[0] = tempItem
135-
outFeat[1] = i
136-
writer.addFeature(outFeat)
116+
if add:
117+
outFeat.setAttributes(attrs)
118+
writer.addFeature(outFeat)
137119
del writer
138120

139121
def defineCharacteristics(self):
140-
self.name, self.i18n_name = self.trAlgorithm('Dissolve')
141-
self.group, self.i18n_group = self.trAlgorithm('Vector geometry tools')
122+
self.name = 'Dissolve'
123+
self.group = 'Vector geometry tools'
142124
self.addParameter(ParameterVector(Dissolve.INPUT,
143-
self.tr('Input layer'),
144-
[ParameterVector.VECTOR_TYPE_POLYGON, ParameterVector.VECTOR_TYPE_LINE]))
125+
self.tr('Input layer'),
126+
[ParameterVector.VECTOR_TYPE_POLYGON, ParameterVector.VECTOR_TYPE_LINE]))
127+
self.addParameter(ParameterBoolean(Dissolve.DISSOLVE_ALL,
128+
self.tr('Dissolve all (do not use field)'), True))
145129
self.addParameter(ParameterTableField(Dissolve.FIELD,
146-
self.tr('Dissolve field (if not set all features are dissolved)'),
147-
Dissolve.INPUT, optional=True))
130+
self.tr('Unique ID field'), Dissolve.INPUT, optional=True))
148131
self.addOutput(OutputVector(Dissolve.OUTPUT, self.tr('Dissolved')))

0 commit comments

Comments
 (0)
Please sign in to comment.