Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
[processing] Select by atribute sum algorithm
  • Loading branch information
alexbruy committed Apr 15, 2015
1 parent a741f82 commit c9ec4d4
Show file tree
Hide file tree
Showing 2 changed files with 96 additions and 1 deletion.
3 changes: 2 additions & 1 deletion python/plugins/processing/algs/qgis/QGISAlgorithmProvider.py
Expand Up @@ -123,6 +123,7 @@
from SetVectorStyle import SetVectorStyle
from SetRasterStyle import SetRasterStyle
from SelectByExpression import SelectByExpression
from SelectByAttributeSum import SelectByAttributeSum
from HypsometricCurves import HypsometricCurves
from SplitLinesWithLines import SplitLinesWithLines
from processing.algs.qgis.FieldsMapper import FieldsMapper
Expand Down Expand Up @@ -172,7 +173,7 @@ def __init__(self):
SetVectorStyle(), SetRasterStyle(),
SelectByExpression(), HypsometricCurves(),
SplitLinesWithLines(), CreateConstantRaster(),
FieldsMapper(),
FieldsMapper(),SelectByAttributeSum()
]

if hasMatplotlib:
Expand Down
94 changes: 94 additions & 0 deletions python/plugins/processing/algs/qgis/SelectByAttributeSum.py
@@ -0,0 +1,94 @@
# -*- coding: utf-8 -*-

"""
***************************************************************************
SelectByAttributeSum.py
---------------------
Date : April 2015
Copyright : (C) 2015 by Alexander Bruy
Email : alexander dot bruy at gmail dot com
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************
"""

__author__ = 'Alexander Bruy'
__date__ = 'April 2015'
__copyright__ = '(C) 2015, Alexander Bruy'

# This will get replaced with a git SHA1 when you do a git archive

__revision__ = '$Format:%H$'

from qgis.core import QgsSpatialIndex, QgsFeatureRequest, QgsGeometry

from processing.core.GeoAlgorithm import GeoAlgorithm
from processing.core.GeoAlgorithmExecutionException import GeoAlgorithmExecutionException
from processing.core.parameters import ParameterVector
from processing.core.parameters import ParameterTableField
from processing.core.parameters import ParameterNumber
from processing.core.outputs import OutputVector
from processing.tools import dataobjects, vector


class SelectByAttributeSum(GeoAlgorithm):
INPUT = 'INPUT'
FIELD = 'FIELD'
VALUE = 'VALUE'
OUTPUT = 'OUTPUT'

def defineCharacteristics(self):
self.name = 'Select by attribute sum'
self.group = 'Vector selection tools'

self.addParameter(ParameterVector(self.INPUT,
self.tr('Input Layer'), [ParameterVector.VECTOR_TYPE_ANY]))
self.addParameter(ParameterTableField(self.FIELD,
self.tr('Selection attribute'), self.INPUT, ParameterTableField.DATA_TYPE_NUMBER))
self.addParameter(ParameterNumber(self.VALUE, self.tr('Value')))

self.addOutput(OutputVector(self.OUTPUT, self.tr('Output'), True))

def processAlgorithm(self, progress):
fileName = self.getParameterValue(self.INPUT)
layer = dataobjects.getObjectFromUri(fileName)
fieldName = self.getParameterValue(self.FIELD)
value = self.getParameterValue(self.VALUE)

selected = layer.selectedFeaturesIds()
if len(selected) == 0:
GeoAlgorithmExecutionException(
self.tr('There is no selection in the input layer. '
'Select one feature and try again.'))

ft = layer.selectedFeatures()[0]
geom = QgsGeometry(ft.geometry())
attrSum = ft[fieldName]

idx = QgsSpatialIndex(layer.getFeatures())
req = QgsFeatureRequest()
completed = False
while not completed:
intersected = idx.intersects(geom.boundingBox())
if len(intersected) < 0:
progress.setInfo(self.tr('No adjacent features found.'))
break

for i in intersected:
ft = layer.getFeatures(req.setFilterFid(i)).next()
tmpGeom = QgsGeometry(ft.geometry())
if tmpGeom.touches(geom):
geom = tmpGeom.combine(geom)
selected.append(i)
attrSum += ft[fieldName]
if attrSum >= value:
completed = True
break

layer.setSelectedFeatures(selected)
self.setOutputValue(self.OUTPUT, fileName)

0 comments on commit c9ec4d4

Please sign in to comment.