北京信息科技大學(xué) 陳宇罡 汪永青 李 琳 焦瑞莉
中國(guó)科學(xué)院大氣物理研究所 王立志
J a v a、P y t h o n和Ma t l a b混合編程及其在氣象中的應(yīng)用
北京信息科技大學(xué) 陳宇罡 汪永青 李 琳 焦瑞莉
中國(guó)科學(xué)院大氣物理研究所 王立志
本文對(duì)于Java、Python和Matlab混合編程方法進(jìn)行一定的探討,并結(jié)合氣象數(shù)據(jù)的分析處理的實(shí)際工作,通過重用原有的Matlab、Python的代碼,在數(shù)據(jù)倉(cāng)庫(kù)軟件RAMADDA的基礎(chǔ)上,快速實(shí)現(xiàn)氣象數(shù)據(jù)的統(tǒng)計(jì)、分析、發(fā)布、可視化,并為未來氣象數(shù)據(jù)基于WEB的在線分析、可視化集成提供借鑒。
Python;Matlab;混合編程;代碼重用;數(shù)據(jù)分析集成
Python是一種面向?qū)ο?、解釋型、?dòng)態(tài)數(shù)據(jù)類型的優(yōu)秀高級(jí)通用程序設(shè)計(jì)語(yǔ)言,相比于其他語(yǔ)言,Python可以更便捷的實(shí)現(xiàn)原型開發(fā),并能夠和其他語(yǔ)言諸如C++、Java等很好的結(jié)合。Matlab是由mathworks公司開發(fā)的用于數(shù)值計(jì)算、科學(xué)仿真和數(shù)據(jù)可視化的高級(jí)計(jì)算語(yǔ)言和交互式環(huán)境,因其強(qiáng)大的計(jì)算和繪圖功能在氣象領(lǐng)域得到了廣泛的應(yīng)用。UCAR提供的開源內(nèi)容與存儲(chǔ)管理系統(tǒng)RAMADDA(Repository for Archiving, Managing and Accessing Diverse DAta)以Java為核心語(yǔ)言,通過IDV(Integrated Data Viewer)嵌入實(shí)現(xiàn)三維可視化,在地球科學(xué)領(lǐng)域得到廣泛應(yīng)用;其可以覆蓋氣象業(yè)務(wù)的大多數(shù)數(shù)據(jù)格式,以數(shù)據(jù)庫(kù)技術(shù)、文件服務(wù)、IDV、Google Map API等技術(shù)為基礎(chǔ)完成氣象數(shù)據(jù)的內(nèi)容管理。
因?yàn)镻ython和Matlab在氣象數(shù)據(jù)處理中的廣泛應(yīng)用,大量的基于Python和Matlab的代碼被開發(fā)并被廣泛使用。本文以基于Java語(yǔ)言的RAMADDA系統(tǒng),通過Java、Python和Matlab混合編程技術(shù),將已有的Python和Matlab數(shù)據(jù)處理分析代碼復(fù)用,并通過RAMADDA平臺(tái)實(shí)現(xiàn)數(shù)據(jù)的快速存儲(chǔ)、發(fā)布、分析處理及可視化。
通過在Matlab中運(yùn)行deploytool,將.m函數(shù)通過庫(kù)編譯器(Library Compiler)打包成Java包。同時(shí)將生成的jar包和Matlab安裝目錄下的javabuilder.jar一同添加到Java的庫(kù)路徑中,就可以實(shí)現(xiàn)Java對(duì)于Matlab函數(shù)的調(diào)用。
圖1 deploytool工具箱
選擇Java Package類型,并添加需要打包的.m的Matlab函數(shù)文件,按設(shè)計(jì)需求修改相應(yīng)的包名、生成的類名稱和類方法,最后執(zhí)行Package動(dòng)作打包完成,操作如圖2所示。
圖2 選擇類型和.m文件
通過Java和Python的混合調(diào)用有三種方法:
1)通過Java編寫的類中直接執(zhí)行Python語(yǔ)句即可,代碼如下:
PythonInterpreter interpreter = new PythonInterperter();
Interpreter.exec( “day =(‘Mon’, ‘Tue’, ‘Wed’, ‘Thu’, ‘Fri’,’Sat’, ‘Sun’ ); );
Interpreter.exec( “print( days[1] );” );
2)在Java中調(diào)用已經(jīng)編寫好的Python腳本文件,代碼如下:
Python文件如下(假設(shè)文件名為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編寫的類中直接執(zhí)行Python腳本文件
PythonInterpreter interpreter = new PythonInterpreter();
Interpreter.execf i le( “adder.py” );
本文中采用第二種方法,通過編寫Python實(shí)現(xiàn)了關(guān)于顯著性檢驗(yàn)的腳本文件。通過RAMADDA中的Java調(diào)用,實(shí)現(xiàn)將封裝的Matlab的函數(shù)實(shí)現(xiàn)的文件數(shù)據(jù)處理部分和Python實(shí)現(xiàn)的分析,統(tǒng)一集成到RAMADDA系統(tǒng)中,實(shí)現(xiàn)系統(tǒng)對(duì)于氣象數(shù)據(jù)的處理分析以及圖形可視化輸出的功能。
本文中使用數(shù)據(jù)為美國(guó)國(guó)家環(huán)境預(yù)測(cè)中心(NCEP)再分析資料計(jì)劃(1979-現(xiàn)在)的再分析資料集。下載了從1979-2016共38年的逐6小時(shí)全球格點(diǎn)氣溫資料。
針對(duì)此資料集,基于Matlab的處理函數(shù),完成數(shù)據(jù)資料處理,包括不同時(shí)空區(qū)間的數(shù)據(jù)提取、不同空間的逐天/逐旬/逐月平均等等。
Matlab的代碼如下:
[MonthTempData.MonthMean] = BulkReadFunc( fi les, lon, lat, level, month )
function [MonthAirData,MonthMean] = BulkReadFunc(datadir,lon,lat,level,month)
fi lelist=dir([datadir,’*.nc’]); %指定批量數(shù)據(jù)的類型
k=length(f i lelist); %多少個(gè)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文件,經(jīng)緯度,月份,時(shí)間,返回值為air溫度數(shù)組和月平均值end end
針對(duì)2.2提取的數(shù)據(jù),進(jìn)行數(shù)據(jù)處理,Python處理代碼如下(部分代碼示例):
圖3 python部分代碼示例
通過上述數(shù)據(jù)處理和分析得到的結(jié)果,以RAMADDA管理系統(tǒng)進(jìn)行數(shù)據(jù)發(fā)布、結(jié)果展示。本文作為示例僅僅給出了歷年2月份的1000百帕的溫度分析,區(qū)域?yàn)楸本┖腿A北。
圖4 北京及華北2月份1000百帕氣溫距平圖
從圖4可見,北京和華北2月距平溫度變化高度相關(guān),30年的前十年和后十年均為變暖的趨勢(shì),尤其是從2012年開始,由冷到暖的趨勢(shì)明顯。通過簡(jiǎn)單的分析曲線,為氣象工作者提供簡(jiǎn)便的數(shù)據(jù)處理和分析工具。
因?yàn)镸atlab在氣象領(lǐng)域的廣泛應(yīng)用,使用者手中存在了大量編寫完成的函數(shù);Python以其在字符串處理和繪圖功能上的優(yōu)勢(shì),使得越來越多的氣象科技工作者將其作為主要的數(shù)據(jù)處理分析工具;Java語(yǔ)言是目前WEB應(yīng)用開發(fā)的主流語(yǔ)言,可應(yīng)用于多種平臺(tái)。本文通過實(shí)際應(yīng)用,給出了簡(jiǎn)單快捷的Java、Python和Matlab的混合編程解決方案:以Java實(shí)現(xiàn)的RAMADDA內(nèi)容管理系統(tǒng)為基礎(chǔ),通過混合編程技術(shù),在充分重用原有的Matlab函數(shù)庫(kù)的基礎(chǔ)上通過Python實(shí)現(xiàn)數(shù)據(jù)的分析處理,利用RAMADDA框架實(shí)現(xiàn)結(jié)果的可視化。
[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]張慧,史奎橋,楊揚(yáng),等.應(yīng)用Matlab 自動(dòng)繪制氣象等值線圖[J].廣東氣象,2016,38(4):74-77.
[6]何險(xiǎn)峰,馬力,羅永康.分布式氣象內(nèi)容管理系統(tǒng)設(shè)計(jì)[J].氣象科技,2013,41(6):1036-1042.
[7]王寧,汪飛星.基于Python開發(fā)氣象服務(wù)器運(yùn)行系統(tǒng)界面[J].微機(jī)發(fā)展,2003,13(7):46-47.
北京信息科技大學(xué)2016年度‘實(shí)培計(jì)劃’項(xiàng)目資助。
王立志(1971-),男,碩士,高級(jí)工程師,主要研究方向數(shù)值模式開發(fā)、高性能計(jì)算。