You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用PyQGIS修改QgsMeshLayer的提供者时间设置为秒

QgsMeshLayer 时间单位修改无效问题:小时改秒不生效

我使用QgsMeshLayer时,试图将数据提供者的时间单位从默认的小时修改为秒,但执行以下代码后,时间设置仍保持小时状态:

from qgis.core import (
    QgsProject,
    QgsMeshLayer,
    QgsCoordinateReferenceSystem,
    QgsLayerMetadata,
)
from PyQt5.QtCore import QDateTime

# Load the mesh layer
mesh_layer = QgsMeshLayer(
    path,
    "Mesh Layer",
    "mdal",
)


if isinstance(mesh_layer, QgsMeshLayer):
    # Access temporal properties
    temporal_properties = mesh_layer.temporalProperties()

    # Set reference time
    reference_time = QDateTime.fromSecsSinceEpoch(0)  # Epoch time: "1970-01-01T00:00:00Z"
    capabilities = mesh_layer.dataProvider().temporalCapabilities()
    if capabilities:
        print("Temporal capabilities retrieved successfully.")
        temporal_properties.setReferenceTime(reference_time, capabilities)
        print(f"Reference time set to: {temporal_properties.referenceTime().toString()}")
    
    # Access and modify metadata to enforce seconds
    metadata = mesh_layer.metadata()
    metadata.setAbstract("Time units: seconds")
    mesh_layer.setMetadata(metadata)

    # Refresh the mesh layer
    mesh_layer.triggerRepaint()
    QgsProject.instance().addMapLayer(mesh_layer)
    print("Mesh layer updated: Time units set to seconds and layer refreshed.")
else:
    print("Layer is not a valid mesh layer.")

时间设置界面截图


你的代码仅修改了图层元数据和参考时间,并未真正修改数据提供者的时间单位配置。要生效需要直接操作QgsMeshTemporalCapabilities的时间单位属性,具体修正如下:

修正后的完整代码

from qgis.core import (
    QgsProject,
    QgsMeshLayer,
    QgsCoordinateReferenceSystem,
    QgsLayerMetadata,
    QgsUnitTypes  # 新增时间单位枚举导入
)
from PyQt5.QtCore import QDateTime

# Load the mesh layer
mesh_layer = QgsMeshLayer(
    path,
    "Mesh Layer",
    "mdal",
)

if isinstance(mesh_layer, QgsMeshLayer):
    # Access temporal properties
    temporal_properties = mesh_layer.temporalProperties()

    # Set reference time
    reference_time = QDateTime.fromSecsSinceEpoch(0)  # Epoch time: "1970-01-01T00:00:00Z"
    capabilities = mesh_layer.dataProvider().temporalCapabilities()
    if capabilities:
        print("Temporal capabilities retrieved successfully.")
        # 核心修改:设置时间单位为秒
        capabilities.setTimeUnit(QgsUnitTypes.TemporalSeconds)
        temporal_properties.setReferenceTime(reference_time, capabilities)
        print(f"Reference time set to: {temporal_properties.referenceTime().toString()}")
        print(f"Time unit updated to: {QgsUnitTypes.toString(capabilities.timeUnit())}")
    
    # 元数据修改仅作说明,不影响实际时间单位,可按需保留
    metadata = mesh_layer.metadata()
    metadata.setAbstract("Time units: seconds")
    mesh_layer.setMetadata(metadata)

    # 刷新图层并添加到项目
    mesh_layer.triggerRepaint()
    QgsProject.instance().addMapLayer(mesh_layer)
    print("Mesh layer updated: Time units set to seconds and layer refreshed.")
else:
    print("Layer is not a valid mesh layer.")

修改说明

  • 新增QgsUnitTypes导入,用于调用时间单位枚举值
  • 在获取temporalCapabilities后,调用setTimeUnit(QgsUnitTypes.TemporalSeconds)是修改时间单位的核心步骤,直接作用于数据提供者的时间配置
  • 原代码中的元数据修改仅为图层描述,不会改变实际的时间处理逻辑,可根据需求选择保留或删除

内容的提问来源于stack exchange,提问作者Moez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 04:47:18