Update on the issue: I've brought PR https://github.com/qgis/QGIS/pull/45384 to a state in which it passes CI.
What I did was adding an updateRequestToSourceCrs method to the QgsAbstractFeatureIterator class to replace the currently used filterRectToSourceCrs method which does a partial job in reprojection and makes the callers too easily change the QgsFeatureRequest's spatial filter. I had QgsVectorLayerFeatureIterator make use of this new method to avoids changing the QgsFeatureRequest spatial filter. The change proves to fix the bug, which is now guarded by a testcase. Could anyone please take a look at the PR to finally merge it ? NOTE: I've also opend another PR which contains less changes (the initial one also adds some utility equality/inequality operators to base classes and some more unit tests for them). The second PR could be discarded if the first one is merged, but might be easier to review. --strk; On Wed, Oct 20, 2021 at 12:01:19PM +0200, Sandro Santilli wrote: > I've finally found the bug I've been chasing for two weeks now [1] > > What's happening is that a QgsFeatureRequest object initialized > with a DistanceWithin spatial filter, switches to a Rectangle spatial > filter when used to construct a QgsVectorLayerFeatureIterator. > > This is because QgsVectorLayerFeatureIterator constructor tries to > reproject the QgsFeatureRequest's rectangle filter from destination > CRS to source CRS, probably aiming at improving performance from > vector layers which may have indices. > > Such attempt to reproject is done using methods of QgsFeatureRequest > which *change* the spatial filter (setFilterRect). > > Now I've a few questions: > > 1. Shouldn't such optimizations be performed by each specific > provider's class rather than by the base class ? > (projecting the Request filters to the source CRS) > > 2. Shall we see a need to reproject spatial filter references, > shouldn't this be done by a method of QgsFeatureRequest class > directly ? > > Note that QgsFeatureRequest doesn't ONLY possibly have a QgsRectangle > as a reference, but could also have a QgsGeometry and a *distance*, > "reprojecting" which is not really obvious... > > > [1] https://github.com/qgis/QGIS/pull/45384 > > > --strk; > > Libre GIS consultant/developer > https://strk.kbt.io/services.html _______________________________________________ QGIS-Developer mailing list [email protected] List info: https://lists.osgeo.org/mailman/listinfo/qgis-developer Unsubscribe: https://lists.osgeo.org/mailman/listinfo/qgis-developer
