Zapisujesz indeks przestrzenny w QGIS API?

9

Próbuję utworzyć indeks przestrzenny dla niektórych plików kształtów za pomocą interfejsu API Qgis. Postępowałem zgodnie z instrukcjami opisanymi na blogu Nathana Woodrowa ( https://nathanw.net/2013/01/04/using-a-qgis-spatial-index-to-speed-up-your-code/ ) i działa świetnie :

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

Mój problem polega na tym, że nie mam wynikowego pliku (.qix? .Sbn? .Sbx?)

Jak zapisać ten indeks przestrzenny, aby przyszli użytkownicy plików kształtów mogli z niego korzystać?

Lauref
źródło

Odpowiedzi:

11

Jeśli chcesz utworzyć indeks przestrzenny dla wszystkich funkcji w warstwie, możesz spróbować użyć następujących opcji:

layer.dataProvider().createSpatialIndex()

Spowoduje to utworzenie .qixpliku indeksu przestrzennego.


Edytować:

Jak wspomniał Matthias Kuhn w swoich komentarzach poniżej, klasa QgsSpatialIndex jest używana tylko tymczasowo, jak widać na blogu, do którego prowadzisz link; podczas gdy funkcja createSpatialIndex () tworzy indeks przestrzenny w źródle danych i tworzy qixplik dla plików kształtów.

Joseph
źródło
2
Myślę, że dobrze byłoby podkreślić różnicę między trwałym (opartym na plikach) a tymczasowym indeksem wykonawczym (QgsSpatialIndex).
Matthias Kuhn
1
Dzięki chłopaki ! Mogłem tylko znaleźć informacje o QgsSpatialIndex. createSpatialIndex jest dokładnie tym, czego szukałem.
Lauref
@Lauref - Niesamowite, cieszę się, że pomogło :)
Joseph
Po 4 próbach napisania czegoś kompleksowego w tym komentarzu, muszę się poddać i przyznać, że wymagałoby to więcej za coś odpowiedniego. Chciałem tylko powiedzieć, że informacja, że ​​QgsSpatialIndex nie jest trwały, daje wiele informacji już bez żadnego dodatkowego wyjaśnienia.
Matthias Kuhn
@MatthiasKuhn - Dzięki, zredagowałem post, aby zamieścić krótkie wyjaśnienie, jak wspomniałeś;)
Joseph