[QGIS Commit] r13205 - trunk/qgis/python/plugins/fTools/tools

svn_qgis at osgeo.org svn_qgis at osgeo.org
Tue Mar 30 18:01:02 EDT 2010


Author: cfarmer
Date: 2010-03-30 18:01:01 -0400 (Tue, 30 Mar 2010)
New Revision: 13205

Modified:
   trunk/qgis/python/plugins/fTools/tools/doSelectByLocation.py
Log:
Update to select by location tool: should run faster for large layers, and requires less memory. Should also fix #1669

Modified: trunk/qgis/python/plugins/fTools/tools/doSelectByLocation.py
===================================================================
--- trunk/qgis/python/plugins/fTools/tools/doSelectByLocation.py	2010-03-30 20:37:55 UTC (rev 13204)
+++ trunk/qgis/python/plugins/fTools/tools/doSelectByLocation.py	2010-03-30 22:01:01 UTC (rev 13205)
@@ -55,23 +55,29 @@
         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"):



More information about the QGIS-commit mailing list