Skip to content

Commit 9f13601

Browse files
committed
review Random selection and Random selection within subsets
1 parent 708b679 commit 9f13601

File tree

2 files changed

+107
-67
lines changed

2 files changed

+107
-67
lines changed
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,62 @@
1-
from sextante.core.GeoAlgorithm import GeoAlgorithm
21
import os.path
2+
import random
3+
34
from PyQt4 import QtGui
45
from PyQt4.QtCore import *
5-
from PyQt4.QtGui import *
6+
67
from qgis.core import *
7-
from sextante.parameters.ParameterVector import ParameterVector
8+
9+
from sextante.core.GeoAlgorithm import GeoAlgorithm
10+
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
811
from sextante.core.QGisLayers import QGisLayers
9-
from sextante.outputs.OutputVector import OutputVector
12+
1013
from sextante.parameters.ParameterSelection import ParameterSelection
14+
from sextante.parameters.ParameterVector import ParameterVector
1115
from sextante.parameters.ParameterNumber import ParameterNumber
12-
import random
16+
17+
from sextante.outputs.OutputVector import OutputVector
1318

1419
class RandomSelection(GeoAlgorithm):
1520

1621
INPUT = "INPUT"
1722
OUTPUT = "OUTPUT"
1823
METHOD = "METHOD"
1924
NUMBER = "NUMBER"
20-
PERCENTAGE = "PERCENTAGE"
25+
26+
METHODS = ["Number of selected features",
27+
"Percentage of selected features"
28+
]
2129

2230
def getIcon(self):
2331
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/random_selection.png")
2432

33+
def defineCharacteristics(self):
34+
self.name = "Random selection"
35+
self.group = "Research tools"
36+
37+
self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
38+
self.addParameter(ParameterSelection(self.METHOD, "Method", self.METHODS, 0))
39+
self.addParameter(ParameterNumber(self.NUMBER, "Number/persentage of selected features", 1, None, 10))
40+
self.addOutput(OutputVector(self.OUTPUT, "Selection", True))
41+
2542
def processAlgorithm(self, progress):
26-
filename = self.getParameterValue(RandomSelection.INPUT)
43+
filename = self.getParameterValue(self.INPUT)
2744
layer = QGisLayers.getObjectFromUri(filename)
2845
method = self.getParameterValue(self.METHOD)
46+
47+
featureCount = layer.featureCount()
48+
49+
value = int(self.getParameterValue(self.NUMBER))
50+
2951
if method == 0:
30-
value = int(self.getParameterValue(self.NUMBER))
52+
if value > featureCount:
53+
raise GeoAlgorithmExecutionException("Selected number is greater that feature count. Choose lesser value and try again.")
3154
else:
32-
value = self.getParameterValue(self.PERCENTAGE)
33-
value = int(round((value / 100.0000), 4) * layer.featureCount())
34-
selran = random.sample(xrange(0, layer.featureCount()), value)
35-
layer.setSelectedFeatures(selran)
36-
self.setOutputValue(self.OUTPUT, filename)
55+
if value > 100:
56+
raise GeoAlgorithmExecutionException("Persentage can't be greater than 100. Set corrent value and try again.")
57+
value = int(round((value / 100.0000), 4) * featureCount)
3758

59+
selran = random.sample(xrange(0, featureCount), value)
3860

39-
def defineCharacteristics(self):
40-
self.name = "Random selection"
41-
self.group = "Research tools"
42-
self.addParameter(ParameterVector(RandomSelection.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
43-
self.addParameter(ParameterSelection(RandomSelection.METHOD, "Method", ["Number of selected features", "Percentage of selected features"]))
44-
self.addParameter(ParameterNumber(RandomSelection.NUMBER, "Number of selected features", 1, None, 10))
45-
self.addParameter(ParameterNumber(RandomSelection.PERCENTAGE, "Percentage of selected features", 0, 100, 50))
46-
self.addOutput(OutputVector(RandomSelection.OUTPUT, "Selection", True))
61+
layer.setSelectedFeatures(selran)
62+
self.setOutputValue(self.OUTPUT, filename)
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,102 @@
1-
from sextante.core.GeoAlgorithm import GeoAlgorithm
21
import os.path
2+
import random
3+
34
from PyQt4 import QtGui
45
from PyQt4.QtCore import *
5-
from PyQt4.QtGui import *
6+
67
from qgis.core import *
7-
from sextante.parameters.ParameterVector import ParameterVector
8+
9+
from sextante.core.GeoAlgorithm import GeoAlgorithm
10+
from sextante.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
811
from sextante.core.QGisLayers import QGisLayers
9-
from sextante.outputs.OutputVector import OutputVector
12+
1013
from sextante.parameters.ParameterSelection import ParameterSelection
14+
from sextante.parameters.ParameterVector import ParameterVector
1115
from sextante.parameters.ParameterNumber import ParameterNumber
12-
import random
1316
from sextante.parameters.ParameterTableField import ParameterTableField
14-
from sextante.ftools import ftools_utils
17+
18+
from sextante.outputs.OutputVector import OutputVector
1519

1620
class RandomSelectionWithinSubsets(GeoAlgorithm):
1721

1822
INPUT = "INPUT"
19-
OUTPUT = "OUTPUT"
2023
METHOD = "METHOD"
2124
NUMBER = "NUMBER"
22-
PERCENTAGE = "PERCENTAGE"
2325
FIELD = "FIELD"
26+
OUTPUT = "OUTPUT"
27+
28+
METHODS = ["Number of selected features",
29+
"Percentage of selected features"
30+
]
2431

2532
def getIcon(self):
2633
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/random_selection.png")
2734

35+
def defineCharacteristics(self):
36+
self.name = "Random selection within subsets"
37+
self.group = "Research tools"
38+
39+
self.addParameter(ParameterVector(self.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
40+
self.addParameter(ParameterTableField(self.FIELD, "ID Field", self.INPUT))
41+
self.addParameter(ParameterSelection(self.METHOD, "Method", self.METHODS, 0))
42+
self.addParameter(ParameterNumber(self.NUMBER, "Number/persentage of selected features", 1, None, 10))
43+
44+
self.addOutput(OutputVector(self.OUTPUT, "Selection", True))
45+
2846
def processAlgorithm(self, progress):
47+
filename = self.getParameterValue(self.INPUT)
48+
49+
layer = QGisLayers.getObjectFromUri(filename)
50+
field = self.getParameterValue(self.FIELD)
2951
method = self.getParameterValue(self.METHOD)
30-
field = self.getParameterValue(RandomSelectionWithinSubsets.FIELD)
31-
filename = self.getParameterValue(RandomSelectionWithinSubsets.INPUT)
32-
vlayer = QGisLayers.getObjectFromUri(filename)
33-
vlayer.removeSelection(True)
34-
vprovider = vlayer.dataProvider()
35-
allAttrs = vprovider.attributeIndexes()
36-
vprovider.select(allAttrs)
37-
index = vprovider.fieldNameIndex(field)
38-
unique = ftools_utils.getUniqueValues(vprovider, int(index))
39-
inFeat = QgsFeature()
52+
53+
layer.removeSelection(True)
54+
provider = layer.dataProvider()
55+
index = layer.fieldNameIndex(field)
56+
layer.select([index])
57+
58+
unique = layer.uniqueValues(index)
59+
featureCount = layer.featureCount()
60+
61+
value = int(self.getParameterValue(self.NUMBER))
62+
if method == 0:
63+
if value > featureCount:
64+
raise GeoAlgorithmExecutionException("Selected number is greater that feature count. Choose lesser value and try again.")
65+
else:
66+
if value > 100:
67+
raise GeoAlgorithmExecutionException("Persentage can't be greater than 100. Set corrent value and try again.")
68+
value = value / 100.0
69+
4070
selran = []
41-
nFeat = vprovider.featureCount() * len(unique)
42-
nElement = 0
43-
if not len(unique) == vlayer.featureCount():
71+
inFeat = QgsFeature()
72+
73+
current = 0
74+
total = 100.0 / float(featureCount * len(unique))
75+
76+
if not len(unique) == featureCount:
4477
for i in unique:
45-
vprovider.rewind()
4678
FIDs= []
47-
while vprovider.nextFeature(inFeat):
79+
layer.select([index])
80+
while layer.nextFeature(inFeat):
4881
atMap = inFeat.attributeMap()
4982
if atMap[index] == QVariant(i):
50-
FID = inFeat.id()
51-
FIDs.append(FID)
52-
nElement += 1
53-
progress.setPercentage(nElement/nFeat * 100)
54-
if method == 0:
55-
value = int(self.getParameterValue(self.NUMBER))
83+
FIDs.append(inFeat.id())
84+
current += 1
85+
progress.setPercentage(int(current * total))
86+
87+
if method == 1:
88+
selValue = int(round(value * len(FIDs), 0))
5689
else:
57-
value = self.getParameterValue(self.PERCENTAGE)
58-
value = int(round((value / 100.0000) * len(FIDs), 0))
59-
if value >= len(FIDs):
90+
selValue = value
91+
92+
if selValue >= len(FIDs):
6093
selFeat = FIDs
6194
else:
62-
selFeat = random.sample(FIDs, value)
95+
selFeat = random.sample(FIDs, selValue)
96+
6397
selran.extend(selFeat)
64-
vlayer.setSelectedFeatures(selran)
98+
layer.setSelectedFeatures(selran)
6599
else:
66-
vlayer.setSelectedFeatures(range(0, vlayer.featureCount()))
67-
self.setOutputValue(RandomSelectionWithinSubsets.OUTPUT, filename)
100+
layer.setSelectedFeatures(range(0, featureCount))
68101

69-
70-
def defineCharacteristics(self):
71-
self.name = "Random selection within subsets"
72-
self.group = "Research tools"
73-
self.addParameter(ParameterVector(RandomSelectionWithinSubsets.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
74-
self.addParameter(ParameterTableField(RandomSelectionWithinSubsets.FIELD, "ID Field", RandomSelectionWithinSubsets.INPUT))
75-
self.addParameter(ParameterSelection(RandomSelectionWithinSubsets.METHOD, "Method", ["Number of selected features", "Percentage of selected features"]))
76-
self.addParameter(ParameterNumber(RandomSelectionWithinSubsets.NUMBER, "Number of selected features", 1, None, 10))
77-
self.addParameter(ParameterNumber(RandomSelectionWithinSubsets.PERCENTAGE, "Percentage of selected features", 0, 100, 50))
78-
self.addOutput(OutputVector(RandomSelectionWithinSubsets.OUTPUT, "Selection", True))
102+
self.setOutputValue(self.OUTPUT, filename)

0 commit comments

Comments
 (0)