PyQGIS Cookbook wyjaśnia jak skonfigurować indeks przestrzenny, ale to tylko wyjaśnia połowę jego użytkowania:
utwórz indeks przestrzenny - poniższy kod tworzy pusty indeks
index = QgsSpatialIndex()
dodaj funkcje do indeksu - indeks pobiera obiekt QgsFeature i dodaje go do wewnętrznej struktury danych. Możesz utworzyć obiekt ręcznie lub użyć jednego z poprzedniego wywołania nextFeature () dostawcy
index.insertFeature(feat)
po wypełnieniu indeksu przestrzennego pewnymi wartościami można wykonać zapytania
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Jaki jest najbardziej efektywny krok, aby uzyskać rzeczywiste funkcje należące do zwróconych identyfikatorów funkcji?
qgis
pyqgis
spatial-index
podmrok
źródło
źródło
W poście na ten temat Nathan Woodrow podaje następujący kod:
Spowoduje to utworzenie słownika umożliwiającego szybkie wyszukiwanie funkcji QgsFeature za pomocą jej FID.
Przekonałem się, że w przypadku bardzo dużych warstw nie jest to szczególnie praktyczne, ponieważ wymaga dużo pamięci. Jednak użycie alternatywne (losowy dostęp do pożądanej funkcji)
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
wydaje się stosunkowo wolne. Nie jestem pewien, dlaczego tak jest, ponieważ równoważne wywołanie za pomocą powiązań SWIG OGRlayer.GetFeature(fid)
wydaje się znacznie szybsze.źródło
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Pracowałem nad warstwą z funkcjami 140 000, a całkowity czas wyszukiwania 140 000 wyszukiwań trwał od wielu minut do sekund.Dla porównania spójrz na Efektywniejsze łączenie przestrzenne w Pythonie bez QGIS, ArcGIS, PostGIS itp . Przedstawione rozwiązanie wykorzystuje moduły Python Fiona , Shapely i rtree (Spatial Index).
Z PyQGIS i tym samym przykładem dwie warstwy
point
ipolygon
:1) Bez indeksu przestrzennego:
2) Z indeksem przestrzennym PyQGIS R-Tree :
Co oznaczają te wskaźniki?
Te same wnioski, co w przypadku bardziej wydajnego łączenia przestrzennego w Pythonie bez QGIS, ArcGIS, PostGIS itp . :
Inny przykład w GIS se: Jak znaleźć najbliższą linię do punktu w QGIS? [duplikować]
źródło
Najwyraźniej jedyną metodą uzyskania dobrej wydajności jest unikanie lub łączenie wywołań z layer.getFeatures (), nawet jeśli filtr jest tak prosty jak fid.
źródło: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
źródło