Salvataggio di un indice spaziale nell'API QGIS?


9

Sto cercando di creare un indice spaziale per alcuni shapefile utilizzando l'API Qgis. Ho seguito i passaggi descritti nel blog di Nathan Woodrow ( https://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/ ) e funziona benissimo :

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

Il mio problema è che non ho alcun file risultante (.qix? .Sbn? .Sbx?)

Come posso salvare questo indice spaziale in modo che i futuri utenti degli shapefile possano trarne vantaggio?

Risposte:


11

Se vuoi creare un indice spaziale per tutte le funzioni nel tuo livello, puoi provare a utilizzare quanto segue:

layer.dataProvider().createSpatialIndex()

Questo creerà il .qixfile di indice spaziale.


Modificare:

Come menzionato da Matthias Kuhn nei suoi commenti qui sotto, la classe QgsSpatialIndex viene utilizzata solo temporaneamente come visto nel blog a cui ti sei collegato; mentre la funzione createSpatialIndex () crea un indice spaziale sull'origine dati e genera un qixfile per gli shapefile.


2
Penso che sarebbe bene evidenziare la differenza tra un indice di runtime persistente (basato su file) e temporaneo (QgsSpatialIndex).
Matthias Kuhn,

1
Grazie ragazzi ! Ho trovato solo informazioni su QgsSpatialIndex. createSpatialIndex è esattamente quello che stavo cercando.
Lauref,

@Lauref - Fantastico, felice che abbia aiutato :)
Joseph,

Dopo 4 tentativi di scrivere qualcosa di esauriente in questo commento, devo arrendermi e ammettere che richiederebbe di più per qualcosa di adeguato. Quello che volevo dire è solo che le informazioni che QgsSpatialIndex non sono persistenti forniscono già molte informazioni senza ulteriori spiegazioni.
Matthias Kuhn,

@MatthiasKuhn - Grazie, ho modificato il post in modo da includere una breve spiegazione come hai menzionato;)
Joseph,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.