Das PyQGIS-Kochbuch erklärt, wie der räumliche Index eingerichtet wird, erklärt jedoch nur die Hälfte seiner Verwendung:
räumlichen Index erstellen - Der folgende Code erstellt einen leeren Index
index = QgsSpatialIndex()
Features zum Index hinzufügen - index nimmt das QgsFeature-Objekt und fügt es der internen Datenstruktur hinzu. Sie können das Objekt manuell erstellen oder eines aus dem vorherigen Aufruf von nextFeature () des Anbieters verwenden.
index.insertFeature(feat)
Sobald der räumliche Index mit einigen Werten gefüllt ist, können Sie einige Abfragen durchführen
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Was ist der effizienteste Schritt, um die tatsächlichen Features zu erhalten, die zu den zurückgegebenen Feature-IDs gehören?
qgis
pyqgis
spatial-index
Unterdunkel
quelle
quelle
In einem Blog-Beitrag zu diesem Thema stellt Nathan Woodrow den folgenden Code bereit:
Dadurch wird ein Wörterbuch erstellt, mit dem Sie ein QgsFeature mithilfe seiner FID schnell nachschlagen können.
Ich habe festgestellt, dass dies für sehr große Schichten nicht besonders praktisch ist, da es viel Speicher benötigt. Die alternative Verwendung (zufälliger Zugriff auf das gewünschte Merkmal)
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
scheint jedoch vergleichsweise sehr langsam zu sein. Ich bin mir nicht sicher, warum dies so ist, da der entsprechende Aufruf mit den SWIG OGR-Bindungenlayer.GetFeature(fid)
viel schneller zu sein scheint.quelle
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Ich habe an einer Ebene mit 140.000 Funktionen gearbeitet, und die Gesamtzeit für die 140.000 Suchvorgänge ging von vielen Minuten auf Sekunden.Für Vergleiche, Blick auf Effizientere Spatial Join in Python ohne QGIS, ArcGIS, PostGIS, etc . Die vorgestellte Lösung verwendet die Python-Module Fiona , Shapely und rtree (Spatial Index).
Mit PyQGIS und demselben Beispiel zwei Ebenen
point
undpolygon
:1) Ohne räumlichen Index:
2) Mit dem räumlichen Index R-Tree PyQGIS:
Was bedeuten diese Indizes?
Gleiche Schlussfolgerungen wie bei Effizienterer räumlicher Join in Python ohne QGIS, ArcGIS, PostGIS usw . :
Anderes Beispiel in GIS se: Wie finde ich die nächstgelegene Linie zu einem Punkt in QGIS? [Duplikat]
quelle
Anscheinend besteht die einzige Methode, um eine gute Leistung zu erzielen, darin, Aufrufe von layer.getFeatures () zu vermeiden oder zu bündeln, selbst wenn der Filter so einfach wie ein FID ist.
Quelle: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
quelle