[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