Skip to content

Commit 9388303

Browse files
committed
Check for null/empty values before clustering
Having null or empty value is a case not considered in the algorithm. This will lead to a infinite loop since some features will not add to any region. If any of the attributes for the clutering or threshold appear as null/empty values, the plugin will display an error with the first feature that failed this condition.
1 parent 0c7baa3 commit 9388303

1 file changed

Lines changed: 38 additions & 26 deletions

File tree

workers.py

Lines changed: 38 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ def run(self):
3131
newfields.extend(provider.fields())
3232
newfields.append(maxpfield)
3333

34+
bad_value = -1
3435
clspyfeatures = {}
3536
for feat in provider.getFeatures():
3637
uid = feat.id()
@@ -42,37 +43,48 @@ def run(self):
4243
neighbors.discard(uid)
4344
thresholdval = feat.attribute(self.thresholdattr)
4445
attributeval = feat.attribute(self.attrname)
46+
47+
if thresholdval == None or attributeval == None:
48+
bad_value = uid
49+
break
50+
4551
clspyfeatures[uid] = ClusterpyFeature(uid, thresholdval,
4652
neighbors, attributeval)
4753

4854
outputmsg = None
49-
valid, islands = validtopology(clspyfeatures)
50-
if valid:
51-
self.progress.emit(1.0)
52-
regions = execmaxp(clspyfeatures,
53-
self.threshold,
54-
self.maxit,
55-
self.tabusize,
56-
self.tabumax,
57-
self.progress.emit)
58-
self.progress.emit(95.0)
59-
newlayer = QgsVectorFileWriter( self.output_path,
60-
None,
61-
newfields,
62-
provider.geometryType(),
63-
provider.crs())
55+
valid = True
56+
if bad_value != -1:
57+
valid = False
58+
outputmsg = "Please review feature with ID: " + str(bad_value) +\
59+
" and assign a numeric value to the NULL or empty attributes."
60+
else:
61+
valid, islands = validtopology(clspyfeatures)
62+
if valid:
63+
self.progress.emit(1.0)
64+
regions = execmaxp(clspyfeatures,
65+
self.threshold,
66+
self.maxit,
67+
self.tabusize,
68+
self.tabumax,
69+
self.progress.emit)
70+
self.progress.emit(95.0)
71+
newlayer = QgsVectorFileWriter( self.output_path,
72+
None,
73+
newfields,
74+
provider.geometryType(),
75+
provider.crs())
6476

65-
for area in self.layer.getFeatures():
66-
newarea = QgsFeature()
67-
newarea.setGeometry(area.geometry())
68-
attrs = area.attributes()
69-
attrs.append(regions[area.id()])
70-
newarea.setAttributes(attrs)
71-
newlayer.addFeature(newarea)
77+
for area in self.layer.getFeatures():
78+
newarea = QgsFeature()
79+
newarea.setGeometry(area.geometry())
80+
attrs = area.attributes()
81+
attrs.append(regions[area.id()])
82+
newarea.setAttributes(attrs)
83+
newlayer.addFeature(newarea)
7284

73-
del newlayer
74-
outputmsg = self.output_path
75-
else:
76-
outputmsg = self.ERROR_MSG + str(map(str, islands))
85+
del newlayer
86+
outputmsg = self.output_path
87+
else:
88+
outputmsg = self.ERROR_MSG + str(map(str, islands))
7789
self.progress.emit(100.0)
7890
self.finished.emit(valid, outputmsg)

0 commit comments

Comments
 (0)