From 67376a6ee933540bc4b39dcb45fe55ccf16e3758 Mon Sep 17 00:00:00 2001 From: cfarmer Date: Tue, 30 Mar 2010 22:01:01 +0000 Subject: [PATCH] Update to select by location tool: should run faster for large layers, and requires less memory. Should also fix #1669 git-svn-id: http://svn.osgeo.org/qgis/trunk@13205 c8812cc2-4d05-0410-92ff-de0c093fc19c --- .../fTools/tools/doSelectByLocation.py | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/python/plugins/fTools/tools/doSelectByLocation.py b/python/plugins/fTools/tools/doSelectByLocation.py index 5365d187cb5..929372602aa 100755 --- a/python/plugins/fTools/tools/doSelectByLocation.py +++ b/python/plugins/fTools/tools/doSelectByLocation.py @@ -55,23 +55,29 @@ class Dialog(QDialog, Ui_Dialog): inputLayer = ftools_utils.getVectorLayerByName(inPoly) selectLayer = ftools_utils.getVectorLayerByName(inPts) inputProvider = inputLayer.dataProvider() + allAttrs = inputProvider.attributeIndexes() + inputProvider.select(allAttrs) selectProvider = selectLayer.dataProvider() + allAttrs = selectProvider.attributeIndexes() + selectProvider.select(allAttrs) feat = QgsFeature() + infeat = QgsFeature() geom = QgsGeometry() selectedSet = [] - selectProvider.nextFeature(feat) - geomLayer = QgsGeometry(feat.geometry()) - - self.progressBar.setMaximum( inputProvider.featureCount() + selectProvider.featureCount() ) - + index = ftools_utils.createIndex(inputProvider) + #selectProvider.nextFeature(feat) + #geomLayer = QgsGeometry(feat.geometry()) + self.progressBar.setMaximum(selectProvider.featureCount()) + while selectProvider.nextFeature(feat): - geomLayer = geomLayer.combine(QgsGeometry(feat.geometry())) - self.progressBar.setValue( self.progressBar.value() + 1 ) - while inputProvider.nextFeature(feat): geom = QgsGeometry(feat.geometry()) - if geom.intersects(geomLayer): - selectedSet.append(feat.id()) - self.progressBar.setValue( self.progressBar.value() + 1 ) + 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()) + self.progressBar.setValue(self.progressBar.value()+1) if modify == self.tr("adding to current selection"): selectedSet = list(set(inputLayer.selectedFeaturesIds()).union(selectedSet)) elif modify == self.tr("removing from current selection"):