使用QGIS将长时间序列的逐月的NC平均气温栅格数据计算为年平均气温栅格

使用Python脚本在QGIS中将逐月NC平均气温栅格数据计算为年平均气温栅格数据的步骤。在运行此脚本之前,请确保已经安装了QGIS Python API。
# 导入所需的库和模块
import os
from qgis.core import QgsRasterLayer, QgsProcessingAlgorithm, QgsProcessingParameterRasterDestination, QgsProcessingParameterString, QgsProcessingParameterNumber, QgsProcessingParameterMultipleLayers, QgsVectorLayer, QgsCoordinateReferenceSystem, QgsProcessingAlgorithmProvider, QgsProcessing

class AnnualAverageTemperatureAlgorithm(QgsProcessingAlgorithm):
    INPUT_NC_DIRECTORY = 'INPUT_NC_DIRECTORY'
    OUTPUT_DIRECTORY = 'OUTPUT_DIRECTORY'
    START_YEAR = 'START_YEAR'
    END_YEAR = 'END_YEAR'

    def tr(self, string):
        return QgsProcessing.tr('Annual Average Temperature')

    def createInstance(self):
        return AnnualAverageTemperatureAlgorithm()

    def name(self):
        return 'annual_average_temperature'

    def displayName(self):
        return self.tr('Annual Average Temperature')

    def group(self):
        return self.tr('Temperature Analysis')

    def groupId(self):
        return 'temperature_analysis'

    def shortHelpString(self):
        return self.tr('Calculate the annual average temperature from a time series of monthly NC raster data.')

    def initAlgorithm(self, config=None):
        # 添加输入参数:NC文件夹
        input_directory = QgsProcessingParameterString(
            self.INPUT_NC_DIRECTORY,
            self.tr('Input directory containing NC files')
        )
        input_directory.setMetadata({
            'widget_wrapper': {
                'type': 'directory'
            }
        })
        self.addParameter(input_directory)

        # 添加输出参数:输出文件夹
        output_directory = QgsProcessingParameterString(
            self.OUTPUT_DIRECTORY,
            self.tr('Output directory')
        )
        output_directory.setMetadata({
            'widget_wrapper': {
                'type': 'directory'
            }
        })
        self.addParameter(output_directory)

        # 添加输入参数:开始年份
        start_year = QgsProcessingParameterNumber(
            self.START_YEAR,
            self.tr('Start year'),
            type=QgsProcessingParameterNumber.Integer,
            minValue=1900,
            maxValue=2100
        )
        self.addParameter(start_year)

        # 添加输入参数:结束年份
        end_year = QgsProcessingParameterNumber(
            self.END_YEAR,
            self.tr('End year'),
            type=QgsProcessingParameterNumber.Integer,
            minValue=1900,
            maxValue=2100
        )
        self.addParameter(end_year)

    def processAlgorithm(self, parameters, context, feedback):
        input_directory = self.parameterAsString(
            parameters,
            self.INPUT_NC_DIRECTORY,
            context
        )
        output_directory = self.parameterAsString(
            parameters,
            self.OUTPUT_DIRECTORY,
            context
        )
        start_year = self.parameterAsInt(parameters, self.START_YEAR, context)
        end_year = self.parameterAsInt(parameters, self.END_YEAR, context)

        # 处理每一年的数据
        for year in range(start_year, end_year + 1):
            # 累计气温总和和像素数量
            temperature_sum = None
            pixel_count = None

            # 遍历每个月的数据文件
            for month in range(1, 13):
                # 构建NC文件路径
                nc_file = os.path.join(input_directory, f'temp_{year}_{month}.nc')
                if not os.path.exists(nc_file):
                    continue

                # 加载NC文件为栅格图层
                layer = QgsRasterLayer(f'netcdf:{nc_file}:tas', f'temperature_{year}_{month}')

                # 如果第一个文件,先创建输出图层
                if temperature_sum is None:
                    output_file = os.path.join(output_directory, f'temperature_{year}.tif')
                    writer = QgsRasterFileWriter(output_file)
                    writer.setCreateOptions([
                        'COMPRESS=LZW',
                        'TILED=YES'
                    ])
                    writer.setDataType(layer.dataProvider().dataType())
                    writer.setWidth(layer.width())
                    writer.setHeight(layer.height())
                    writer.setExtent(layer.extent())
                    writer.setNoDataValue(layer.dataProvider().noDataValue())
                    writer.addBand()

                    temperature_sum = QgsRasterLayer(writer.fileName(), f'temperature_sum_{year}')
                    pixel_count = QgsRasterLayer(writer.fileName(), f'pixel_count_{year}')
                    temperature_sum.dataProvider().fill(0.0)
                    pixel_count.dataProvider().fill(0)

                # 累计气温总和和像素数量
                sum_alg = QgsProcessingAlgorithms.createAlgorithmByName('qgis:rastercalculator')
                sum_alg.setParameterValue('FORMULA', f'{temperature_sum.name()} +

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

认真学GIS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值