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