How to automatically reload raster layers if source is changed in QGIS?
I suppose your question does not include change detection, as your sample only concerns QgsMapCanvas.refresh()
Instead you have to call QgsRasterLayer.triggerRepaint()
If your layer is called myLayer:
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
The same method exists for vector layers as well.
For low overhead file change notification I'd propose looking into Qt's QFileSystemWatcher
, which makes use of inotify on linux and similar techniques on other platforms.
from PyQt4.QtCore import QFileSystemWatcher
def refreshLayer():
myLayer.setCacheImage( None )
myLayer.triggerRepaint()
watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )
Of course this can be combined with an MD5 check as proposed by nickves or a modification time check with os.stat
(Nathan W proposal).
You can check if the file hash has changed between intervals
eg:
def md5checksum(fp):
import hash
with open(fp, 'rb') as fh:
m = hashlib.md5()
while True:
data = fh.read(8192)
if not data:
break
m.update(data)
return m.hexdigest()
import time
import copy
a,b = str(),str()
while True:
a = md5checksum(fp) # file
if a != b: # the file has changed, do what you want
myLayer.triggerRepaint()
b = copy.copy(a) #shallow copy, otherwise a and b will point at the same object
else:
sleep.time(1) #wait for 1 sec, then recheck
It's a bit hackish, but the underline idea is valid
(The md5 hash check found here)