J a v a、P y t h o n和Ma t l a b混合编程及其在气象中的应用

2017-09-03 10:57北京信息科技大学陈宇罡汪永青焦瑞莉
电子世界 2017年16期
关键词:数据处理代码编程

北京信息科技大学 陈宇罡 汪永青 李 琳 焦瑞莉

中国科学院大气物理研究所 王立志

J a v a、P y t h o n和Ma t l a b混合编程及其在气象中的应用

北京信息科技大学 陈宇罡 汪永青 李 琳 焦瑞莉

中国科学院大气物理研究所 王立志

本文对于Java、Python和Matlab混合编程方法进行一定的探讨,并结合气象数据的分析处理的实际工作,通过重用原有的Matlab、Python的代码,在数据仓库软件RAMADDA的基础上,快速实现气象数据的统计、分析、发布、可视化,并为未来气象数据基于WEB的在线分析、可视化集成提供借鉴。

Python;Matlab;混合编程;代码重用;数据分析集成

Python是一种面向对象、解释型、动态数据类型的优秀高级通用程序设计语言,相比于其他语言,Python可以更便捷的实现原型开发,并能够和其他语言诸如C++、Java等很好的结合。Matlab是由mathworks公司开发的用于数值计算、科学仿真和数据可视化的高级计算语言和交互式环境,因其强大的计算和绘图功能在气象领域得到了广泛的应用。UCAR提供的开源内容与存储管理系统RAMADDA(Repository for Archiving, Managing and Accessing Diverse DAta)以Java为核心语言,通过IDV(Integrated Data Viewer)嵌入实现三维可视化,在地球科学领域得到广泛应用;其可以覆盖气象业务的大多数数据格式,以数据库技术、文件服务、IDV、Google Map API等技术为基础完成气象数据的内容管理。

因为Python和Matlab在气象数据处理中的广泛应用,大量的基于Python和Matlab的代码被开发并被广泛使用。本文以基于Java语言的RAMADDA系统,通过Java、Python和Matlab混合编程技术,将已有的Python和Matlab数据处理分析代码复用,并通过RAMADDA平台实现数据的快速存储、发布、分析处理及可视化。

1.Java、Python和Matlab混合编程的实现

1.1 Java和Matlab的混合编程,实现Matlab函数的重用

通过在Matlab中运行deploytool,将.m函数通过库编译器(Library Compiler)打包成Java包。同时将生成的jar包和Matlab安装目录下的javabuilder.jar一同添加到Java的库路径中,就可以实现Java对于Matlab函数的调用。

图1 deploytool工具箱

选择Java Package类型,并添加需要打包的.m的Matlab函数文件,按设计需求修改相应的包名、生成的类名称和类方法,最后执行Package动作打包完成,操作如图2所示。

图2 选择类型和.m文件

1.2 使用Jython实现Java和Python及Matlab的混合编程

通过Java和Python的混合调用有三种方法:

1)通过Java编写的类中直接执行Python语句即可,代码如下:

PythonInterpreter interpreter = new PythonInterperter();

Interpreter.exec( “day =(‘Mon’, ‘Tue’, ‘Wed’, ‘Thu’, ‘Fri’,’Sat’, ‘Sun’ ); );

Interpreter.exec( “print( days[1] );” );

2)在Java中调用已经编写好的Python脚本文件,代码如下:

Python文件如下(假设文件名为adder.py):

def adder( a, b ):

return a + b

Java文件如下:

PythonInterpreter interpreter = new PythonInterpreter();

Interpreter.execf i le( “adder.py” );

PyFunction func = (PyFunction)interpreter.get( “adder”, PyFunction.class );

Int a = 2017, b = 2;

PyObject pyobj = func.__call__( new PyInteger( a ), new Py-Integer( b ));

System.out.println( a + “ + “ + b + “ = “ + pyobj.to-String());

3)Java编写的类中直接执行Python脚本文件

PythonInterpreter interpreter = new PythonInterpreter();

Interpreter.execf i le( “adder.py” );

本文中采用第二种方法,通过编写Python实现了关于显著性检验的脚本文件。通过RAMADDA中的Java调用,实现将封装的Matlab的函数实现的文件数据处理部分和Python实现的分析,统一集成到RAMADDA系统中,实现系统对于气象数据的处理分析以及图形可视化输出的功能。

2.气象数据的处理分析

2.1 数据资料

本文中使用数据为美国国家环境预测中心(NCEP)再分析资料计划(1979-现在)的再分析资料集。下载了从1979-2016共38年的逐6小时全球格点气温资料。

2.2 气象资料的处理

针对此资料集,基于Matlab的处理函数,完成数据资料处理,包括不同时空区间的数据提取、不同空间的逐天/逐旬/逐月平均等等。

Matlab的代码如下:

[MonthTempData.MonthMean] = BulkReadFunc( fi les, lon, lat, level, month )

function [MonthAirData,MonthMean] = BulkReadFunc(datadir,lon,lat,level,month)

fi lelist=dir([datadir,’*.nc’]); %指定批量数据的类型

k=length(f i lelist); %多少个nc文件

for s=1:k

fi leName=[datadir,f i lelist(s).name];

[MonthAirData{s},MonthMean(s)] = MonthAirFunc(f i leName,lon,lat,level,month);

%输入年份nc文件,经纬度,月份,时间,返回值为air温度数组和月平均值end end

2.3 显著性检验等数据分析

针对2.2提取的数据,进行数据处理,Python处理代码如下(部分代码示例):

图3 python部分代码示例

2.4 处理分析结果

通过上述数据处理和分析得到的结果,以RAMADDA管理系统进行数据发布、结果展示。本文作为示例仅仅给出了历年2月份的1000百帕的温度分析,区域为北京和华北。

图4 北京及华北2月份1000百帕气温距平图

从图4可见,北京和华北2月距平温度变化高度相关,30年的前十年和后十年均为变暖的趋势,尤其是从2012年开始,由冷到暖的趋势明显。通过简单的分析曲线,为气象工作者提供简便的数据处理和分析工具。

3.结语

因为Matlab在气象领域的广泛应用,使用者手中存在了大量编写完成的函数;Python以其在字符串处理和绘图功能上的优势,使得越来越多的气象科技工作者将其作为主要的数据处理分析工具;Java语言是目前WEB应用开发的主流语言,可应用于多种平台。本文通过实际应用,给出了简单快捷的Java、Python和Matlab的混合编程解决方案:以Java实现的RAMADDA内容管理系统为基础,通过混合编程技术,在充分重用原有的Matlab函数库的基础上通过Python实现数据的分析处理,利用RAMADDA框架实现结果的可视化。

[1]python home[EB/OL]. (2017-05-01). https://www.python.org/.

[2]MATLAB Home(Analyze and design your world-Get the full power of MATLAB)[EB/OL]. (2017-05-01).https://cn.mathworks. com/products/matlab-home.html.

[3]Unidata Support for RAMADDA[EB/OL].(2017-05-10). https:// wiki.ucar.edu/display/unidata/Unidata+Support+for+RAMADDA.

[4]Integrated Data Viewer(IDV)[EB/OL]. (2012-11-15). http:// www.unidata.ucar.edu/software/idv.

[5]张慧,史奎桥,杨扬,等.应用Matlab 自动绘制气象等值线图[J].广东气象,2016,38(4):74-77.

[6]何险峰,马力,罗永康.分布式气象内容管理系统设计[J].气象科技,2013,41(6):1036-1042.

[7]王宁,汪飞星.基于Python开发气象服务器运行系统界面[J].微机发展,2003,13(7):46-47.

北京信息科技大学2016年度‘实培计划’项目资助。

王立志(1971-),男,硕士,高级工程师,主要研究方向数值模式开发、高性能计算。

猜你喜欢
数据处理代码编程
认知诊断缺失数据处理方法的比较:零替换、多重插补与极大似然估计法*
ILWT-EEMD数据处理的ELM滚动轴承故障诊断
编程,是一种态度
元征X-431实测:奔驰发动机编程
编程小能手
纺织机上诞生的编程
创世代码
创世代码
创世代码
创世代码