25
25
26
26
__revision__ = '$Format:%H$'
27
27
28
- from PyQt4 .QtCore import QVariant
29
- from qgis .core import QgsFeature , QgsGeometry , QgsField , QgsFields
28
+ from qgis .core import QgsFeature , QgsGeometry
30
29
from processing .core .GeoAlgorithm import GeoAlgorithm
31
30
from processing .core .GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
32
31
from processing .core .parameters import ParameterVector
32
+ from processing .core .parameters import ParameterBoolean
33
33
from processing .core .parameters import ParameterTableField
34
34
from processing .core .outputs import OutputVector
35
35
from processing .tools import vector , dataobjects
@@ -40,109 +40,92 @@ class Dissolve(GeoAlgorithm):
40
40
INPUT = 'INPUT'
41
41
OUTPUT = 'OUTPUT'
42
42
FIELD = 'FIELD'
43
+ DISSOLVE_ALL = 'DISSOLVE_ALL'
43
44
44
45
#==========================================================================
45
46
#def getIcon(self):
46
47
# return QtGui.QIcon(os.path.dirname(__file__) + "/icons/dissolve.png")
47
48
#==========================================================================
48
49
49
50
def processAlgorithm (self , progress ):
51
+ useField = not self .getParameterValue (Dissolve .DISSOLVE_ALL )
52
+ fieldname = self .getParameterValue (Dissolve .FIELD )
50
53
vlayerA = dataobjects .getObjectFromUri (
51
54
self .getParameterValue (Dissolve .INPUT ))
55
+ field = vlayerA .fieldNameIndex (fieldname )
52
56
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 ()
65
58
writer = self .getOutputFromName (
66
59
Dissolve .OUTPUT ).getVectorWriter (fields ,
67
60
vproviderA .geometryType (),
68
61
vproviderA .crs ())
69
62
outFeat = QgsFeature ()
70
- outFeat .initAttributes (fields .count ())
71
63
nElement = 0
72
- nFeat = vlayerA .selectedFeatureCount ()
73
-
74
- if nFeat == 0 :
75
- nFeat = vlayerA .featureCount ()
76
-
64
+ nFeat = vproviderA .featureCount ()
77
65
if not useField :
78
66
first = True
79
67
features = vector .features (vlayerA )
80
68
for inFeat in features :
81
69
nElement += 1
82
- progress .setPercentage (int (nElement * 100 / nFeat ))
70
+ progress .setPercentage (int (nElement / nFeat * 100 ))
83
71
if first :
84
- tmpOutGeom = QgsGeometry (inFeat .geometry ())
72
+ attrs = inFeat .attributes ()
73
+ tmpInGeom = QgsGeometry (inFeat .geometry ())
74
+ outFeat .setGeometry (tmpInGeom )
85
75
first = False
86
76
else :
87
77
tmpInGeom = QgsGeometry (inFeat .geometry ())
78
+ tmpOutGeom = QgsGeometry (outFeat .geometry ())
88
79
try :
89
80
tmpOutGeom = QgsGeometry (tmpOutGeom .combine (tmpInGeom ))
81
+ outFeat .setGeometry (tmpOutGeom )
90
82
except :
91
83
raise GeoAlgorithmExecutionException (
92
84
self .tr ('Geometry exception while dissolving' ))
93
- outFeat .setGeometry (tmpOutGeom )
94
- outFeat [0 ] = nElement
85
+ outFeat .setAttributes (attrs )
95
86
writer .addFeature (outFeat )
96
87
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 )
100
90
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 ()
126
106
else :
107
+ tmpInGeom = QgsGeometry (inFeat .geometry ())
108
+ tmpOutGeom = QgsGeometry (outFeat .geometry ())
127
109
try :
128
110
tmpOutGeom = QgsGeometry (
129
111
tmpOutGeom .combine (tmpInGeom ))
112
+ outFeat .setGeometry (tmpOutGeom )
130
113
except :
131
114
raise GeoAlgorithmExecutionException (
132
115
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 )
137
119
del writer
138
120
139
121
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'
142
124
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 ))
145
129
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 ))
148
131
self .addOutput (OutputVector (Dissolve .OUTPUT , self .tr ('Dissolved' )))
0 commit comments