QGIS插件设置栅格temporal属性后 temporal controller无法自动显示
QGIS插件时间属性设置后图层不按时显示问题解决
问题描述
我开发了一款QGIS插件,用于转换HDF5文件数据。将数据转成栅格后通过addRasterLayer加载到界面,接着执行以下代码设置时间属性:
temporal_properties = layer.temporalProperties() temporal_properties.setMode(mode) start = date end = date temporal_properties.setFixedTemporalRange(QgsDateTimeRange(start - timedelta(minutes=self.pas_minutes/2), end + timedelta(minutes=self.pas_minutes/2))) temporal_properties.setIsActive(True)
代码执行无报错,但手动激活时间控制器后,栅格无法按设置的时间范围显示。必须进入图层属性窗口点击「应用」才会正常显示,处理大量图层时操作非常繁琐。这个问题从QGIS 3.16版本开始出现,3.10版本可正常运行。我试过刷新画布、更新时间控制器范围等方法,都没用,想问是不是漏了操作步骤,还是QGIS的bug?
解决方法
触发图层属性变更信号:QGIS 3.16+对图层属性的变更通知机制有调整,设置完时间属性后,需要手动触发图层的变更信号,让QGIS重新识别图层的时间属性。在代码最后添加:
layer.temporalPropertiesChanged.emit() # 或触发数据变更信号 layer.dataChanged.emit()强制刷新时间控制器:主动刷新时间控制器状态,确保它读取最新的图层时间范围:
from qgis.core import QgsProject from qgis.gui import QgsGui temporal_controller = QgsGui.instance().temporalController() # 更新控制器时间范围为所有图层的合并范围 temporal_controller.updateTemporalRange(QgsProject.instance().temporalRange()) temporal_controller.reloadFrame()检查时间模式常量:确认
mode参数使用QGIS 3.16+对应的枚举值,比如QgsRasterLayerTemporalProperties.ModeFixedTemporalRange,避免因枚举值变更导致模式设置不生效。强制重新加载图层:如果以上方法无效,可尝试在设置完时间属性后调用
layer.reload(),但该方法可能影响性能,适合少量图层场景。
内容的提问来源于stack exchange,提问作者Jibédédé
相关产品推荐
相关产品推荐

