Estoy intentando que las capas se actualicen automáticamente cuando cambia su fuente de datos. Estoy usando R para escribir un shapefile con un atributo, y colorear de acuerdo a ese atributo en QGIS.
Quiero escribir un nuevo shapefile con diferentes valores de atributos, y que los colores del mapa Qgis se actualicen. El paso 1 es desencadenar ese proceso, el paso 2 es hacer que la capa se recargue desde el shapefile modificado. Es el paso 2 lo que me preocupa aquí.
En otras preguntas/charlas de la lista de correo se menciona el uso de triggerRepaint
en la capa - que no funciona. Otras sugerencias setCacheImage(None)
y de nuevo no funciona. Al final la capa se actualiza, pero no veo la lógica, y a veces ocurre por sorpresa después de no haber hecho nada. O tal vez hice algo hace dos minutos.
La única forma reproducible de conseguir que se actualice es duplicar la capa desde el menú de leyenda - el duplicado siempre obtiene sus datos del shapefile actual, ¡y la capa original también se actualiza! Así que debe haber alguna manera de hacerlo.
Creo que funcionaba mejor en la 2.8, pero esta es la 2.10 así que quizás haya un nuevo bug en alguna parte.
Relacionado, pero no me funciona en 2.10:
¿Cómo recargar automáticamente las capas ráster si se cambia la fuente en QGIS?
Otras cosas que he probado:
layer.dataProvider().dataChanged.emit()
- funcionó una vez, luego no volvió a hacerlo en la misma capa
Creo que he localizado por qué duplicar la capa funciona - si creo una nueva capa desechable basada en la capa actualizada y luego llamo a .triggerRepaint()
en la capa actualizada, se actualiza en el lienzo del mapa:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Si utilizo una fuente de capa diferente no funciona, así que parece ser que si se crea un objeto de capa basado en la misma fuente de capa...
Acabo de hacer una prueba rápida con una capa rasterizada (a partir de un GeoTIFF), y simplemente llamando a rlayer.triggerRepaint()
parece actualizar de forma fiable la vista de la trama en el lienzo del mapa.