Estoy tratando de hacer 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 con ese atributo en QGIS.
Quiero escribir un nuevo shapefile con diferentes valores de atributo y hacer que se actualicen los colores del mapa Qgis. El paso 1 está activando ese proceso, el paso 2 está haciendo que la capa se vuelva a cargar desde el archivo de forma modificado. Su paso 2 me preocupa aquí.
Otras preguntas / conversaciones de listas de correo mencionan el uso triggerRepaint
en la capa, eso no funciona. Otras sugerencias incluyen setCacheImage(None)
y nuevamente eso no funciona. La capa se actualiza eventualmente, pero realmente no puedo ver la lógica, y a veces sucede por sorpresa después de no haber hecho nada. O tal vez hice algo hace dos minutos.
La única forma reproducible de hacer que se actualice es duplicar la capa desde el menú de la leyenda: el duplicado siempre obtiene sus datos del archivo de forma actual, ¡y la capa original también se actualiza a sí misma! Entonces debe haber alguna forma de hacerlo.
Creo que funcionaba mejor en 2.8, pero esto es 2.10, así que tal vez haya un nuevo error en alguna parte.
Relacionado, pero no funciona para mí en 2.10:
¿Cómo recargar automáticamente las capas ráster si la fuente se cambia en QGIS?
Otras cosas que he probado:
layer.dataProvider().dataChanged.emit()
- trabajó una vez, luego no otra vez en la misma capa
Creo que he rastreado por qué funciona la duplicación de la capa: si creo una nueva capa desechable basada en la capa actualizada y luego llamo .triggerRepaint()
a la capa actualizada, se actualiza en el lienzo del mapa:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Si uso una fuente de capa diferente, no funciona, por lo que parece ser si creas un objeto de capa basado en la misma fuente de capa ...
Una prueba rápida en este momento con una capa ráster (desde un GeoTIFF), y solo llamar rlayer.triggerRepaint()
parece actualizar de manera confiable la vista del ráster en el lienzo del mapa.
layer.setCacheImage(None)
y layer.triggerRepaint()
?
triggerRepaint()
en la capa original. v 2.10.1-Pisa