Just a short note about a recent development I’ve been working on, since the QGIS hackfest in Gran Canaria a few years ago I’ve been thinking at the creation of a QGIS vector data provider in pure Python but that wasn’t possible due to the internal handling of data providers (they are built as shared objects and dynamically loaded at runtime like C++ plugins are normally loaded).
Why python data providers?
My main reasons for having Python data provider were:
- quick prototyping
- web services
- why not?
This topic has been floating in my head for a while since I decided to give it a second look and I finally implemented it and merged for the next 3.2 release.
How it’s been done
To make this possible I had to:
- create a public API for registering the providers
- create the Python bindings (the hard part)
- create a sample Python vector data provider (the boring part)
- make all the tests pass
First, let me say that it wasn’t like a walk in the park: the Python bindings part is always like diving into woodoo and black magic recipes before I can get it to work properly.
For the Python provider sample implementation I decided to re-implement the memory (aka: scratch layers) provider because that’s one of the simplest providers and it does not depend on any external storage or backend.
How to and examples
For now, the main source of information is the API and the tests:
To register your own provider (PyProvider
in the snippet below) these are the basic steps:
metadata = QgsProviderMetadata(PyProvider.providerKey(), PyProvider.description(), PyProvider.createProvider) QgsProviderRegistry.instance().registerProvider(metadata)
To create your own provider you will need at least the following components:
- the provider class itself (subclass of
QgsVectorDataProvider
) - a feature source (subclass of
QgsAbstractFeatureSource
) - a feature iterator (subclass of
QgsAbstractFeatureIterator
)
Be aware that the implementation of a data provider is not easy and you will need to write a lot of code, but at least you could get some inspiration from the existing example.
Enjoy wirting data providers in Python and please let me know if you’ve fond this implementation useful!