Estou tentando fazer com que as camadas sejam atualizadas automaticamente quando a fonte de dados muda. Estou usando R para escrever um shapefile com um atributo e colorir de acordo com esse atributo no QGIS.
Quero escrever um novo shapefile com diferentes valores de atributo e atualizar as cores do mapa Qgis. A etapa 1 está iniciando esse processo, a etapa 2 está recarregando a camada a partir do shapefile modificado. Seu passo 2, estou me preocupando aqui.
Outras perguntas / conversas na lista de discussão mencionam o uso triggerRepaint
na camada - isso não funciona. Outras sugestões incluem setCacheImage(None)
e novamente que não funciona. A camada é atualizada eventualmente, mas eu realmente não consigo ver a lógica e, às vezes, acontece de surpresa depois que não faço nada. Ou talvez eu tenha feito algo dois minutos atrás.
A única maneira reproduzível de fazer a atualização é duplicar a camada no menu de legenda - a duplicata sempre obtém seus dados do shapefile atual e a camada original também se atualiza! Portanto, deve haver alguma maneira de fazê-lo.
Eu acho que estava funcionando melhor no 2.8, mas esse é o 2.10, então talvez haja um novo bug em algum lugar.
Relacionado, mas não funciona para mim na versão 2.10:
Como recarregar automaticamente as camadas de varredura se a origem for alterada no QGIS?
Outras coisas que eu tentei:
layer.dataProvider().dataChanged.emit()
- trabalhou uma vez, depois não novamente na mesma camada
Acho que rastreei por que a duplicação da camada funciona - se eu criar uma nova camada descartável com base na camada atualizada e depois ligar .triggerRepaint()
para a camada atualizada, ela será atualizada na tela do mapa:
QgsVectorLayer( layer.source(), "layer copy", layer.providerType() )
layer.triggerRepaint()
Se eu usar uma fonte de camada diferente, ela não funcionará, então parece que se você criar um objeto de camada com base na mesma fonte de camada ...
Um teste rápido agora com uma camada de varredura (de um GeoTIFF), e apenas a chamada rlayer.triggerRepaint()
parece atualizar de forma confiável a exibição da varredura na tela do mapa.
layer.setCacheImage(None)
e layer.triggerRepaint()
?
triggerRepaint()
na camada original. v 2.10.1-Pisa