前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >雷达系列:两种基于雷达基数据绘制雷达CAPPI图的方式

雷达系列:两种基于雷达基数据绘制雷达CAPPI图的方式

作者头像
用户11172986
发布于 2024-09-20 07:08:21
发布于 2024-09-20 07:08:21
32102
代码可运行
举报
文章被收录于专栏:气python风雨气python风雨
运行总次数:2
代码可运行

两种基于雷达基数据绘制雷达CAPPI图的方式

个人信息

公众号:气python风雨

温馨提示

由于可视化代码过长隐藏,可点击运行Fork查看 若没有成功加载可视化图,点击运行可以查看 ps:隐藏代码在【代码已被隐藏】所在行,点击所在行,可以看到该行的最右角,会出现个三角形,点击查看即可

前言

前不久pyart库更新了cappi函数,那么我们来进行一波测试

项目目标

本项目旨在解决在气象作图过程中CAPPI计算与绘图问题

项目方法

在以下内容中,将详细介绍两种方法进行CAPPI计算与绘图,帮助读者更好地进行气象数据可视化

更新依赖库

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
!pip install --upgrade arm-pyart  -i https://pypi.mirrors.ustc.edu.cn/simple/
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Requirement already satisfied: arm-pyart in /opt/conda/lib/python3.9/site-packages (1.17.0)
Collecting arm-pyart
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/11/ea/90db3ef2b24f97a5dd6addf0f1627688db120298908dec067fa8e80b466b/arm_pyart-1.19.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (13.8 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m13.8/13.8 MB[0m [31m77.6 MB/s[0m eta [36m0:00:00[0m00:01[0m00:01[0m
[?25hRequirement already satisfied: matplotlib in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (3.8.3)
Requirement already satisfied: pandas in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (2.0.3)
Requirement already satisfied: xarray!=0.21.0 in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (2024.2.0)
Requirement already satisfied: pooch in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (1.8.1)
Requirement already satisfied: cartopy in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (0.23.0)
Requirement already satisfied: pint in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (0.23)
Requirement already satisfied: s3fs in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (0.4.2)
Requirement already satisfied: fsspec in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (2022.3.0)
Collecting xradar>=0.5.0
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/3d/50/df2ae4f0d6a12afc65b4212ae5e2ee280dadf924f24a6c9e407c5541c3b0/xradar-0.6.4-py3-none-any.whl (116 kB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m116.9/116.9 kB[0m [31m7.0 MB/s[0m eta [36m0:00:00[0m
[?25hRequirement already satisfied: cftime in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (1.6.3)
Requirement already satisfied: numpy in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (1.26.4)
Collecting mda-xdrlib
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/4f/4b/5fe3a00833a9f9775b3c237624a6212798167278ffe10fe0de04f58612d0/mda_xdrlib-0.2.0-py3-none-any.whl (14 kB)
Collecting netCDF4>=1.7.0
  Downloading https://mirrors.ustc.edu.cn/pypi/packages/ab/26/98e91ff4751824015f9ea7674bf7681537f1269b715bf794338b383de14f/netCDF4-1.7.1.post2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl (9.0 MB)
[2K     [90m━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━[0m [32m9.0/9.0 MB[0m [31m55.0 MB/s[0m eta [36m0:00:00[0m00:01[0m:00:01[0m
[?25hRequirement already satisfied: scipy in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (1.11.4)
Requirement already satisfied: open-radar-data in /opt/conda/lib/python3.9/site-packages (from arm-pyart) (0.0.9)
Requirement already satisfied: certifi in /opt/conda/lib/python3.9/site-packages (from netCDF4>=1.7.0->arm-pyart) (2024.2.2)
Requirement already satisfied: packaging>=22 in /opt/conda/lib/python3.9/site-packages (from xarray!=0.21.0->arm-pyart) (23.2)
Requirement already satisfied: tzdata>=2022.1 in /opt/conda/lib/python3.9/site-packages (from pandas->arm-pyart) (2024.1)
Requirement already satisfied: python-dateutil>=2.8.2 in /opt/conda/lib/python3.9/site-packages (from pandas->arm-pyart) (2.8.2)
Requirement already satisfied: pytz>=2020.1 in /opt/conda/lib/python3.9/site-packages (from pandas->arm-pyart) (2022.1)
Requirement already satisfied: h5py>=3.0.0 in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (3.8.0)
Requirement already satisfied: dask in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (2024.2.0)
Requirement already satisfied: pyproj in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (3.4.1)
Requirement already satisfied: h5netcdf>=1.0.0 in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (1.3.0)
Requirement already satisfied: xarray-datatree>=0.0.10 in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (0.0.14)
Requirement already satisfied: lat-lon-parser in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (1.3.0)
Requirement already satisfied: xmltodict in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (0.13.0)
Requirement already satisfied: cmweather in /opt/conda/lib/python3.9/site-packages (from xradar>=0.5.0->arm-pyart) (0.3.2)
Requirement already satisfied: shapely>=1.7 in /opt/conda/lib/python3.9/site-packages (from cartopy->arm-pyart) (1.8.5.post1)
Requirement already satisfied: pyshp>=2.3 in /opt/conda/lib/python3.9/site-packages (from cartopy->arm-pyart) (2.3.1)
Requirement already satisfied: pillow>=8 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (9.4.0)
Requirement already satisfied: kiwisolver>=1.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (1.4.2)
Requirement already satisfied: fonttools>=4.22.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (4.33.3)
Requirement already satisfied: contourpy>=1.0.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (1.2.0)
Requirement already satisfied: importlib-resources>=3.2.0 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (5.7.1)
Requirement already satisfied: pyparsing>=2.3.1 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (3.0.9)
Requirement already satisfied: cycler>=0.10 in /opt/conda/lib/python3.9/site-packages (from matplotlib->arm-pyart) (0.11.0)
Requirement already satisfied: typing-extensions in /opt/conda/lib/python3.9/site-packages (from pint->arm-pyart) (4.7.1)
Requirement already satisfied: requests>=2.19.0 in /opt/conda/lib/python3.9/site-packages (from pooch->arm-pyart) (2.27.1)
Requirement already satisfied: platformdirs>=2.5.0 in /opt/conda/lib/python3.9/site-packages (from pooch->arm-pyart) (4.2.0)
Requirement already satisfied: botocore>=1.12.91 in /opt/conda/lib/python3.9/site-packages (from s3fs->arm-pyart) (1.34.51)
Requirement already satisfied: urllib3<1.27,>=1.25.4 in /opt/conda/lib/python3.9/site-packages (from botocore>=1.12.91->s3fs->arm-pyart) (1.26.9)
Requirement already satisfied: jmespath<2.0.0,>=0.7.1 in /opt/conda/lib/python3.9/site-packages (from botocore>=1.12.91->s3fs->arm-pyart) (1.0.1)
Requirement already satisfied: mpi4py>=3.0.2 in /opt/conda/lib/python3.9/site-packages (from h5py>=3.0.0->xradar>=0.5.0->arm-pyart) (3.1.5)
Requirement already satisfied: zipp>=3.1.0 in /opt/conda/lib/python3.9/site-packages (from importlib-resources>=3.2.0->matplotlib->arm-pyart) (3.8.0)
Requirement already satisfied: six>=1.5 in /opt/conda/lib/python3.9/site-packages (from python-dateutil>=2.8.2->pandas->arm-pyart) (1.16.0)
Requirement already satisfied: charset-normalizer~=2.0.0 in /opt/conda/lib/python3.9/site-packages (from requests>=2.19.0->pooch->arm-pyart) (2.0.12)
Requirement already satisfied: idna<4,>=2.5 in /opt/conda/lib/python3.9/site-packages (from requests>=2.19.0->pooch->arm-pyart) (3.3)
Requirement already satisfied: partd>=1.2.0 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (1.2.0)
Requirement already satisfied: toolz>=0.10.0 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (0.12.1)
Requirement already satisfied: importlib-metadata>=4.13.0 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (7.0.1)
Requirement already satisfied: click>=8.1 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (8.1.3)
Requirement already satisfied: cloudpickle>=1.5.0 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (2.0.0)
Requirement already satisfied: pyyaml>=5.3.1 in /opt/conda/lib/python3.9/site-packages (from dask->xradar>=0.5.0->arm-pyart) (5.4.1)
Requirement already satisfied: locket in /opt/conda/lib/python3.9/site-packages (from partd>=1.2.0->dask->xradar>=0.5.0->arm-pyart) (1.0.0)
Installing collected packages: mda-xdrlib, netCDF4, xradar, arm-pyart
  Attempting uninstall: netCDF4
    Found existing installation: netCDF4 1.6.5
    Uninstalling netCDF4-1.6.5:
      Successfully uninstalled netCDF4-1.6.5
  Attempting uninstall: xradar
    Found existing installation: xradar 0.4.3
    Uninstalling xradar-0.4.3:
      Successfully uninstalled xradar-0.4.3
  Attempting uninstall: arm-pyart
    Found existing installation: arm_pyart 1.17.0
    Uninstalling arm_pyart-1.17.0:
      Successfully uninstalled arm_pyart-1.17.0
[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.
meteva 1.8.3 requires netCDF4<=1.6.5,>=1.4.2, but you have netcdf4 1.7.1.post2 which is incompatible.[0m[31m
[0mSuccessfully installed arm-pyart-1.19.1 mda-xdrlib-0.2.0 netCDF4-1.7.1.post2 xradar-0.6.4

PY-ART

当前最流行的雷达开源库pyart在最新版本更新了cappi的函数pyart.retrieve.cappi

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import pyart
from pycwr.io import read_auto
PATH='/home/mw/input/pycwr5461/Z_RADR_I_Z9898_20190828181529_O_DOR_SAD_CAP_FMT (1).bin.bz2'
PRD = read_auto(PATH)
radar = PRD.ToPyartRadar()
# Create CAPPI at 2,000 meters for the 'reflectivity' field
cappi = pyart.retrieve.create_cappi(
    radar, fields=["reflectivity"], height=3000
)

# Create RadarMapDisplay objects for both PPI and CAPPI
radar_display = pyart.graph.RadarMapDisplay(radar)
cappi_display = pyart.graph.RadarMapDisplay(cappi)

# Plotting the PPI and CAPPI for comparison
fig, ax = plt.subplots(1, 2, figsize=(13, 5))

# Plot PPI for 'reflectivity' field
radar_display.plot_ppi("reflectivity",cmap="CN_ref", vmin=-5, vmax=75, ax=ax[0])
ax[0].set_title("PPI Reflectivity")

# Plot CAPPI for 'reflectivity' field
cappi_display.plot_ppi("reflectivity",cmap="CN_ref", vmin=-5, vmax=75, ax=ax[1])
ax[1].set_title("CAPPI Reflectivity at 3000 meters")

# Show the plots
plt.show()

左图为ppi,右图为cappi

PYCWR

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np
from pycwr.draw.RadarPlot import Graph, plot_xy

# 创建一个新的图形,并设置为12列的子图布局
fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(14, 6))

# 绘制PPI图像
graph = Graph(PRD)
graph.plot_ppi(ax1, 0, "dBZ", cmap="CN_ref")  # 0代表第一层, dBZ代表反射率产品
ax1.set_title("PPI Plot", fontsize=16)
ax1.set_xlabel("Distance From Radar In East (km)", fontsize=14)
ax1.set_ylabel("Distance From Radar In North (km)", fontsize=14)

# 准备CAPPI数据
x1d = np.arange(-230000, 230001, 1000)  # x方向1km等间距, -150km~150km范围
y1d = np.arange(-230000, 230001, 1000)  # y方向1km等间距, -150km~150km范围
PRD.add_product_CAPPI_xy(XRange=x1d, YRange=y1d, level_height=3000)  # level height units:meters
grid_x, grid_y = np.meshgrid(x1d, y1d, indexing="ij")

# 绘制CAPPI图像
plot_xy(ax2, grid_x, grid_y, PRD.product.CAPPI_3000)  # 画图显示
ax2.set_title("CAPPI Plot at 2000m", fontsize=16)
ax2.set_xlabel("Distance From Radar In East (km)", fontsize=14)
ax2.set_ylabel("Distance From Radar In North (km)", fontsize=14)

# 调整布局以防止标签重叠
plt.tight_layout()
# 显示图像
plt.show()

小结

两者CAPPI插值出来的结果不太一致,真让人头大 明显看出pyart的函数应该在某个地方判断有问题,导致绘制出的cappi图像位置不合理 pycwr的计算结果明显合理多了 可能是插值算法的区别,pyart源码中使用了RectBivariateSpline插值 pycwr应该是使用了IDW插值 还是实践出真知,新出的算法还需多多复盘

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

本文分享自 气python风雨 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
快速上手:用最小堆实现高效通用的定时器组件
  在程序开发过程中,定时器会经常被使用到。而在Linux应用开发中,系统定时器资源有限,进程可创建的定时器数量会受到系统限制。假如随便滥用定时器,会导致定时器资源不足,其他模块便无法申请到定时器资源。   如上,假如同一进程中多个模块,需要同时申请不同周期定时器,就会导致模块创建定时器失败。
开源519
2025/02/27
880
快速上手:用最小堆实现高效通用的定时器组件
PHP 多任务秒级定时器的实现方法
最近在公司部署crontab的时候,突发奇想是否可以用PHP去实现一个定时器,颗粒度到秒级就好,因为crontab最多到分钟级别,同时也调研了一下用PHP去实现的定时器还真不太多,Swoole 扩展里面到实现了一个毫秒级的定时器很高效,但毕竟不是纯PHP代码写的,所以最后还是考虑用PHP去实现一个定时器类,以供学习参考。
码农编程进阶笔记
2022/08/18
7290
PHP 多任务秒级定时器的实现方法
时间驱动:探索计时器方案和革命性的时间轮技术
(1)心跳检测 (2)游戏中的技能冷却 (3)倒计时 (4)其他需要延迟处理的功能 定时器,就是指定某个时间处理某个事情。
Lion Long
2024/09/21
1360
时间驱动:探索计时器方案和革命性的时间轮技术
定时器实现原理剖析
时间对于我们来说都不陌生,每时每刻都能感受到它的存在。时间又是一个抽象的概念,看不见摸不着。在我们编写程序的时候,对时间的使用非常频繁。本文讲述Go中时间相关函数的使用和实现原理,时间相关的源码在src下的time包和runtime包,下面的分析基于的Go的1.14版本。
数据小冰
2022/08/15
9680
定时器实现原理剖析
Linux下C++两种常见的定时任务写法
在用C++实现一个定时任务框架文章中实现了一个定时任务的框架,本文将将继续针对定时任务进行介绍帮助大家根据具体的应用场景选择合适的方式。
CPP开发前沿
2024/07/15
3550
Linux下C++两种常见的定时任务写法
c++ 时间轮定时器实现
之所以写这篇文章,是在一篇博客中看到了时间轮定时器这个东西,感觉很是惊艳。
榴莲其实还可以
2018/11/09
10.8K8
muduo网络库学习之EventLoop(一):事件循环类图简介和muduo 定时器TimeQueue
s1mba
2017/12/28
2K0
muduo网络库学习之EventLoop(一):事件循环类图简介和muduo 定时器TimeQueue
深入Linux C/C++ Timer定时器的实现核心原理
我曾以为像定时器这样基础的功能,操作系统会有一个完备的实现。当需要开启一个定时任务的时候,会有一个优雅的、如下形式的接口:
sunsky
2020/12/21
11.3K0
深入Linux C/C++ Timer定时器的实现核心原理
基于腾讯云AI代码助手辅助实现一个C++定时器类的功能实现
最近注意到了腾讯云AI代码助手这款辅助编码工具,正好自己又有一个项目上的小需求,故决定将其求助于AI实现。
晨星成焰
2024/08/09
1440
基于腾讯云AI代码助手辅助实现一个C++定时器类的功能实现
Swoole 源码分析之 Timer 定时器模块
Swoole 中的毫秒精度的定时器。底层基于 epoll_wait 和 setitimer 实现,数据结构使用最小堆,可支持添加大量定时器。
码农先森
2024/07/01
740
asio 调度器实现 - timer 实现详解
前面我们讲了基本的任务调度支持, 实际业务使用中, 还会有很多跟时间相关的任务, 所以一般的调度器也会包含定时器的支持, 我们先整体性的了解一下asio这部分的实现:
fangfang
2023/05/23
7120
asio 调度器实现 - timer 实现详解
多级时间轮定时器_时间轮与哈希表定时
顾名思义,时间轮就像一个轮子,在转动的时候外界会指向轮子不同的区域,该区域就可以被使用。因此只要将不同时间的定时器按照一定的方法散列到时间轮的不同槽(即时间轮划分的区域)之中,就可以实现在运转到某个槽时,进行判断该定时器是否已经到达运行时间(需要判断是由于有的定时器并非在这一圈就需要运行,可能需要后面几圈才会运行。
全栈程序员站长
2022/11/10
1.2K0
多级时间轮定时器_时间轮与哈希表定时
golang 系列:定时器 timer
在 Go 里有很多种定时器的使用方法,像常规的 Timer、Ticker 对象,以及经常会看到的 time.After(d Duration) 和 time.Sleep(d Duration) 方法,今天将会介绍它们的使用方法以及会对它们的底层源码进行分析,以便于在更好的场景中使用定时器。
lincoln
2021/08/12
5.2K0
libevent实现定时器
在之前的文章里我们讲过,libevent最后处理都是在event_base_loop调用了相应的dispatch函数,定时器也是在dispatch函数中处理的。
cpp加油站
2021/04/16
1.3K0
代码拜年:SRS高精度低误差定时器
服务器的定时器一直都有不准确的问题,包括大名鼎鼎的Nginx也是一样,定时器的误差本质上是由于并发引起的,这是服务器要解决的本质问题。 趁今年过春节,仔细分析了ST的调度和定时器机制,目前大部分时候定时器能达到25ms之内的精度,要完整解决这个问题还需要继续改善。 并发 首先,考虑服务器怎么支持并发?目前Linux服务器基本就是epoll了,下面是示意代码: nfd = epoll_wait(fds, timeout);for (int i = 0; i < nfd; i++) {    int
Winlin
2022/03/18
5990
c++异步:asio的scheduler实现!
导语 | 前面的篇章《C++异步:libunifex的scheduler实现!》中其实也提到过,libunifex的scheduler实现离实用级其实还有一些差距。对比asio相关的实现,处理细节和完备度上都有较大落差,基于总览篇提到的整体实践思路,我们将更多使用asio的scheduler来作为execution的底层调度器。所以从本篇开始,我们将详细介绍asio相关的实现,本篇主要介绍asio传统的lambda post调度器。 一、asio对通用任务的支持 大部分时候我们使用asio更多的是将它用作一
腾讯云开发者
2022/08/26
1.7K0
c++异步:asio的scheduler实现!
详细介绍下C/C++时间相关的那些函数
chrono是一个关于时间的库,起源于boost,现在是C++的标准,话说现在的C++标准好多都是源于boost,要进标准的特性似乎都会先在boost试验一番。
C语言与CPP编程
2020/12/02
7380
详细介绍下C/C++时间相关的那些函数
【项目日记】仿mudou的高并发服务器 --- 实现基础高并发服务器基础模块
实现高并发服务器的基础是实现基于事件触发的Reactor模型,通过Reactor模型对事件进行统一管理。对此我们需要设计:
叫我龙翔
2024/11/24
620
【项目日记】仿mudou的高并发服务器 --- 实现基础高并发服务器基础模块
Go中定时器实现原理及源码解析
我在春节期间写了一篇文章有关时间轮的:https://www.luozhiyun.com/archives/444。后来有同学建议我去看看 1.14版本之后的 timer 优化。然后我就自己就时间轮和 timer 也做了个 benchmark:
luozhiyun
2021/03/07
1.4K0
真香|定时器这么玩,我感觉我又行了
刚开始写代码的时候,可能更注重的是功能的实现,实现了功能之后,慢慢开始思考如何优雅的实现功能了,成为嵌入式开发的“高质量开发者”。今天小飞哥给大家伙介绍介绍如何优雅的使用定时器。当然,此方法不局限于定时器,重要的是掌握这种方法~
用户8913398
2021/10/20
4480
推荐阅读
相关推荐
快速上手:用最小堆实现高效通用的定时器组件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验