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