mirror of
https://github.com/qgis/QGIS.git
synced 2025-03-06 00:05:02 -05:00
79 lines
3.6 KiB
Python
79 lines
3.6 KiB
Python
|
from sextante.core.GeoAlgorithm import GeoAlgorithm
|
||
|
import os.path
|
||
|
from PyQt4 import QtGui
|
||
|
from PyQt4.QtCore import *
|
||
|
from PyQt4.QtGui import *
|
||
|
from qgis.core import *
|
||
|
from sextante.parameters.ParameterVector import ParameterVector
|
||
|
from sextante.core.QGisLayers import QGisLayers
|
||
|
from sextante.outputs.OutputVector import OutputVector
|
||
|
from sextante.parameters.ParameterSelection import ParameterSelection
|
||
|
from sextante.parameters.ParameterNumber import ParameterNumber
|
||
|
import random
|
||
|
from sextante.parameters.ParameterTableField import ParameterTableField
|
||
|
from sextante.ftools import ftools_utils
|
||
|
|
||
|
class RandomSelectionWithinSubsets(GeoAlgorithm):
|
||
|
|
||
|
INPUT = "INPUT"
|
||
|
OUTPUT = "OUTPUT"
|
||
|
METHOD = "METHOD"
|
||
|
NUMBER = "NUMBER"
|
||
|
PERCENTAGE = "PERCENTAGE"
|
||
|
FIELD = "FIELD"
|
||
|
|
||
|
def getIcon(self):
|
||
|
return QtGui.QIcon(os.path.dirname(__file__) + "/icons/random_selection.png")
|
||
|
|
||
|
def processAlgorithm(self, progress):
|
||
|
method = self.getParameterValue(self.METHOD)
|
||
|
field = self.getParameterValue(RandomSelectionWithinSubsets.FIELD)
|
||
|
filename = self.getParameterValue(RandomSelectionWithinSubsets.INPUT)
|
||
|
vlayer = QGisLayers.getObjectFromUri(filename)
|
||
|
vlayer.removeSelection(True)
|
||
|
vprovider = vlayer.dataProvider()
|
||
|
allAttrs = vprovider.attributeIndexes()
|
||
|
vprovider.select(allAttrs)
|
||
|
index = vprovider.fieldNameIndex(field)
|
||
|
unique = ftools_utils.getUniqueValues(vprovider, int(index))
|
||
|
inFeat = QgsFeature()
|
||
|
selran = []
|
||
|
nFeat = vprovider.featureCount() * len(unique)
|
||
|
nElement = 0
|
||
|
if not len(unique) == vlayer.featureCount():
|
||
|
for i in unique:
|
||
|
vprovider.rewind()
|
||
|
FIDs= []
|
||
|
while vprovider.nextFeature(inFeat):
|
||
|
atMap = inFeat.attributeMap()
|
||
|
if atMap[index] == QVariant(i):
|
||
|
FID = inFeat.id()
|
||
|
FIDs.append(FID)
|
||
|
nElement += 1
|
||
|
progress.setPercentage(nElement/nFeat * 100)
|
||
|
if method == 0:
|
||
|
value = int(self.getParameterValue(self.NUMBER))
|
||
|
else:
|
||
|
value = self.getParameterValue(self.PERCENTAGE)
|
||
|
value = int(round((value / 100.0000) * len(FIDs), 0))
|
||
|
if value >= len(FIDs):
|
||
|
selFeat = FIDs
|
||
|
else:
|
||
|
selFeat = random.sample(FIDs, value)
|
||
|
selran.extend(selFeat)
|
||
|
vlayer.setSelectedFeatures(selran)
|
||
|
else:
|
||
|
vlayer.setSelectedFeatures(range(0, vlayer.featureCount()))
|
||
|
self.setOutputValue(RandomSelectionWithinSubsets.OUTPUT, filename)
|
||
|
|
||
|
|
||
|
def defineCharacteristics(self):
|
||
|
self.name = "Random selection within subsets"
|
||
|
self.group = "Research tools"
|
||
|
self.addParameter(ParameterVector(RandomSelectionWithinSubsets.INPUT, "Input layer", ParameterVector.VECTOR_TYPE_ANY))
|
||
|
self.addParameter(ParameterTableField(RandomSelectionWithinSubsets.FIELD, "ID Field", RandomSelectionWithinSubsets.INPUT))
|
||
|
self.addParameter(ParameterSelection(RandomSelectionWithinSubsets.METHOD, "Method", ["Number of selected features", "Percentage of selected features"]))
|
||
|
self.addParameter(ParameterNumber(RandomSelectionWithinSubsets.NUMBER, "Number of selected features", 1, None, 10))
|
||
|
self.addParameter(ParameterNumber(RandomSelectionWithinSubsets.PERCENTAGE, "Percentage of selected features", 0, 100, 50))
|
||
|
self.addOutput(OutputVector(RandomSelectionWithinSubsets.OUTPUT, "Selection", True))
|