
摘 要: 為了適應新時期氣象服務的現代化建設需要和提高氣象服務的綜合能力,氣象部門結合實際需求和自身優勢,開發了一款基于Android系統的手機縣級氣象服務系統。主要從技術手段、功能設計、總體結構和主要功能模塊的實現等方面作簡要介紹。該系統具有災害預警、重要天氣、以及短中長期天氣預報、監測站點最新實況的查看、數據統計、數據檢索等功能。使用該系統,氣象部門能夠及時、方便、快捷地提供氣象服務,相關單位也能及時、自主、便捷地獲取氣象產品和數據資料。
關鍵詞: Android; 手機; 氣象服務系統; 功能設計
中圖分類號: TN911?34 文獻標識碼: A 文章編號: 1004?373X(2015)07?0043?03
0 引 言
隨著經濟社會的不斷發展,自然災害對經濟發展和社會生活造成的損失在不斷增大,預防和減輕自然災害已成為擺在全社會面前的共同任務。手機氣象服務以其及時、便捷、靈活的特點為用戶獲取各種氣象信息提供了方便,在防災減災、氣象預警、重大氣象保障服務等方面發揮著不可或缺的作用[1]。同時,Android是一種基于Linux的自由及開放源代碼的操作系統,在智能手機操作系統市場擁有巨大的占有率[2]。因此開發一款面向氣象部門和相關單位的基于Android系統的手機縣級氣象服務系統,能夠有效提高氣象服務的社會效益和經濟效益。
1 系統設計
1.1 主要技術
開發Android軟件,首先要搭建Android開發環境,具體搭建流程為依次安裝JDK、Eclipse、Android SDK和ADT[3]。其中Eclipse是一個開放源代碼、基于Java的可擴展開發平臺,軟件開發工作在其基礎上進行。同時還使用到一些第三方開發包,如實現圖表功能的AChartEngine?1.1.0.jar、地圖服務和定位服務的BaiduMapApi_v3_0_0.jar、多頁面滑動切換的Android?Support?v4.jar。
1.2 功能設計
目前市面上天氣客戶端種類繁多,但是它們的天氣信息僅有最近幾天天氣預報和少量實況數據,且更新較遲緩。針對這一現狀,氣象部門自己開發了一款氣象產品豐富、實況數據全面的手機客戶端,這一研發成果具有重要意義。系統所有功能模塊如圖1所示,氣象產品有災害預警、重要天氣消息推送、近6天圖形化天氣預報,短中期天氣預報、旬天氣預報、氣候趨勢預報;實況數據包括最新實況顯示(以數據列表和地圖標注兩種方式顯示)、前24小時氣溫和降雨序列、任意時段數據統計、任意時段和任意站點的逐時數據檢索。
圖1 功能模塊圖
1.3 總體結構
在軟件開發設計中,應用最多的就是分層技術。軟件分層采用分而治之的思想,將問題分解之后各個擊破,實現“高內聚、低耦合” [4]。因此系統在結構圖2 總體結構圖
1.3.1 應用層
應用層是呈現給用戶的功能界面,即手機客戶端。因為氣象數據的保密性,對社會公眾僅提供預警預報服務,特殊用戶需要授權后才能夠查看實況數據。
1.3.2 Web層
因Android系統不能直接對遠程數據庫進行操作,所以需要一個中間件來存取數據[5]。應用層通過URL方式提交數據請求到Web層,Web層收到請求后從數據庫中提取所需數據后生成并返回便于手機客戶端解析的XML格式頁面,這里使用Asp.net技術完成該功能。
1.3.3 數據層
數據層由分別存儲氣象產品、氣象數據和軟件管理3個數據庫組成。為了保障數據庫的安全性,數據庫的服務器使用獨立服務器,并設在氣象內網中,Web層用內網IP訪問數據庫。
1.3.4 管理層
管理層負責管理數據層的數據庫。其中后臺管理軟件可進行新版本發布、重要天氣消息推送、授權管理、手機客戶端安裝信息查看等操作。
2 主要功能的實現
2.1 數據獲取和顯示
在Android應用程序中,如果UI線程處理占用時間過長(如網絡獲取數據、大量數據計算),就會出現ANR(應用程序無響應)異常[6]。因此,為了保證良好的用戶體驗,數據獲取需要在多線程中進行。另外,由于Andorid規定只有UI線程才能更新用戶界面[7],為此需要使用Thread+Handler來解決上述問題。在Thread中用HttpURLConnection類發送數據請求,線程請求到XML數據頁面后,使用XMLPullParser類解析數據,再將數據封裝到Message類中,最后用Handler.sendMessage(message)方法發送給Handler的回調方法handleMessage進行界面更新[8]。
2.2 權限管理
權限管理是通過“手機號+標識碼”結合實現的。先要在后臺管理軟件新增授權用戶后(手機號為必填項),用戶才能在手機客戶端的授權管理頁面用手機號進行授權。授權的具體流程為先查詢數據庫中是否存在該手機號,若不存在則授權失敗;如果存在,再查詢是否存在對應標識碼,有標識碼表示該手機號已經授權過,不能重復授權,沒有對應標識碼則授權成功并生成惟一的標識碼,生成的標識碼同時保存在數據庫和手機客戶端中,如圖3所示。
圖3 授權流程圖
另外若用戶需要用已授權過的手機號重新授權,則要在后臺管理軟件中清除該手機號的標識碼就可以再次用于授權。為了保證之前的授權因此而失效,在每次運行手機客戶端時都要用手機客戶端存儲的標識碼和數據庫中的標識碼進行比對,如果相同才視為有效的授權。
2.3 天氣趨勢圖
天氣預報趨勢圖為現今手機天氣軟件必不可少的功能界面,具有直觀、漂亮的特點,如圖4的第2頁面所示。為提高代碼的可復用性和可讀性,將其封裝成一個自定義控件WeatherTrendView,通過WeatherTrendView的setBitmap(List
protected void onDraw(Canvas canvas) {
<!--此處有省略代碼-->
temarg = temmin + (temmax - temmin)/2;
//temmax為最高氣溫最大值,temmin為最低氣溫最小值
FontMetrics fontMetrics = mTextPaint.getFontMetrics();
float fontHeight = fontMetrics.bottom - fontMetrics.top;
//獲取趨勢圖中標注氣溫的字體高度
int h1 = this.getHeight()/2; //控件中間位置的高度
int h2 = (int) (h1 - fontHeight/2);
float scale = c.getResources().getDisplayMetrics().density;
int icoHeight = (int)(40 * scale + 0.5f);
//將圖標高度從dp轉化為px
int h3 = (int) (h1 - fontHeight - icoHeight);
int extraHeight = (int)(150 * scale + 0.5f);
//控件上下所需的占位高度
temspace=(this.getHeight() - extraHeight)/((temmax-temmin)); //計算趨勢圖中每度所占高度
for(int i = 0; i < topTem.size(); i++) {
//繪制最高氣溫趨勢
space = (temarg -topTem.get(i)) * temspace;
//獲取上一個最高氣溫相對控件中間位置的偏移高度
if(topTem.get(i)!=32 766){ //氣溫值為32 766時表示空值
if (i != topTem.size() - 1) {
space1=(temarg - topTem.get(i+1))*temspace;
//獲取下一個最高氣溫相對控件中間位置的偏移高度
canvas.drawLine(x[i],h1+space,x[i+1],h1+space1, mLinePaint1);
//用直線連接相鄰最高氣溫,x數組為水平等分的寬度值
}
canvas.drawText(topTem.get(i)+\"°\",x[i],h2+space, mTextPaint); //標注最高氣溫數值
canvas.drawCircle(x[i],h1+space,radius,mPointPaint);
//繪制圓點
canvas.drawBitmap(topBmps[i], x[i]-topBmps[i].getWidth()/2, h3 + space, 1); //繪制天氣現象圖標
}
}
<!--此處省略繪制最低氣溫趨勢代碼-->
}
圖4 手機客戶端重要功能界面
2.4 地圖和定位
地圖和定位服務均基于百度地圖Android SDK實現,百度地圖Android SDK是一套基于Android 2.1及以上版本設備的免費的應用程序接口。通過調用地圖SDK接口,可以輕松訪問百度地圖服務和數據,構建功能豐富、交互性強的地圖類應用程序,效果如圖4的第5頁面所示。地圖上疊加監測站點是使用標注覆蓋物MarkerOptions和文字覆蓋物TextOptions實現的,在初始化每個MarkerOptions時把監測數據初始化在title屬性值中,在其點擊事件中就可以通過marker.getTitle()獲取并予以顯示。定位功能用于地圖服務時顯示當前位置和獲取用戶安裝手機客戶端時的地理位置,百度地圖Android SDK可利用設備當前的GPS信息(GPS定位),基站信息(基站定位)和WiFi信息(WiFi定位)完成定位,使定位更為精準、快速,且提供將當前所處地點的位置坐標轉換為詳細地址描述的信息[9]。
2.5 氣溫和降雨序列圖
AChartEngine是為Android應用而設計的開源/免費的繪圖工具庫,可用于繪制折線圖、區域圖、散點圖、時間圖、柱狀圖、餅狀圖、環形圖等多種圖表[10]。系統用其繪制前24小時氣溫折線圖和前24小時降雨量柱狀圖。因手機屏幕寬度不夠完全顯示24小時序列圖,AChartEngine支持左右滑動查看剩余部分。效果如圖4的第4頁面所示。
3 結 語
Android系統已基本實現天氣預警、預報和實況數據的整合,為氣象服務業務提供強有力的支撐,提高了氣象服務能力。但隨著社會發展對氣象服務要求的不斷提高,系統功能仍需繼續努力改進和完善,不斷提升綜合氣象服務能力,以適應社會與經濟的發展對氣象服務的需求。
參考文獻
[1] 張延龍,楊昆,李炳文,等.基于3G手機的氣象服務分析[J].現代電子技術,2011,34(18):24?25.
[2] 劉峰,袁少雄,黃光慶,等.地質災害Android終端應用系統及其數據庫研究進展[J].地理空間信息,2013(6):51?53.
[3] 沈愛濤,程濤.基于Android平臺的應用系統開發環境研究[J].計算機光盤軟件與應用,2013(7):247?248.
[4] 袁鷹.基于分層技術的計算機軟件開發分析[J].計算機光盤軟件與應用,2014(1):314?315.
[5] 李洋,殷云鵬,趙勇.基于Android的網絡數據存儲與訪問[J].中國科技信息,2013(8):92?93.
[6] 肖柏昀.Android應用程序中多線程應用的方法研究[J].計算機光盤軟件與應用,2014(7):71?72.
[7] 解志君.Android多線程與消息循環[J].電子世界,2013(19):87?88.
[8] 李剛.瘋狂Android講義[M].北京:電子工業出版社,2013.
[9] 百度公司.Android SDK v3.0.0幫助文檔[EB/OL].(2014?06?05)[2014?09?15]. http://developer.baidu.com/map/index.php?title=androidsdk.
[10] 4ViewSoft公司.AChartEngine 1.1.0在線文檔[EB/OL].(2013?05?15)[2014?09?20]. http://www.achartengine.org/content/demo.html.