之前我发布过基于CRU数据和Goff-Gratch公式计算VPD的博客,见下方:
基于CRU数据计算VPD的博客
但是,CRU数据的分辨率还是较为粗糙(0.5°×0.5°),而ERA5 land数据集分辨率能很好地满足我的需求(0.1°×0.1°)。但是,ERA5 land数据集并不提供水汽压和湿度变量供于下载,这导致利用Goff-Gratch公式很难进行计算。
结合近期文献阅读和整理,这里提供另一种既具权威性也易操作的方法供大家参考。
(注:这里所指的权威性主要指使用该方法的期刊等级和被引量,具体见文末)
饱和水汽压差(Vapor Pressure Deficit,简称VPD) 是指在一定温度下,饱和水汽压与空气中的实际水汽压之间的差值。VPD对于植被生理状态具有重要影响。
简言之,VPD = 饱和水汽压 - 实际水汽压
Clausius-Clapeyron是一个数学公式,用来描述气体或蒸气的压力和温度之间的关系,其表现形式如下,具体不作赘述。此方程不是我们最终计算的方程,而是水汽压和温度间关系的理论框架。
基于Clausius-Clapeyron方程的理论框架以及大量的实验数据,最终学术界得到一种经验性的用以计算特定温度下水汽压的公式,即August-Roche-Magnus马格努斯方程。
通常来说,只使用T>0℃情景的方程(图上红框),除非你需要研究冰面上的气压情况。
但正如上面说的,Magnus方程是基于经验性的,其参数网上有很多不同版本(最为困扰的一点)
读者当然可以使用上图中的方程计算,我这里使用另一个参数版本,原因是其被《SCIENCE ADVANCES》引用过,我就姑且信其所然(出了问题找他吧哈哈)。公式如下:
局限性:我目前暂无法评估不同参数得到结果的可靠性差异,希望有了解的同僚给予指正。
① ERA5 land 2m temperature 地表温度数据
② ERA5 land 2m dewpoint temperature 地表露点温度数据
下载地址:ERA5 land数据集下载地址
注:原数据是开尔文单位,需要转换为摄氏单位。
import os
import numpy as np
from osgeo import gdal
# Magnus公式的计算函数
def Magnus(t_celsius):
return 0.611 * np.exp((17.5 * t_celsius) / (t_celsius + 240.978))
def process_tif(input_path, output_path):
# 打开输入TIFF文件
ds = gdal.Open(input_path)
band = ds.GetRasterBand(1)
temp_data = band.ReadAsArray()
# 将温度从开尔文转换为摄氏度
temp_celsius = temp_data - 273.15
# 计算饱和水汽压
es = Magnus(temp_celsius)
# 创建输出TIFF文件
driver = gdal.GetDriverByName('GTiff')
out_ds = driver.Create(output_path, ds.RasterXSize, ds.RasterYSize, 1, gdal.GDT_Float32)
out_ds.SetGeoTransform(ds.GetGeoTransform())
out_ds.SetProjection(ds.GetProjection())
# 写入数据到输出文件
out_band = out_ds.GetRasterBand(1)
out_band.WriteArray(es)
out_band.SetNoDataValue(-9999)
out_band.FlushCache()
# 关闭数据集
del ds
del out_ds
def main(input_folder, output_folder):
if not os.path.exists(output_folder):
os.makedirs(output_folder)
for file_name in os.listdir(input_folder):
if file_name.endswith('.tif'):
input_path = os.path.join(input_folder, file_name)
output_path = os.path.join(output_folder, f"es_{file_name}")
process_tif(input_path, output_path)
print(f"Processed {file_name}")
if __name__ == "__main__":
input_folder = r'输入文件夹路径'
output_folder = r'输出文件夹路径'
main(input_folder, output_folder)
结果:
可以看到二者结果相差不大,但是分辨率提升明显,预期目的基本达到。
重要事项:
① 提供的代码是用于计算实际水汽压(或饱和水汽压),而非VPD,VPD还需二者做差
② 露点温度对应实际水汽压,地表温度对应饱和水汽压!!!
[1] Z.Q. Zhong, B. He, Y.P. Wang, et al, Disentangling the effects of vapor pressure deficit on northern terrestrial vegetation productivity.Sci. Adv.9,eadf3166(2023).
[2] A. Barkhordarian, K.W.Bowman, N.Cressie,et al, Emergent constraintson tropical atmospheric aridity—Carbon feedbacks andthefutureofcarbon sequestration. Environ. Res.Lett. 16,114008 (2021).
[3] D. Zhao, Z. Zhang, Y. Zhang, Soil moisture dominates the forest dominates the forest productivity decline during the 2022 China compound drought-heatwave event. Geophysical Research Letters, e2023GL104539(2023).