Enregistrer un index spatial dans l'API QGIS?

9

J'essaie de créer un index spatial pour certains fichiers de formes à l'aide de l'API Qgis. J'ai suivi les étapes décrites dans le blog de Nathan Woodrow ( https://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/ ) et cela fonctionne très bien :

layer = QgsVectorLayer(path, name, 'ogr')
idx = QgsSpatialIndex()
all_features = layer.getFeatures()
map(idx.insertFeature, all_features)

Mon problème est que je n'ai pas de fichier résultant (.qix? .Sbn? .Sbx?)

Comment puis-je enregistrer cet index spatial afin que les futurs utilisateurs des fichiers de formes puissent en bénéficier?

Lauref
la source

Réponses:

11

Si vous souhaitez créer un index spatial pour toutes les entités de votre couche, vous pouvez essayer d'utiliser les éléments suivants:

layer.dataProvider().createSpatialIndex()

Cela créera le .qixfichier d'index spatial.


Éditer:

Comme mentionné par Matthias Kuhn dans ses commentaires ci-dessous, la classe QgsSpatialIndex n'est utilisée que temporairement comme vu dans le blog auquel vous avez lié; tandis que la fonction createSpatialIndex () crée un index spatial sur la source de données et génère un qixfichier pour les fichiers de formes.

Joseph
la source
2
Je pense qu'il serait bon de souligner la différence entre un index d'exécution persistant (basé sur un fichier) et temporaire (QgsSpatialIndex).
Matthias Kuhn
1
Merci les gars ! Je n'ai pu trouver que des informations sur QgsSpatialIndex. createSpatialIndex est exactement ce que je cherchais.
Lauref
@Lauref - Génial, heureux que cela ait aidé :)
Joseph
Après 4 tentatives d'écrire quelque chose de complet dans ce commentaire, je dois me rendre et admettre qu'il faudrait plus pour quelque chose d'adéquat. Ce que je voulais dire, c'est simplement que les informations selon lesquelles QgsSpatialIndex n'est pas persistant donnent déjà beaucoup d'informations sans aucune explication supplémentaire.
Matthias Kuhn
@MatthiasKuhn - Merci, j'ai édité le message pour inclure une brève explication comme vous l'avez mentionné;)
Joseph