Bug report #19220

Python Mem Provider Example Spatial Index not working

Added by Andrew Blakey over 2 years ago. Updated over 2 years ago.

Assignee:Andrew Blakey
Category:Data Provider
Affected QGIS version:3.1(master) Regression?:No
Operating System: Easy fix?:No
Pull Request or Patch supplied:No Resolution:
Crashes QGIS or corrupts data:No Copied to github as #:27049


First issue so my apologies if I commit any community faux pas.

I've been working quite a lot with the new Python-based QgsVectorDataProvider. One thing I cannot get working is the Spatial Index.

If I insert a bunch of features without a spatial index, they render, are queryable, appear in the table. If I "Create Spatial Index" it announces that one has been created, but my features all immediately disappear. It's as if every query is returning no results.

One thing I noticed in the code was this line: https://github.com/qgis/QGIS/blob/master/tests/src/python/provider_python.py#L390

It appears to be iterating over the keys (feature ids) and attempting to add features to the index by passing integers, not features. Looking at the docs, it doesn't look like there's a valid override for that. Signature 1 accepts a feature and Signature 2 accepts an id AND a bounds. https://qgis.org/api/3.0/classQgsSpatialIndex.html#aba57698626fcd78c42fb00570e6cbceb

So I dug deeper, trying to fix this myself with no luck. I instead pass it the feature, but nothing seems to be any different. I think one issue I have is that because of Qt5 bindings, sometimes errors seem to pass silently. Another issue is that this is new code for me and I haven't used QGIS or Qt in years. So this may be a me issue.

I read through the unit tests: https://github.com/qgis/QGIS/blob/master/tests/src/python/test_provider_python.py. It looks like none of them end up testing that features are queryable. So I'm not confident this has worked in the past?

I'm pretty motivated to help address this, so once I learn how to compile and run tests (and effectively have a dev environment for QGIS in Ubuntu 16.04), I will keep digging.

Associated revisions

Revision d84471b1
Added by Andrew Blakey over 2 years ago

Addressed two issues that caused createSpatialIndex() to fail. Fixes #19220


#1 Updated by Andrew Blakey over 2 years ago

  • Assignee set to Andrew Blakey

I found the issues. I will attempt to get an environment together and make a pull request.


f.id() is always 0.
_f.id() is what was intended.

Also as described in the initial bug report, the iterator in createSpatialIndex needs to iterate over values, not keys.

#2 Updated by Anonymous over 2 years ago

  • % Done changed from 0 to 100
  • Status changed from Open to Closed

Also available in: Atom PDF