|
1 |
| -from sextante.core.GeoAlgorithm import GeoAlgorithm |
2 | 1 | import os.path
|
| 2 | +import random |
| 3 | + |
3 | 4 | from PyQt4 import QtGui
|
4 | 5 | from PyQt4.QtCore import *
|
5 |
| -from PyQt4.QtGui import * |
| 6 | + |
6 | 7 | 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 |
8 | 11 | from sextante.core.QGisLayers import QGisLayers
|
9 |
| -from sextante.outputs.OutputVector import OutputVector |
| 12 | + |
10 | 13 | from sextante.parameters.ParameterSelection import ParameterSelection
|
| 14 | +from sextante.parameters.ParameterVector import ParameterVector |
11 | 15 | from sextante.parameters.ParameterNumber import ParameterNumber
|
12 |
| -import random |
13 | 16 | from sextante.parameters.ParameterTableField import ParameterTableField
|
14 |
| -from sextante.ftools import ftools_utils |
| 17 | + |
| 18 | +from sextante.outputs.OutputVector import OutputVector |
15 | 19 |
|
16 | 20 | class RandomSelectionWithinSubsets(GeoAlgorithm):
|
17 | 21 |
|
18 | 22 | INPUT = "INPUT"
|
19 |
| - OUTPUT = "OUTPUT" |
20 | 23 | METHOD = "METHOD"
|
21 | 24 | NUMBER = "NUMBER"
|
22 |
| - PERCENTAGE = "PERCENTAGE" |
23 | 25 | FIELD = "FIELD"
|
| 26 | + OUTPUT = "OUTPUT" |
| 27 | + |
| 28 | + METHODS = ["Number of selected features", |
| 29 | + "Percentage of selected features" |
| 30 | + ] |
24 | 31 |
|
25 | 32 | def getIcon(self):
|
26 | 33 | return QtGui.QIcon(os.path.dirname(__file__) + "/icons/random_selection.png")
|
27 | 34 |
|
| 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 | + |
28 | 46 | def processAlgorithm(self, progress):
|
| 47 | + filename = self.getParameterValue(self.INPUT) |
| 48 | + |
| 49 | + layer = QGisLayers.getObjectFromUri(filename) |
| 50 | + field = self.getParameterValue(self.FIELD) |
29 | 51 | 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 | + |
40 | 70 | 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: |
44 | 77 | for i in unique:
|
45 |
| - vprovider.rewind() |
46 | 78 | FIDs= []
|
47 |
| - while vprovider.nextFeature(inFeat): |
| 79 | + layer.select([index]) |
| 80 | + while layer.nextFeature(inFeat): |
48 | 81 | atMap = inFeat.attributeMap()
|
49 | 82 | 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)) |
56 | 89 | 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): |
60 | 93 | selFeat = FIDs
|
61 | 94 | else:
|
62 |
| - selFeat = random.sample(FIDs, value) |
| 95 | + selFeat = random.sample(FIDs, selValue) |
| 96 | + |
63 | 97 | selran.extend(selFeat)
|
64 |
| - vlayer.setSelectedFeatures(selran) |
| 98 | + layer.setSelectedFeatures(selran) |
65 | 99 | else:
|
66 |
| - vlayer.setSelectedFeatures(range(0, vlayer.featureCount())) |
67 |
| - self.setOutputValue(RandomSelectionWithinSubsets.OUTPUT, filename) |
| 100 | + layer.setSelectedFeatures(range(0, featureCount)) |
68 | 101 |
|
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