El libro de cocina PyQGIS explica cómo configurar el índice espacial pero solo explica la mitad de su uso:
crear índice espacial: el siguiente código crea un índice vacío
index = QgsSpatialIndex()
agregar características al índice: el índice toma el objeto QgsFeature y lo agrega a la estructura de datos interna. Puede crear el objeto manualmente o usar uno de la llamada anterior a la siguiente Función del proveedor ()
index.insertFeature(feat)
una vez que el índice espacial se llena con algunos valores, puede hacer algunas consultas
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
¿Cuál es el paso más eficiente para obtener las características reales que pertenecen a las ID de características devueltas?
qgis
pyqgis
spatial-index
bajo oscuro
fuente
fuente
En una publicación de blog sobre el tema , Nathan Woodrow proporciona el siguiente código:
Esto crea un diccionario que le permite buscar rápidamente una QgsFeature usando su FID.
He descubierto que para capas muy grandes esto no es especialmente práctico, ya que requiere mucha memoria. Sin embargo, el uso alternativo (acceso aleatorio de la función deseada)
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
parece ser relativamente lento. No estoy seguro de por qué es así, ya que la llamada equivalente usando los enlaces SWIG OGRlayer.GetFeature(fid)
parece mucho más rápido que esto.fuente
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Estaba trabajando en una capa con características de 140k, y el tiempo total para las búsquedas de 140k fue de muchos minutos a segundos.Para las comparaciones, ver más eficiente Unión espacial en Python sin QGIS, ArcGIS, PostGIS, etc . La solución presentada utiliza los módulos Python Fiona , Shapely y rtree (Spatial Index).
Con PyQGIS y el mismo ejemplo dos capas,
point
ypolygon
:1) Sin un índice espacial:
2) Con el índice espacial R-Tree PyQGIS:
¿Qué significan estos índices?
Mismas conclusiones que en el Más Eficiente Unión espacial en Python sin QGIS, ArcGIS, PostGIS, etc :
Otro ejemplo en GIS se: ¿Cómo encontrar la línea más cercana a un punto en QGIS? [duplicar]
fuente
Aparentemente, el único método para obtener un buen rendimiento es evitar o agrupar llamadas a layer.getFeatures (), incluso si el filtro es tan simple como un fid.
fuente: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
fuente