PyQGIS Cookbook объясняет , как настроить пространственный индекс , но это объясняет только половину его использования:
создать пространственный индекс - следующий код создает пустой индекс
index = QgsSpatialIndex()
добавить объекты в индекс - индекс берет объект QgsFeature и добавляет его во внутреннюю структуру данных. Вы можете создать объект вручную или использовать объект из предыдущего вызова метода nextFeature () провайдера.
index.insertFeature(feat)
как только пространственный индекс заполнен некоторыми значениями, вы можете сделать несколько запросов
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Какой самый эффективный шаг для получения реальных функций, принадлежащих возвращенным идентификаторам функций?
qgis
pyqgis
spatial-index
Подземье
источник
источник
В блоге на эту тему Натан Вудроу предоставляет следующий код:
Это создает словарь, позволяющий вам быстро искать QgsFeature, используя его FID.
Я обнаружил, что для очень больших слоев это не особенно практично, так как требует много памяти. Тем не менее, альтернативное использование (произвольный доступ к желаемой функции), по-
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
видимому, является относительно медленным. Я не уверен, почему это так, поскольку эквивалентный вызов с использованием привязок SWIG OGRlayer.GetFeature(fid)
кажется намного быстрее, чем этот.источник
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Я работал над слоем с 140k-объектами, и общее время поиска 140k-страниц ушло от нескольких минут до секунд.Для сравнения посмотрите на Более эффективное пространственное соединение в Python без QGIS, ArcGIS, PostGIS и т . Д. В представленном решении используются модули Python Fiona , Shapely и rtree (Spatial Index).
С PyQGIS и тем же примером два слоя,
point
иpolygon
:1) без пространственного индекса:
2) С помощью пространственного индекса R-Tree PyQGIS:
Что означают эти показатели?
Те же выводы, что и в Более эффективном пространственном соединении в Python без QGIS, ArcGIS, PostGIS и т. Д . :
Другой пример в ГИС: Как найти ближайшую линию к точке в QGIS? [дубликат]
источник
По-видимому, единственный способ получить хорошую производительность - это избегать или связывать вызовы layer.getFeatures (), даже если фильтр такой же простой, как fid.
источник: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
источник