使用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()} +

猜你喜欢

转载自blog.csdn.net/weixin_58851039/article/details/131370302