The PyQGIS Cookbook menjelaskan cara mengatur indeks spasial tetapi hanya menjelaskan setengah dari penggunaannya:
buat indeks spasial - kode berikut membuat indeks kosong
index = QgsSpatialIndex()
menambahkan fitur ke indeks - indeks mengambil objek QgsFeature dan menambahkannya ke struktur data internal. Anda dapat membuat objek secara manual atau menggunakannya dari panggilan sebelumnya ke penyedia berikutnya ()
index.insertFeature(feat)
setelah indeks spasial diisi dengan beberapa nilai, Anda dapat melakukan beberapa pertanyaan
# returns array of feature IDs of five nearest features nearest = index.nearestNeighbor(QgsPoint(25.4, 12.7), 5)
Apa langkah paling efisien untuk mendapatkan fitur aktual milik ID fitur yang dikembalikan?
qgis
pyqgis
spatial-index
underdark
sumber
sumber
Dalam sebuah posting blog tentang hal itu , Nathan Woodrow memberikan kode berikut:
Ini membuat kamus yang memungkinkan Anda mencari QgsFeature dengan cepat menggunakan FID-nya.
Saya telah menemukan bahwa untuk lapisan yang sangat besar ini tidak terlalu praktis karena memerlukan banyak memori. Namun, penggunaan alternatif (akses acak dari fitur yang diinginkan)
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
tampaknya sangat lambat. Saya tidak yakin mengapa ini terjadi, karena panggilan yang setara menggunakan binding OGR SWIGlayer.GetFeature(fid)
tampaknya jauh lebih cepat dari ini.sumber
layer.getFeatures(QgsFeatureRequest().setFilterFid(fid))
. Saya sedang mengerjakan layer dengan fitur 140k, dan total waktu untuk pencarian 140k berubah dari beberapa menit menjadi beberapa detik.Untuk perbandingan, lihat Penggabungan Tata Ruang yang Lebih Efisien dengan Python tanpa QGIS, ArcGIS, PostGIS, dll . Solusi yang disajikan penggunaan Python modul Fiona , Shapely dan RTree (Indeks Tata Ruang).
Dengan PyQGIS dan contoh yang sama dua layer,
point
danpolygon
:1) Tanpa indeks spasial:
2) Dengan indeks spasial R-Tree PyQGIS:
Apa arti indeks ini?
Kesimpulan yang sama seperti dalam Tata Ruang yang Lebih Efisien bergabung dengan Python tanpa QGIS, ArcGIS, PostGIS, dll :
Contoh lain dalam GIS se: Bagaimana menemukan garis terdekat ke titik di QGIS? [duplikat]
sumber
Rupanya satu-satunya metode untuk mendapatkan kinerja yang baik adalah dengan menghindari atau menggabungkan panggilan ke layer.getFeatures (), bahkan jika filternya sesederhana fid.
sumber: http://nyalldawson.net/2016/10/speeding-up-your-pyqgis-scripts/
sumber