上一篇文章《xarray指南:插值》中介绍使用 xarray 实现插值,本文介绍如何将该插值应用到 GRIB 2 文件中的要素场。

本文使用 nwpc-oper/nwpc-data 库从本地 GRIB 2 文件中加载要素场。nwpc-data 库介绍请浏览《nwpc-data 库简介》

准备

加载需要的库import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport xarray as xrfrom nwpc_data.data_finder import find_local_filefrom nwpc_data.grib.eccodes import load_field_from_file

站点插值

获取 850hPa 温度场data_file = find_local_file( "grapes_gfs_gmf/grib2/orig", start_time=pd.to_datetime("2020-04-26"), forecast_time="24h",)data_filePosixPath("/g1/COMMONDATA/OPER/NWPC/GRAPES_GFS_GMF/Prod-grib/2020042521/ORIG/gmf.gra.2020042600024.grb2")t850 = load_field_from_file( data_file, parameter="t", level_type="pl", level=500,)t850array([[262.26335937, 262.28335938, 262.29335938, ..., 262.26335937, 262.27335937, 262.30335938], ..., [243.63335937, 243.48335937, 243.64335938, ..., 243.56335938, 243.53335938, 243.73335937]])Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 * latitude (latitude) float64 89.88 89.62 89.38 ... -89.38 -89.62 -89.88 * longitude (longitude) float64 0.0 0.25 0.5 0.75 ... 359.2 359.5 359.8Attributes: GRIB_edition: 2 ...skip... long_name: Temperature units: K

获取北京站温度,[39.8, 116.4667]

索引,最近邻查找,返回距离该点最新的点。注意观察返回结果的坐标值。t850.sel( latitude=39.8, longitude=116.4667, method="nearest")array(279.25335938)Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 latitude float64 39.88 longitude float64 116.5Attributes: GRIB_edition: 2 ...skip... long_name: Temperature units: K

插值t850.interp( latitude=39.8, longitude=116.4667,)array(279.34686817)Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 latitude float64 39.8 longitude float64 116.5Attributes: GRIB_edition: 2 ...skip long_name: Temperature units: K

实际上,两种方法返回的数据不一样。(t850.sel( latitude=39.8, longitude=116.4667, method="nearest") - t850.interp( latitude=39.8, longitude=116.4667,)).item()-0.09350879999999506

同时插值多个站点

获取多个站点的温度:北京:[39.8, 116.4667]

上海:[31.3908, 121.4447]

广州:[23.21, 113.4822]

构建站点坐标对象,并创建新的维度 locationlat = xr.DataArray( [39.8, 31.3908, 23.21], dims="location", coords={ "location": ["bj", "sh", "gz"], })lon = xr.DataArray( [116.4667, 121.4447, 113.4822], dims="location", coords={ "location": ["bj", "sh", "gz"], })

使用新维度插值t850.interp( latitude=lat, longitude=lon)array([279.34686817, 282.03347057, 285.58804322])Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 latitude (location) float64 39.8 31.39 23.21 longitude (location) float64 116.5 121.4 113.5 * location (location)

降尺度

比较使用 xarray 降尺度和目前业务系统中使用 gribpost.exe 生成的降尺度产品的差异。

获取降尺度产品中 850hPa 的温度场down_data_file = ( "/g2/nwp_pd/NWP_PST_DATA/GMF_GRAPES_GFS_POST" "/togrib2/output_togrib2_downscaling/2020042600/" "grapes_downscaling.2020042600024.grb2")down_t850 = load_field_from_file( down_data_file, parameter="t", level_type="pl", level=850,)down_t850array([[263.58795313, 263.59595312, 263.60395313, ..., 268.64095313, 268.70695312, 268.77295313], ..., [291.28795313, 291.38595313, 291.48395313, ..., 290.36095312, 290.11695313, 289.87295312]])Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 * latitude (latitude) float64 70.0 69.9 69.8 69.7 ... -14.8 -14.9 -15.0 * longitude (longitude) float64 45.0 45.1 45.2 45.3 ... 144.8 144.9 145.0Attributes: GRIB_edition: 2 ...skip... long_name: Temperature units: K

使用 interp_like 按 down_t850 的网格对 t850 进行插值interpolated = t850.interp_like(down_t850)interpolatedarray([[263.58835937, 263.59635937, 263.60435938, ..., 268.64135938, 268.70735938, 268.77335938], ..., [291.28835938, 291.38635938, 291.48435938, ..., 290.36135937, 290.11735937, 289.87335938]])Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 * latitude (latitude) float64 70.0 69.9 69.8 69.7 ... -14.8 -14.9 -15.0 * longitude (longitude) float64 45.0 45.1 45.2 45.3 ... 144.8 144.9 145.0Attributes: GRIB_edition: 2 ...skip... long_name: Temperature units: K

计算两者的差值d = interpolated - down_t850darray([[ 4.06250000e-04, 4.06250000e-04, 4.06250000e-04, ..., 4.06250000e-04, 4.06250000e-04, 4.06250000e-04], [ 4.06250000e-04, -1.93750000e-04, 2.06250000e-04, ..., 6.25000001e-06, 2.06250000e-04, 4.06250000e-04], [ 4.06250000e-04, -1.93750000e-04, 2.06250000e-04, ..., -1.93750000e-04, -3.93750000e-04, 4.06250000e-04], ..., [ 4.06250000e-04, 4.06250000e-04, 4.06250000e-04, ..., 6.24999996e-06, 2.06250000e-04, 4.06250000e-04], [ 4.06250000e-04, 2.06250000e-04, 6.25000001e-06, ..., -3.93750000e-04, 6.25000001e-06, 4.06250000e-04], [ 4.06250000e-04, 4.06250000e-04, 4.06250000e-04, ..., 4.06250000e-04, 4.06250000e-04, 4.06250000e-04]])Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0 * latitude (latitude) float64 70.0 69.9 69.8 69.7 ... -14.8 -14.9 -15.0 * longitude (longitude) float64 45.0 45.1 45.2 45.3 ... 144.8 144.9 145.0

计算所有差值绝对值之和np.abs(d).sum()array(256.68321875)Coordinates: time datetime64[ns] 2020-04-26 step timedelta64[ns] 1 days valid_time datetime64[ns] 2020-04-27 pl float64 850.0

查看差值的最大值和最小值d.min().item()-0.0003937500001711669d.max().item()0.00040625000019645086

可以看到,两者的差值在 0.001 级别,考虑到 JPEG 2000 压缩的精度,误差在可接受范围。

参考

https://github.com/nwpc-oper/nwpc-data

题图来自 Pixabay。

matlab站点插值格点,基于xarray的气象场站点和格点插值相关推荐

  1. java基于HuTool工具类ExcelWriter合并单元格

    ** java基于HuTool工具类ExcelWriter合并单元格 ** 1.基于HuTool工具类ExcelWriter合并单元格并且使用 jdk1.8 lambda表达式 效果如下: 用姓名和编 ...

  2. matlab 角度转四元数_基于Matlab的机械臂路径规划

    什么是 trajectory(路径)规划 中文路径在英语中可能有两种翻译: 1. path 2. trajectory 首先告诉大家,我们所说的"路径"是后者--trajector ...

  3. Matlab之在城市环境中基于动态占用网格图的的运动规划仿真(附源码)

    目录 一.介绍 二.设置场景和基于网格的跟踪器 三.设置运动规划器 四.结果 五.总结 六.程序 此示例演示如何使用 Frenet 参考路径在城市驾驶场景中执行动态重新规划.在此示例中,将使用本地环境 ...

  4. matlab 图片倒影_计算物理基于matlab方法研究水中倒影问题

    计算物理基于matlab方法研究水中倒影问题 基于 Matlab 方法研究水中倒影问题[摘 要] 本文介绍了用 matlab 研究倒影问题的方法,利用 matlab 可视化的优点可 以直观的得出结果. ...

  5. matlab统计所有股票分析,MATLAB金融算法分析实战:基于机器学习的股票量化分析...

    MATLAB金融算法分析实战:基于机器学习的股票量化分析 作者:吴婷;余胜威 编著 出版日期:2017年07月 文件大小:32.24M 支持设备: ¥50.00在线试读 适用客户端: 言商书局 iPa ...

  6. rls算法matlab实现,第5章基于RLS算法的数据预测与MATLAB实现MATLAB实现.PDF

    第5章基于RLS算法的数据预测与MATLAB实现MATLAB实现 第 5章 基于 RLS算法的数据预测与 第5章 基于RLS算法的数据预测与MATLAB实现 MATLAB实现 RLS 1795 递归最 ...

  7. qr-rls算法matlab实现,【预测模型】基于RLS算法进行预测matlab源码

    一.简介 1 概述 递归最小二乘(RLS)算法是一种典型的数据处理方法,由著名学者高斯在1795年提出,高斯认为,根据所获得的观测数据来推断未知参数时,未知参数最可能的值是这样一个数据,即它使各项实际 ...

  8. matlab噪音的消除办法,基于MATLAB的噪声消除方法.ppt

    基于MATLAB的噪声消除方法 基于MATLAB的噪声消除方法 答 辩 人 :徐 苏 美 指导教师:杨卫平教授 论文的指导思想 21世纪的社会是信息化社会,我们生活中的每一天都离不开数字信号.随着信息 ...

  9. MATLAB相干成像系统,Matlab光学仿真课程设计-基于Matlb相干与非相干照明成像系统的仿真.docx...

    Matlab光学仿真课程设计-基于Matlb相干与非相干照明成像系统的仿真 东 北 石 油 大 学课 程 设 计课课 程 Matlab光学仿真课程设计 题 目 基于Matlab相干与非相干照明 成像系 ...

最新文章

  1. 一.vtun源码学习笔记
  2. Simulink仿真---PMSM滞环电流控制仿真模型学习
  3. Python DataFrame数据清洗后行索引不连续——reset_index
  4. springboot使用Redis作缓存使用入门
  5. 基于元组,根据月份,计算天数.(Python)
  6. Web网页布局的主要方式 1
  7. 100行Python代码理解深度学习关键概念:从头构建恶性肿瘤检测网络
  8. 信息学奥赛一本通 1055:判断闰年 | OpenJudge NOI 1.4 17
  9. springcloud记录篇6-分布式配置中心
  10. [深入学习Redis]RedisAPI的原子性分析
  11. python django ajax 逻辑推理_python django初识ajax
  12. 数据库,万能密码与密码解析
  13. 【Matlab】符号运算总结
  14. 【CVPR 2021】Unsupervised Pre-training for Person Re-identification(UPT)
  15. u3d美术制作规范总结
  16. 【electron】应用在线升级
  17. 洛谷P1478 陶陶摘苹果(升级版)视频题解
  18. Chart.js入门:简介
  19. Java 基础知识 | 02 BigDecimal
  20. html四个图片成正方形排列,html单选按钮变成方形

热门文章

  1. 学习典范【管理学之七】
  2. 20201010基础标签用途说明
  3. lstm 文本纠错_中文文本纠错算法--错别字纠正的二三事
  4. vim 修改文件出现错误“E45: 'readonly' option is set (add ! to override)”
  5. 管理员不让我使用计算机管理,用u盘禁用软件教你实现电脑禁止使用u盘、管理员禁止使用u盘...
  6. 前台服务 StartForeground
  7. Android基础篇 访问Assets文件夹里面的资源【文本、图片、音频、字体包】
  8. 用什么软件可以修改PDF文件,软件的操作方法
  9. 运维的职业发展方向有哪些?该如何规划?
  10. java如何获取storage_本地化存储Storage