前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用xesmf对网格数据进行regrid

利用xesmf对网格数据进行regrid

作者头像
bugsuse
发布2022-09-23 14:26:00
1.6K0
发布2022-09-23 14:26:00
举报
文章被收录于专栏:气象杂货铺

对比不同分辨率的网格数据时,通常需要将数据插值到相同网格。有很多工具可以实现此功能,本文主要讲一下如何利用xesmf对网格数据进行regrid。

工具安装就不说了,首先导入所需要的库:

代码语言:javascript
复制
import xarray as xr
import xesmf as xe
import numpy as np

然后获取CMIP5的月表面温度数据:

代码语言:javascript
复制
url = 'http://dapds00.nci.org.au/thredds/dodsC/rr3/CMIP5/output1/CSIRO-BOM/ACCESS1-3/historical/mon/atmos/Amon/r1i1p1/latest/tas/tas_Amon_ACCESS1-3_historical_r1i1p1_185001-200512.nc'
ds = xr.open_dataset(url)

执行如下语句可以得到原始数据的经纬度网格分辨率:

代码语言:javascript
复制
(ds['lat'].max() - ds['lat'].min())/(ds['lat'].count()-1.)

(ds['lon'].max() - ds['lon'].min())/(ds['lon'].count()-1.)

原始的数据分辨率为 1.25 x 1.875 度,然后将网格插值为2.5x2.5度。可以直接利用 xesmf 的相关函数生成网格:

代码语言:javascript
复制
ds_out = xe.util.grid_2d(-180.0, 180.0, 2.5, -90.0, 90.0, 2.5)

下一步创建 regridder,默认情况下不会保存所使用的权重信息。注意:由于这里所使用的是全球数据,periodic=True是为了保证在沿着中心经度时不会出现空白间隙。

代码语言:javascript
复制
regridder = xe.Regridder(ds, ds_out, 'bilinear', periodic=True)

下一步就是进行插值操作了:

代码语言:javascript
复制
tas_25deg = regridder(ds['tas'])

可以绘图对比一下结果:

代码语言:javascript
复制
ds['tas'].isel(time=0).plot()
tas_25deg.isel(time=0).plot()

插值前后温度分布

如果需要频繁的对相同网格分辨率的数据进行插值,可以重复利用权重信息以节省时间。通过指定文件名保存权重信息:

代码语言:javascript
复制
regridder_save_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,filename='bilinear_145x192_180x360_peri.nc')

然后使用保存的权重信息构建 regridder

代码语言:javascript
复制
regridder_reuse_weights = xe.Regridder(ds,ds_out,'bilinear',periodic=True,reuse_weights=True,filename='bilinear_145x192_180x360_peri.nc')

xesmf支持多种投影方式的网格插值操作,详细信息可以前往官方文档查看。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-06-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 气象汇 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档