Skip to content

Commit 67376a6

Browse files
author
cfarmer
committedMar 30, 2010
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
1 parent febbca5 commit 67376a6

File tree

1 file changed

+17
-11
lines changed

1 file changed

+17
-11
lines changed
 

‎python/plugins/fTools/tools/doSelectByLocation.py

Lines changed: 17 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,23 +55,29 @@ def compute(self, inPoly, inPts, modify):
5555
inputLayer = ftools_utils.getVectorLayerByName(inPoly)
5656
selectLayer = ftools_utils.getVectorLayerByName(inPts)
5757
inputProvider = inputLayer.dataProvider()
58+
allAttrs = inputProvider.attributeIndexes()
59+
inputProvider.select(allAttrs)
5860
selectProvider = selectLayer.dataProvider()
61+
allAttrs = selectProvider.attributeIndexes()
62+
selectProvider.select(allAttrs)
5963
feat = QgsFeature()
64+
infeat = QgsFeature()
6065
geom = QgsGeometry()
6166
selectedSet = []
62-
selectProvider.nextFeature(feat)
63-
geomLayer = QgsGeometry(feat.geometry())
64-
65-
self.progressBar.setMaximum( inputProvider.featureCount() + selectProvider.featureCount() )
66-
67+
index = ftools_utils.createIndex(inputProvider)
68+
#selectProvider.nextFeature(feat)
69+
#geomLayer = QgsGeometry(feat.geometry())
70+
self.progressBar.setMaximum(selectProvider.featureCount())
71+
6772
while selectProvider.nextFeature(feat):
68-
geomLayer = geomLayer.combine(QgsGeometry(feat.geometry()))
69-
self.progressBar.setValue( self.progressBar.value() + 1 )
70-
while inputProvider.nextFeature(feat):
7173
geom = QgsGeometry(feat.geometry())
72-
if geom.intersects(geomLayer):
73-
selectedSet.append(feat.id())
74-
self.progressBar.setValue( self.progressBar.value() + 1 )
74+
intersects = index.intersects(geom.boundingBox())
75+
for id in intersects:
76+
inputProvider.featureAtId(int(id), infeat, True)
77+
tmpGeom = QgsGeometry( infeat.geometry() )
78+
if geom.intersects(tmpGeom):
79+
selectedSet.append(infeat.id())
80+
self.progressBar.setValue(self.progressBar.value()+1)
7581
if modify == self.tr("adding to current selection"):
7682
selectedSet = list(set(inputLayer.selectedFeaturesIds()).union(selectedSet))
7783
elif modify == self.tr("removing from current selection"):

0 commit comments

Comments
 (0)
Please sign in to comment.