Làm cách nào để tự động tải lại các lớp raster nếu nguồn được thay đổi trong QGIS?


8

Làm thế nào để tự động tải lại lớp raster nếu nguồn bị thay đổi? (Đường dẫn giống nhau nhưng bên trong tệp nguồn là những thay đổi)

Tôi sử dụng:

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

nhưng lớp không làm mới.

# # #

Các bản đồ được sơn lại nhưng vẫn có cùng một hình ảnh (tệp nguồn được thay đổi trên đĩa)

Tôi sử dụng:

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

Bộ đệm kết xuất có bị tắt trong Cài đặt => Tùy chọn => Kết xuất không? Nếu đây là sự cố, bạn có thể vô hiệu hóa nó hoặc gọi setCacheImage (Không có) trên lớp để loại bỏ bộ đệm hiện tại.
Matthias Kuhn

Câu trả lời:


11

Tôi cho rằng câu hỏi của bạn không bao gồm phát hiện thay đổi, vì mẫu của bạn chỉ liên quan đến QgsMapCanvas.refresh()

Thay vào đó bạn phải gọi QgsRasterLayer.triggerRepaint()

Nếu lớp của bạn được gọi là myLayer:

myLayer.setCacheImage( None )
myLayer.triggerRepaint()

Phương pháp tương tự tồn tại cho các lớp vector là tốt.

Đối với thông báo thay đổi tệp trên không thấp, tôi đề xuất xem xét Qt QFileSystemWatcher, sử dụng inotify trên linux và các kỹ thuật tương tự trên các nền tảng khác .

from PyQt4.QtCore import QFileSystemWatcher

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

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

Tất nhiên, điều này có thể được kết hợp với kiểm tra MD5 theo đề xuất của các biệt danh hoặc kiểm tra thời gian sửa đổi với os.stat(đề xuất của Nathan W).


2

Bạn có thể kiểm tra xem tệp băm có thay đổi giữa các khoảng thời gian không

ví dụ:

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

Đó là một chút hackish, nhưng ý tưởng gạch dưới là hợp lệ

(Kiểm tra băm md5 được tìm thấy ở đây )


1
Điều này sẽ có chi phí khá lớn cho các lớp lớn.
Nathan W

đúng, nó có thể cho các bộ dữ liệu lớn, nhưng đó là con trăn thuần túy
biệt danh

1
Tôi sẽ chỉ sử dụng os.stat docs.python.org/2/library/os.html#os.stat
Nathan W
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.