O PyQGIS Cookbook explica como configurar o índice espacial, mas explica apenas metade de seu uso:
criar índice espacial - o código a seguir cria um índice vazio
index = QgsSpatialIndex()
adicionar recursos ao índice - o índice pega o objeto QgsFeature e o adiciona à estrutura de dados interna. Você pode criar o objeto manualmente ou usar um da chamada anterior para o nextFeature () do provedor
index.insertFeature(feat)
depois que o índice espacial for preenchido com alguns valores, você poderá fazer algumas consultas
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Qual é a etapa mais eficiente para obter os recursos reais pertencentes aos IDs de recursos retornados?
qgis
pyqgis
spatial-index
underdark
fonte
fonte
Em uma postagem de blog sobre o assunto , Nathan Woodrow fornece o seguinte código:
Isso cria um dicionário que permite procurar rapidamente um QgsFeature usando seu FID.
Descobri que para camadas muito grandes isso não é especialmente prático, pois requer muita memória. No entanto, a alternativa (acesso aleatório do recurso desejado)
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
parece comparativamente muito lenta. Não sei por que isso ocorre, pois a chamada equivalente usando as ligações SWIG OGRlayer.GetFeature(fid)
parece muito mais rápida que isso.fonte
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Eu estava trabalhando em uma camada com recursos de 140k, e o tempo total para as pesquisas de 140k passou de muitos minutos a segundos.Para comparações, olhada espacial mais eficiente juntar-se em Python sem QGIS, ArcGIS, PostGIS, etc . A solução apresentada utiliza os módulos Python Fiona , Shapely e rtree (Spatial Index).
Com PyQGIS e o mesmo exemplo, duas camadas
point
epolygon
:1) Sem um índice espacial:
2) Com o índice espacial RQ -Tree PyQGIS:
O que esses índices significam?
As mesmas conclusões que na junção espacial mais eficiente no Python sem QGIS, ArcGIS, PostGIS, etc :
Outro exemplo no GIS se: Como encontrar a linha mais próxima de um ponto no QGIS? [duplicado]
fonte
Aparentemente, o único método para obter um bom desempenho é evitar ou agrupar chamadas para layer.getFeatures (), mesmo que o filtro seja tão simples quanto um fid.
fonte: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
fonte