【WRF数据处理】基于Python处理静态地理数据:LAI、Albedo、LUCC
【WRF数据处理】基于Python处理静态地理数据:LAI、Albedo、LUCC
- update_NC_file函数
- 参考
update_NC_file函数
函数功能:从现有的 NetCDF 文件中读取地理数据,进行一些处理后,生成新的 NetCDF 文件。
导入库:
import netCDF4 as nc
from shutil import copyfile
import copy
- netCDF4: 用于读取和写入 NetCDF 文件格式的库,特别适用于气象和气候数据。
- shutil.copyfile: 用于文件复制的函数。
- copy: 用于深拷贝对象的模块,以防止对原始数据的修改。
函数 read_geo
功能: 从指定的 NetCDF 文件中读取四个变量(LAI、绿色覆盖度、反照率和土地利用指数),并返回这些数据。
返回值: 四个 NumPy 数组。
def read_geo(geo_file):
nc_data_obj = nc.Dataset(geo_file)
lai = nc_data_obj.variables['LAI12M'][:]
greenfac = nc_data_obj.variables['GREENFRAC'][:]
albe = nc_data_obj.variables['ALBEDO12M'][:]
lu = nc_data_obj.variables['LU_INDEX'][:]
return lai, greenfac, albe, lu
函数 gene_new
功能: 生成新的地理数据,修改土地利用指数。
步骤:
1、读取基础地理数据。
2、深拷贝土地利用指数(防止对原始数据的修改)。
3、遍历每个波段,读取对应月份的地理数据,并将其赋值到基础数据中。
4、将土地利用指数中值为 13 的像素修改为 31。
返回值: 更新后的 LAI、绿色覆盖度、反照率和土地利用指数。
def gene_new(t_path, m_path, do_num):
lai_t, greenfac_t, albe_t, lu_t = read_geo(t_path)
lu = copy.deepcopy(lu_t)
band, row, col = lai_t[0, :, :, :].shape
for b in range(0, band):
path = m_path + '\\' + 'month' + str(b + 1) + do_num + '.nc'
lai, greenfac, albe, lu = read_geo(path)
for r in range(0, row):
for c in range(0, col):
lai_t[0, b, r, c] = lai[0, r, c]
greenfac_t[0, b, r, c] = greenfac[0, r, c]
albe_t[0, b, r, c] = albe[0, r, c]
for r in range(0, row):
for c in range(0, col):
if lu[0, r, c] == 13:
lu_t[0, r, c] = 31
return lai_t, greenfac_t, albe_t, lu_t
函数 revise_nc
功能: 更新指定的 NetCDF 文件中的变量内容。
步骤: 打开文件并用新的数据替换对应的变量,最后关闭文件。
def revise_nc(new_file, lai_new, greenfac_new, albe_new, lu_new):
newfile = nc.Dataset(new_file, 'r+')
newfile.variables['LAI12M'][:] = lai_new
newfile.variables['GREENFRAC'][:] = greenfac_new
newfile.variables['ALBEDO12M'][:] = albe_new
newfile.variables['LU_INDEX'][:] = lu_new
newfile.close()
函数主代码如下:
功能: 遍历两个 NetCDF 文件(d0和d1),读取旧数据和新数据,生成新的 NetCDF 文件并更新内容。
步骤:
1、为每个数据集生成文件路径。
2、读取和生成新的地理数据。
3、复制原始文件到新位置。
4、更新新文件中的数据。
5、打印完成信息。
old_nc_folder = r'D:\WRF_lgDes\geo_em\old'
m_path = r'D:\WRF_lgDes\geo_em\nc_files'
new_nc_folder = r'D:\WRF_lgDes\geo_em\new'
for d in [1, 2]:
t_path = old_nc_folder + '\\' + "geo_em.d0" + str(d) + ".nc"
do_num = 'd0' + str(d)
new_file = new_nc_folder + '\\' + "geo_em.d0" + str(d) + ".nc"
lai_new, greenfac_new, albe_new, lu_new = gene_new(t_path, m_path, do_num)
copyfile(t_path, new_file)
revise_nc(new_file, lai_new, greenfac_new, albe_new, lu_new)
print('finish ' + do_num)