QGISでソースが変更された場合、ラスターレイヤーを自動的に再読み込みする方法は?


8

ソースが変更された場合、ラスターレイヤーを自動的に再読み込みする方法 (パスは同じですが、ソースファイル内が変更されています)

私が使う:

 qgis.utils.iface.mapCanvas().refresh()

しかし、レイヤーは更新されません。

###

マップは再描画されていますが、同じ画像がまだあります(ソースファイルがディスク上で変更されています)

私が使う:

  layers = qgis.utils.iface.legendInterface().layers()
  for layer in layers:
      layer.triggerRepaint()

設定=>オプション=>レンダリングでレンダリングキャッシュが無効になっていますか?これが問題である場合は、それを無効にするか、レイヤーでsetCacheImage(None)を呼び出して現在のキャッシュを閉じることができます。
Matthias Kuhn

回答:


11

あなたのサンプルは関係しているので、あなたの質問には変更の検出が含まれていないと思います QgsMapCanvas.refresh()

代わりにあなたは電話しなければなりません QgsRasterLayer.triggerRepaint()

レイヤーがmyLayerと呼ばれる場合:

myLayer.setCacheImage( None )
myLayer.triggerRepaint()

同じ方法がベクターレイヤーにも存在します。

低オーバーヘッドのファイル変更通知のために私はQtのを検討して提案したいQFileSystemWatcher、使用可能どのinotifyのを Linuxとで同様の技術上の のプラットフォーム

from PyQt4.QtCore import QFileSystemWatcher

def refreshLayer():
    myLayer.setCacheImage( None )
    myLayer.triggerRepaint()

watcher = QFileSystemWatcher()
watcher.addPath( '/path/to/your/raster' )
watcher.fileChanged.connect( refreshLayer )

もちろん、これはニックネームによって提案されたMD5チェックまたはos.stat(Nathan Wプロポーザル)を使用した変更時間チェックと組み合わせることができます。


2

間隔の間にファイルハッシュが変更されたかどうかを確認できます

例えば:

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

それは少しハックですが、下線のアイデアは有効です

(MD5ハッシュチェックが見つかりました。ここに


1
これは、大きなレイヤーに対してかなり大きなオーバーヘッドになります。
Nathan W


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.