Saya mencoba untuk mendapatkan lapisan untuk diperbarui secara otomatis ketika sumber data mereka berubah. Saya menggunakan R untuk menulis shapefile dengan atribut, dan mewarnai sesuai dengan atribut itu di QGIS.
Saya ingin menulis shapefile baru dengan nilai atribut yang berbeda, dan perbarui warna peta Qgis. Langkah 1 memicu proses itu, langkah 2 membuat lapisan ulang dari shapefile yang dimodifikasi. Langkah 2 saya khawatir di sini.
Pertanyaan lain / obrolan milis menyebutkan menggunakan triggerRepaint
pada lapisan - itu tidak berfungsi. Saran lain termasuk setCacheImage(None)
dan sekali lagi itu tidak berhasil. Lapisan tidak memperbarui pada akhirnya, tetapi saya benar-benar tidak dapat melihat logikanya, dan kadang-kadang terjadi secara mengejutkan setelah saya tidak melakukan apa-apa. Atau mungkin saya melakukan sesuatu dua menit yang lalu.
Satu-satunya cara yang dapat direproduksi untuk memperbaruinya adalah dengan menduplikasi layer dari menu legenda - duplikat selalu mendapatkan datanya dari shapefile saat ini, dan layer asli juga memperbarui sendiri! Jadi pasti ada cara untuk melakukannya.
Saya pikir ini bekerja lebih baik di 2.8, tapi ini 2.10 jadi mungkin ada bug baru di suatu tempat.
Terkait, tetapi tidak berfungsi untuk saya di 2.10:
Bagaimana cara memuat ulang layer raster secara otomatis jika sumber diubah di QGIS?
Hal lain yang saya coba:
layer.dataProvider().dataChanged.emit()
- Bekerja sekali, lalu tidak lagi pada lapisan yang sama
Saya pikir saya telah melacak mengapa menduplikasi lapisan berfungsi - jika saya membuat lapisan sekali pakai baru berdasarkan pada lapisan yang diperbarui dan kemudian memanggil .triggerRepaint()
lapisan yang diperbarui, itu memperbarui pada kanvas peta:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Jika saya menggunakan sumber lapisan yang berbeda itu tidak berfungsi, jadi sepertinya jika Anda membuat objek lapisan berdasarkan sumber lapisan yang sama ...
Sebuah tes cepat sekarang dengan layer raster (dari GeoTIFF), dan hanya menelepon rlayer.triggerRepaint()
tampaknya dapat memperbarui tampilan raster di kanvas peta.
layer.setCacheImage(None)
dan layer.triggerRepaint()
?
triggerRepaint()
pada layer asli. v 2.10.1-Pisa