Le livre de recettes PyQGIS explique comment configurer l'index spatial mais il explique seulement la moitié de son utilisation:
créer un index spatial - le code suivant crée un index vide
index = QgsSpatialIndex()
ajouter des fonctionnalités à l'index - l'index prend l'objet QgsFeature et l'ajoute à la structure de données interne. Vous pouvez créer l'objet manuellement ou en utiliser un depuis l'appel précédent vers la fonction suivante du fournisseur ()
index.insertFeature(feat)
une fois que l'index spatial est rempli de quelques valeurs, vous pouvez faire quelques requêtes
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Quelle est l'étape la plus efficace pour obtenir les fonctionnalités réelles appartenant aux ID de fonctionnalité renvoyés?
qgis
pyqgis
spatial-index
obscur
la source
la source
Dans un article de blog sur le sujet , Nathan Woodrow fournit le code suivant:
Cela crée un dictionnaire vous permettant de rechercher rapidement un QgsFeature en utilisant son FID.
J'ai trouvé que pour les très grandes couches, ce n'est pas particulièrement pratique car cela nécessite beaucoup de mémoire. Cependant, l'alternative (accès aléatoire à la fonctionnalité souhaitée) utilisant
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
semble être relativement très lente. Je ne sais pas pourquoi, car l'appel équivalent utilisant les liaisons SWIG OGRlayer.GetFeature(fid)
semble beaucoup plus rapide que cela.la source
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Je travaillais sur une couche avec des fonctionnalités 140k, et le temps total pour les recherches 140k est passé de plusieurs minutes à quelques secondes.Pour les comparaisons, regardez spatiale plus efficace se joindre en Python sans QGIS, ArcGIS, PostGIS, etc . La solution présentée utilise les modules Python Fiona , Shapely et rtree (Spatial Index).
Avec PyQGIS et le même exemple deux couches,
point
etpolygon
:1) Sans indice spatial:
2) Avec l' index spatial R-Tree PyQGIS:
Que signifient ces indices?
Mêmes conclusions que dans Jointure spatiale plus efficace en Python sans QGIS, ArcGIS, PostGIS, etc .:
Autre exemple dans SIG se: Comment trouver la ligne la plus proche d'un point dans QGIS? [dupliquer]
la source
Apparemment, la seule méthode pour obtenir de bonnes performances est d'éviter ou de regrouper les appels à layer.getFeatures (), même si le filtre est aussi simple qu'un fid.
source: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
la source