MeteoInfo-Java解析与绘图教程(十)_JAVA绘制雷达PPI图

news/2024/12/17 19:41:17/文章来源:https://www.cnblogs.com/zdsgjh/p/18612839

天气雷达的基本要素有很多,特别是双偏振雷达更多,但业务场景经常使用的一般为基本反射率,基本速度这两种要素

接下来我们以基本反射率为例,其他的要素也是一样的,一通百通

首先我们做基本反射率的图需要确定做哪一个仰角层,因为雷达体扫模式的扫描是不同仰角进行扫描的,常规的雷达一般是9个仰角

按照上图就很明显的知道体扫模式的扫描是怎样的情况了

由于雷达基本的要素都是径向数据,我们先以图的方式看径向数据如何绘制

 可以看到,要素产品是由n条径向数据组成,所有的径向数据从O点根据方位角以及距离,正好形成一个完美的圆

所以我们画一层仰角的图就需要距离,方位角,数值即可

现在我们就画基本反射率第一层的径向数据图,也就是0.5度仰角

MeteoDataInfo meteoDataInfo = new MeteoDataInfo();
meteoDataInfo.openData("D:\\tls\\Z_RADR_I_站点_20220407233130_O_DOR_CC_CAP_FMT.bin");
CMARadarBaseDataInfo info = (CMARadarBaseDataInfo) meteoDataInfo.getDataInfo();
//色阶颜色
int[][] cols = {
{255, 255, 255},
{102, 255, 255},
{102, 255, 255},
{0, 162, 232},
{86, 225, 250},
{3, 207, 14},
{26, 152, 7},
{255, 242, 0},
{217, 172, 113},
{255, 147, 74},
{255, 0, 0},
{204, 0, 0},
{155, 0, 0},
{236, 21, 236},
{130, 11, 130},
{184, 108, 208}
};
//色阶数值
double[] levs = new double[]{Integer.MIN_VALUE,0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60, 65, 70,Integer.MAX_VALUE};
//根据RGB返回Color对象
Color[] colors = ColorUtil.getColorsFromStyle(cols);
//根据数值和颜色生成绘图所用的色阶
LegendScheme ls = LegendManage.createGraduatedLegendScheme(levs,colors, ShapeTypes.POLYGON);
List<String> list = new ArrayList<>();
//提前准备好所需要的要素
//反射率
list.add("dBZ");
//方位角
list.add("azimuthR");
//距离
list.add("distanceR");
//仰角
list.add("elevationR");
//从基数据中取出对应数据绘制成图层
VectorLayer layer = MeteoinfoUtil.getRadarArray(info,list,0,ls);
MapView view = new MapView();
view.addLayer(layer);
//导出图片
MeteoinfoUtil.export(view,1200,"D:/tls/r.png");
ColorUtil.getColorsFromStyle这个方法很简单,我随便封装了一下,只是为了满足根据RGB返回Color对象,所以代码就不公布了
而MeteoinfoUtil.getRadarArray是取值的核心,我们来具体讲解一下
public static VectorLayer getRadarArray(CMARadarBaseDataInfo info, List<String> pros, int i, LegendScheme ls) throws Exception {
//站点纬度
Attribute lat = info.findGlobalAttribute("StationLatitude");
//站点经度
Attribute lon = info.findGlobalAttribute("StationLongitude");
//海拔高度
Attribute high = info.findGlobalAttribute("AntennaHeight");
List<String> names = info.getVariableNames();
if (!names.containsAll(pros)) {
return null;
}
//从基数据中读取所需要素的径向数据
Array ay = info.read(pros.get(0));
Array[] arrays = new Array[4];
//获取径向数据的条数,也就是方位角个数
int azimuthNum = ay.getShape()[1];
//获取一条径向数据的数据块个数
int dataBlockNum = ay.getShape()[2];
//---------获取i层的径向数据,格式布局为Z*Y*X
//设定读取数据的起始位置
int[] origin = new int[]{i, 0, 0};
//设定所读取数据数量
int[] size = new int[]{1, azimuthNum, dataBlockNum};
//设定读取数据的步幅
int[] stride = new int[]{1, 1, 1};
//取出要素的单层径向数据
arrays[0] = info.read(pros.get(0), origin, size, stride);
//---------获取i层的方位角
origin = new int[]{i, 0};
size = new int[]{1, azimuthNum};
stride = new int[]{1, 1};
//取出单层的方位角
arrays[1] = info.read(pros.get(1), origin, size, stride);
//-----------获取i层数据块的距离
origin = new int[]{0};
size = new int[]{dataBlockNum};
stride = new int[]{1};
arrays[2] = info.read(pros.get(2), origin, size, stride);
//------------获取i层的仰角数据
origin = new int[]{i, 0};
size = new int[]{1, azimuthNum};
stride = new int[]{1, 1};
arrays[3] = info.read(pros.get(3), origin, size, stride);
//------------获取所需数据end--------------
//将方位角和仰角从角度转化为弧度
Array azi = ArrayMath.toRadians(arrays[1]);
Array ele = ArrayMath.toRadians(arrays[3]);
//使用距离和方位角(弧度)创建二维矩阵,这一步更重要的是为了适用Transform.antennaToCartesian
Array[] a = ArrayUtil.meshgrid(arrays[2], azi);
Array dis = a[0];
azi = a[1];
List<Integer> list = new ArrayList<Integer>();
list.add(dis.getShape()[1]);
重组对象格式
ele = ele.reshape(new int[]{azimuthNum, 1});
//塞数据进去
ele = ArrayUtil.repeat(ele, list, 1);
int h = Integer.parseInt(high.getValue().toString().trim());
//天线坐标转换为笛卡尔坐标
Array[] aa = Transform.antennaToCartesian(dis, azi, ele, h);
String projection = String.format("+proj=aeqd +lon_0=%s +lat_0=%s",
Double.parseDouble(lon.getValue().toString().trim()),
Double.parseDouble(lat.getValue().toString().trim()));
//确定投影,方便后续加地图或地理信息
ProjectionInfo projectionInfo = factory(new CRSFactory().createFromParameters("custom",
projection));
//坐标重投影
Array[] xy = Reproject.reproject(aa[0], aa[1], projectionInfo, LONG_LAT);
//绘制图层
VectorLayer layer = DrawMeteoData.meshLayer(xy[0], xy[1], arrays[0], ls);
return layer;
}

这种方法是最复杂也是速度较慢的,但同时也是不会丢任何数据的方法,下一节我们换种使用了插值法的绘制方法,使用了插值后,性能以及速度就得到了大大的提升  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/854460.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

友情链接

风筝上的猫IT分享--肯定放我自己了访问博客风筝上的猫IT分享--肯定放我自己了访问博客

画8.0

因为期末周忙着做汇报和复习 (其实是因为自己比较懒) ,所以这幅画完成的相当迟了。 头发画起来真实相当费劲啊。

都在使用的《模版模式》

模版符合开闭原则,到处用于钩子方法。有的钩子方法不会改变行为,有的钩子会改变运行轨迹。框架中到处使用。Channel中定义了需要的操作,AbstractChannel实现了核心功能,然后不同的Channel实现只需要告知具体channel的描述信息即可。 Channel 接口⬇︎⬇︎⬇︎点击查看代码 …

ifconfig命令

ifconfig是linux中用于显示或配置网络设备(网络接口卡)的命令,英文全称是network interfaces configuring。配置网卡的IP地址语法例:ifconfig eth0 192.168.0.1 netmask 255.255.255.0 在 实体机上 ifconfig 命令用于 显示或配置网络设备(网络接口卡) 或修改。(以CentOS…

数据智能,融合创新|12月中国数据库行业分析报告已发布, 持续为产业助力

本期报告以数据智能与融合创新为主题,除详解国产数据库市场动向外,探究了在云计算的推动下数据库自治、智能运维能力的产品创新实践,欢迎免费下载。为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析…

maven仓库

https://mvnrepository.com/

【教程】第八章:知识库——学海无涯

通过循序渐进的功能升级,你将打造一个强大的管理系统,让团队协作更高效、流程更智能。8.1 欢迎来到新的一章 在本章中,我们将深入学习如何构建一个知识库。这将是一个综合性的模块,帮助我们管理和组织文档、任务和信息。通过设计和创建一个树形结构的文档表,我们将实现对文…

【YashanDB知识库】如何处理yasql输入交互模式下单行字符总量超过限制4000字节

现象 在yasql执行sql语句后报错:YASQL-00021 input line overflow (>4000 byte at line 4)原因 yasql在交互模式模式下单行字符总量限制4000字节,超出该限制即报错。 交互式模式下,yasql会显示一个提示符,通常是 SQL>,等待用户输入命令, 用户执行的每个命令都会立即…

Fiddler连接mumu模拟器抓包

主要介绍mumu模拟器如何设置 一、模拟器下载fiddler证书 保持本机 fiddler 运行状态 模拟器打开 localhost:8888(端口号),点击下载证书二、安装证书信任 路径:模拟器-网络和互联网-互联网-网络偏好设置 安装证书,选择下载好的 fiddler 证书即可三、开启手动代理 修改网络设…

编写 Java 单元测试最佳实践

在软件开发中,单元测试是保障代码质量的重要环节。对于程序员而言,它不仅提高了代码的稳定性和可维护性,还能帮助企业快速响应市场变化。然而,很多开发团队对单元测试的理解和实践并不深入。而腾讯云 AI 代码助手能够基于代码逻辑自动生成单元测试,减少手动编写测试代码的…

OCR数据集生成项目TextRecognitionDataGenerator

1、开源OCR数据集生成项目TextRecognitionDataGenerator 该项目通过 Python实现,可以通过 pip 安装: 终端: pip install trdg 然后在终端中输入以下命令: 终端:trdg -c 1000 -w 5 就可以生成如下图片,其中 -c 参数表示生成图片的数量, -w 表示图片中单词的个数。参考: …

virtualbox下host-only模型网络宿主机与虚拟机ping不通解决方法

环境介绍: 宿主机: centos 虚拟机:在virtualbox里安装的win7 Ping不通的原因: 宿主机(host)ping不通虚拟机(guest):一般是虚拟机里的windows系统防火墙没有关闭导致的 虚拟机(guest)ping不通宿主机(host):检查“默认网关”是否与virtualbox里设置的host-only的地址一致,一…