2012-09-15 18:25:25 +03:00
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 . ParameterBoolean import ParameterBoolean
from sextante . ftools import ftools_utils
class SelectByLocation ( GeoAlgorithm ) :
INPUT = " INPUT "
INTERSECT = " INTERSECT "
METHOD = " METHOD "
USE_SELECTED = " USE_SELECTED "
OUTPUT = " OUTPUT "
def getIcon ( self ) :
return QtGui . QIcon ( os . path . dirname ( __file__ ) + " /icons/select_location.png " )
def processAlgorithm ( self , progress ) :
method = self . getParameterValue ( self . METHOD )
selection = self . getParameterValue ( self . USE_SELECTED )
filename = self . getParameterValue ( SelectByLocation . INPUT )
inputLayer = QGisLayers . getObjectFromUri ( filename )
filename = self . getParameterValue ( SelectByLocation . INTERSECT )
selectLayer = QGisLayers . getObjectFromUri ( filename )
inputProvider = inputLayer . dataProvider ( )
allAttrs = inputProvider . attributeIndexes ( )
inputProvider . select ( allAttrs , QgsRectangle ( ) )
selectProvider = selectLayer . dataProvider ( )
allAttrs = selectProvider . attributeIndexes ( )
selectProvider . select ( allAttrs , QgsRectangle ( ) )
feat = QgsFeature ( )
infeat = QgsFeature ( )
geom = QgsGeometry ( )
selectedSet = [ ]
index = ftools_utils . createIndex ( inputProvider )
if selection :
features = selectLayer . selectedFeatures ( )
featurescount = len ( features )
i = 0
for feat in features :
geom = QgsGeometry ( feat . geometry ( ) )
intersects = index . intersects ( geom . boundingBox ( ) )
for id in intersects :
inputProvider . featureAtId ( int ( id ) , infeat , True )
tmpGeom = QgsGeometry ( infeat . geometry ( ) )
if geom . intersects ( tmpGeom ) :
selectedSet . append ( infeat . id ( ) )
i + = 1
progress . setPercentage ( i / featurescount * 100 )
else :
featurescount = selectProvider . featureCount ( )
while selectProvider . nextFeature ( feat ) :
geom = QgsGeometry ( feat . geometry ( ) )
intersects = index . intersects ( geom . boundingBox ( ) )
i = 0
for iid in intersects :
inputProvider . featureAtId ( int ( iid ) , infeat , True )
tmpGeom = QgsGeometry ( infeat . geometry ( ) )
if geom . intersects ( tmpGeom ) :
selectedSet . append ( infeat . id ( ) )
i + = 1
progress . setPercentage ( i / featurescount * 100 )
if method == 1 :
selectedSet = list ( set ( inputLayer . selectedFeaturesIds ( ) ) . union ( selectedSet ) )
elif method == 2 :
selectedSet = list ( set ( inputLayer . selectedFeaturesIds ( ) ) . difference ( selectedSet ) )
inputLayer . setSelectedFeatures ( selectedSet )
self . setOutputValue ( self . OUTPUT , filename )
def defineCharacteristics ( self ) :
self . name = " Select by location "
self . group = " Research tools "
self . addParameter ( ParameterVector ( SelectByLocation . INPUT , " Layer to select from " , ParameterVector . VECTOR_TYPE_ANY ) )
self . addParameter ( ParameterVector ( SelectByLocation . INTERSECT , " Additional layer (intersection layer) " , ParameterVector . VECTOR_TYPE_ANY ) )
self . addParameter ( ParameterSelection ( SelectByLocation . METHOD , " Modify current selection by " , [ " creating new selection " , " adding to current selection " , " removing from current selection " ] ) )
self . addParameter ( ParameterBoolean ( SelectByLocation . USE_SELECTED , " Use only selected features " , False ) )
self . addOutput ( OutputVector ( SelectByLocation . OUTPUT , " Selection " , True ) )