前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >气象编程 | cdo配合shape文件提取CMIP6指定区域数据

气象编程 | cdo配合shape文件提取CMIP6指定区域数据

作者头像
气象学家
发布2021-07-28 14:21:04
4.1K1
发布2021-07-28 14:21:04
举报
文章被收录于专栏:气象学家

1、前言

前面已经给大家介绍过如何用cdo配合shape文件提取CMIP6指定区域数据,这个思路首先需要用gdal将shape文件转为netCDF格式的文件,然后再用cdo ifthen进行裁剪,今天要给大家介绍的是如何用gepandas+salem库直接用shape文件对CMIP6文件进行掩码,无需把shape文件转换为netCDF格式文件,最后再调用cdo的selbox操作进行裁剪。

2、数据处理

首先导入需要的库

代码语言:javascript
复制
import numpy as np
import xarray as xa
import geopandas as geo
import salem

然后,把中国中国区域的shape内容打印看一下:

代码语言:javascript
复制
China_shp  = geo.read_file('/mnt/e/shp/china.shp')
print(China_shp)

接下来,我们就可以用geopandas库直接对当前的CMIP6数据进行掩码。

代码语言:javascript
复制
dset = xa.open_dataset('/mnt/e/test/CMIP6.nc')
land  = dset.salem.roi(shape=China_shp)
land = land.sfcWind
land.to_netcdf(path = '/mnt/e/test/output.nc')

代码非常简单,第一行是读取原始CMIP6的数据,第二行代码就完成了转换工作,是不是非常简单?第三行,仅保留需要的风速数据,第四行,我们就把掩码后的数据另存为nc文件了。

注意:其实第三行的代码是可以去掉的,但是本人的shp文件可能存在一点问题,当没有提取sfcWind数据而直接保存时,第四行代码在执行时出现问题,故采取了折中的处理方式,大家在实际操作过程中,如何保存数据,需要依情况决定。

接下来通过对比掩码前后的图片检查效果。

掩码前是全球数据:

掩码后的图片,仅包括中国区域:

这里还需要注意一点的是,经过掩码之后,output.nc文件跟CMIP6.nc文件大小(基本上)还是一样大,至于原因,我想可能是这个操作只是根据shape文件,把shape文件之外的区域值全部设置为nan,如果想让output.nc文件进一步降低文件大小,还需要进行cdo的selbox操作。

导入cdo模块后,就可以直接调用cdo.sellonlatbox函数:

代码语言:javascript
复制
from cdo import Cdo
cdo = Cdo()
cdo.sellonlatbox( '70,140,0,60', input = '/mnt/e/test/output.nc', output = '/mnt/e/test/output2.nc')# '70,140,15,40'是东经70-140的范围,北纬0-60度的范围内

从图中可以看出CMIP6.nc和output.nc文件大小是一样大,但是经过selbox操作之后,output2.nc文件就很小了。

最后,我们再来看一下output2.nc的效果:

其实只看图片效果,可能还想不明白,为什么output2的文件大小会减少的如此之多,但结合nc文件的lat和lon数据,就能想明白了,这里的数据已经不是全球180x360的数据了。


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

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

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1、前言
  • 2、数据处理
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档