文獻(xiàn)標(biāo)識(shí)碼: A
文章編號(hào): 0258-7998(2014)03-0133-04
近年來,全球地震災(zāi)害多發(fā),,給人類造成巨大損失,。應(yīng)急避難場(chǎng)所是應(yīng)對(duì)突發(fā)公共事件的一項(xiàng)災(zāi)民安置措施,是現(xiàn)代化大城市用于民眾躲避地震,、火災(zāi),、爆炸、洪水,、疫情等重大突發(fā)公共事件的安全避難場(chǎng)所[1]。應(yīng)急避難場(chǎng)所具有應(yīng)急避難指揮中心,、獨(dú)立供電系統(tǒng),、應(yīng)急直升機(jī)停機(jī)坪、應(yīng)急消防措施,、應(yīng)急避難疏散區(qū),、應(yīng)急供水等11種應(yīng)急避險(xiǎn)功能,形成了一個(gè)集通信,、電力,、物流、人流,、信息流等為一體的完整網(wǎng)絡(luò),。
隨著移動(dòng)通信技術(shù)的快速發(fā)展和Android智能終端的迅速普及,人們對(duì)信息的獲取有了更高的要求[2],。開發(fā)一款基于Android系統(tǒng)的應(yīng)急避難場(chǎng)所的軟件顯得非常必要,。Android系統(tǒng)是谷歌公司推出的一套智能開源手機(jī)平臺(tái),由操作系統(tǒng),、中間件,、用戶友好界面和應(yīng)用軟件組成[3]。
應(yīng)急避難場(chǎng)所查詢涉及到每個(gè)避難場(chǎng)所的位置信息,,而百度LBS云服務(wù)可以解決這一問題,。LBS云是百度地圖針對(duì)LBS開發(fā)者推出的平臺(tái)級(jí)服務(wù),結(jié)合已有的地圖API和SDK服務(wù),,通過開放服務(wù)端存儲(chǔ)和計(jì)算能力,,提供海量位置數(shù)據(jù)存儲(chǔ)、檢索及展示一體化解決方案[4],。
本文針對(duì)Android系統(tǒng),使用百度地圖Android SDK,、定位API和LBS云服務(wù)開發(fā)了一款可以篩選、定位,、地圖顯示和周邊檢索的應(yīng)急避難場(chǎng)所查詢軟件,。
1 總體設(shè)計(jì)方案
1.1 Android開發(fā)介紹
Android是以Linux為核心的開放源碼操作系統(tǒng),,可以運(yùn)行在手機(jī)、平板電腦,、GPS,、播發(fā)器等各種手持終端上[5-6]。
Android主流的開發(fā)環(huán)境是Java,,開發(fā)平臺(tái)是Eclipse(一種基于Java的開源,、可擴(kuò)展平臺(tái))。Eclipse安裝安卓開發(fā)工具ADT(Android Development Tools)后即可直接使用Android的軟件開發(fā)工具包SDK(Software Development Kit),。同時(shí)SDK還提供可視化的模擬器,,以及Dalvik虛擬機(jī)調(diào)試監(jiān)控服務(wù)(DDMS)工具,用于實(shí)時(shí)查看軟件運(yùn)行情況及本件管理,、截屏等操作[7-8],。本文的軟件就在以上基礎(chǔ)上開發(fā)調(diào)試,并最終在手機(jī)終端上通過測(cè)試。
1.2 百度地圖Android SDK簡(jiǎn)介
百度地圖Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持Android 1.5以上系統(tǒng))及以上版本設(shè)備的應(yīng)用程序接口,,可適用于Android系統(tǒng)移動(dòng)設(shè)備的地圖應(yīng)用,。通過調(diào)用地圖SDK接口,可以輕松訪問百度地圖服務(wù)和數(shù)據(jù),,構(gòu)建功能豐富,、交互性強(qiáng)的地圖類應(yīng)用程序。
1.3 百度定位 SDK簡(jiǎn)介
LBS(Location Based Service)是互聯(lián)網(wǎng)時(shí)代的熱點(diǎn),,在本地搜索,、定向廣告、社交網(wǎng)絡(luò)等眾多領(lǐng)域得到了廣泛應(yīng)用,。其核心基礎(chǔ)就是定位能力,,為各類應(yīng)用提供位置信息。百度移動(dòng)定位API是一個(gè)提供基礎(chǔ)定位API的第三方平臺(tái),,為各類應(yīng)用提供定位能力,,提升用戶體驗(yàn)。目前百度定位SDK支持Android平臺(tái)的免費(fèi)使用,。
1.4 百度LBS云簡(jiǎn)介
LBS云是百度地圖針對(duì)LBS開發(fā)者推出的平臺(tái)級(jí)服務(wù),,結(jié)合已有的地圖API和SDK服務(wù),通過開放服務(wù)端存儲(chǔ)和計(jì)算能力,,提供海量位置數(shù)據(jù)存儲(chǔ),、檢索、展示一體化解決方案,。LBS云包括云存儲(chǔ)和云檢索兩個(gè)部分,。
LBS云有三個(gè)基本概念,分別是位置數(shù)據(jù)表(geotable)、自定義擴(kuò)展列(column)和位置數(shù)據(jù)(poi)。位置數(shù)據(jù)表是百度LBS云提供給開發(fā)者自定義存儲(chǔ)位置數(shù)據(jù)的集合,,類似于常見數(shù)據(jù)庫的一個(gè)表,,不僅支持點(diǎn)線面結(jié)構(gòu)還支持用戶自定義結(jié)構(gòu)。自定義擴(kuò)展列是開發(fā)者在創(chuàng)建的位置數(shù)據(jù)表基礎(chǔ)上根據(jù)自己的應(yīng)用場(chǎng)景自定義擴(kuò)展的列,,類似于常見數(shù)據(jù)表的一個(gè)列,。位置數(shù)據(jù)即為開發(fā)者在定義好屬性和擴(kuò)展列的位置數(shù)據(jù)表中帶有位置屬性的業(yè)務(wù)數(shù)據(jù)記錄,類似于常見數(shù)據(jù)表下的一條記錄。
1.5 避難場(chǎng)所查詢軟件設(shè)計(jì)方案
首先需要將所有的避難場(chǎng)所位置及相關(guān)信息存儲(chǔ)到百度LBS云中,,軟件查詢避難場(chǎng)所的過程其實(shí)就是對(duì)已存儲(chǔ)信息的云端進(jìn)行檢索的過程,。云檢索必須在有網(wǎng)絡(luò)的條件下進(jìn)行,所以當(dāng)沒有無線網(wǎng)絡(luò)時(shí)需要打開手機(jī)自身的移動(dòng)網(wǎng)絡(luò),。如圖1所示,,當(dāng)檢測(cè)到可用網(wǎng)絡(luò)后要?jiǎng)澐志W(wǎng)絡(luò)類型,因?yàn)椴煌W(wǎng)絡(luò)的接口設(shè)置不同,。通過百度定位API對(duì)終端用戶當(dāng)前所在位置進(jìn)行定位,。通過云檢索將云端的避難場(chǎng)所信息調(diào)出并計(jì)算避難場(chǎng)所與當(dāng)前位置的距離。軟件有兩種工作模式:一種是篩選模式,,另一種是附近模式,。在篩選模式下可以按照行政區(qū),、避難場(chǎng)所分類和關(guān)鍵字檢索對(duì)避難場(chǎng)所進(jìn)行查找;在附近模式可以按照距離查找當(dāng)前位置周邊的避難場(chǎng)所,。
2 軟件設(shè)計(jì)
系統(tǒng)分為2個(gè)數(shù)據(jù)包(package),一個(gè)是com.bd.lbs.yj用來完成軟件的主體功能;另一個(gè)是com,bd.lbs.api用來完成百度定位,、云檢索和百度地圖顯示等功能,。這2個(gè)數(shù)據(jù)包共包括了7個(gè)程序模塊,如圖2所示,。
2.1 ContentModel模塊設(shè)計(jì)
ContentModel類用來定義列表內(nèi)容,,包括避難場(chǎng)所的名稱、地址,、類型,、避難場(chǎng)所與當(dāng)前設(shè)備的距離、圖片外連接地址,、專題頁地址,、經(jīng)度和緯度。此外該類還定義了獲取這些信息的成員函數(shù),。
2.2 LBSListActivity模塊設(shè)計(jì)
LBSListActivity類繼承了ListActivity類并實(shí)現(xiàn)了對(duì)OnScrollListener的接口,。實(shí)現(xiàn)了列表顯示,同時(shí)還監(jiān)控焦點(diǎn)是否為列表最后一行,。本文的列表頁為單頁10條列表,,當(dāng)頁面翻滾到最后一行時(shí)點(diǎn)擊“讀取更多”按鈕,即可再打開10條列表。
要在列表底部添加“讀取更多”按鈕并顯示讀取的進(jìn)度就要在重寫父類Activity時(shí)添加“讀取更多(loadMoreView)”按鈕和進(jìn)度條(progressBar)的layout設(shè)置,。
本設(shè)計(jì)需要在列表中顯示每個(gè)避難場(chǎng)所的照片,,這些照片被保存在網(wǎng)絡(luò)相冊(cè)中,系統(tǒng)解析網(wǎng)絡(luò)照片地址并將照片轉(zhuǎn)換為Bit圖片顯示,。這個(gè)過程通過getBitmapFromUrl函數(shù)來完成,。該函數(shù)首先建立與網(wǎng)絡(luò)相冊(cè)的連接,接收來自相冊(cè)的數(shù)據(jù)流并將全部數(shù)據(jù)流保存在緩存中,,最后將緩存中的數(shù)據(jù)重新編碼成比特圖片,。
2.3 DApplication模塊設(shè)計(jì)
Android中的Application類是為了需要保存全局變量而設(shè)計(jì)的基本類,該類在package創(chuàng)建時(shí)就存在。程序中的DApplication類是從Application類繼承下來的,,用于保存本設(shè)計(jì)的全局變量,。
本設(shè)計(jì)中的百度地圖SDK使用ak驗(yàn)證和網(wǎng)絡(luò)類型的劃分也是在DApplication類中完成的。網(wǎng)絡(luò)類型主要分為中國(guó)移動(dòng)CMWAP,、中國(guó)聯(lián)通UNIWAP,、中國(guó)電信CTWAP和3G網(wǎng)絡(luò)3GWAP。
2.4 MainActivity模塊設(shè)計(jì)
MainActivity類主要完成可用網(wǎng)絡(luò)的檢測(cè),、篩選/附近模式的切換,地圖/列表模式的切換和篩選按鈕功能的實(shí)現(xiàn),。
篩選/附近模式的切換通過ToggleButton按鈕實(shí)現(xiàn),地圖/列表模式的切換通過getTabHost函數(shù)來完成,各種篩選條件通過設(shè)置Spinner控件來完成。
2.5 LBSLocation模塊設(shè)計(jì)
LBSLocation類主要完成終端的定位功能,。編寫這個(gè)類需要用到百度定位API,,所以在該文件前添加如下程序來導(dǎo)入百度程序包:
import com.baidu.location.BDLocation;
import com.baidu.location.BDLocationListener;
import com.baidu.location.LocationClient;
import com.baidu.location.LocationClientOption;
首先要在啟動(dòng)定位函數(shù)中配置定位信息,將定位經(jīng)緯度設(shè)置為百度經(jīng)緯度。然后編寫定位監(jiān)聽函數(shù)并實(shí)現(xiàn)對(duì)百度定位監(jiān)聽函數(shù)的接口,。在定位監(jiān)聽函數(shù)中實(shí)現(xiàn)定位并計(jì)算當(dāng)前位置與每個(gè)避難場(chǎng)所的距離,。
2.6 LBSCloudSearch模塊設(shè)計(jì)
LBSCloudSearch類通過http post方式訪問百度云,利用百度云檢索API查找百度云存儲(chǔ)數(shù)據(jù),,返回JSON數(shù)據(jù)供移動(dòng)應(yīng)用顯示,。
云檢索前需要做好兩項(xiàng)準(zhǔn)備工作:(1)根據(jù)劃分的網(wǎng)絡(luò)類型進(jìn)行網(wǎng)絡(luò)接口配置; (2)設(shè)置百度云的databox及對(duì)應(yīng)ak的校驗(yàn),。
2.7 LBSMapActivity模塊設(shè)計(jì)
LBSMapActivity類主要用于實(shí)現(xiàn)百度地圖的顯示功能,。編寫這個(gè)類需要用到百度定位API,所以在該文件前添加以下程序來導(dǎo)入百度程序包:
import com.baidu.mapapi.BMapManager;
import com.baidu.mapapi.MKGeneralListener;
import com.baidu.mapapi.map.ItemizedOverlay;
import com.baidu.mapapi.map.LocationData;
import com.baidu.mapapi.map.MKEvent;
import com.baidu.mapapi.map.MapController;
import com.baidu.mapapi.map.MapView;
import com.baidu.mapapi.map.MyLocationOverlay;
import com.baidu.mapapi.map.OverlayItem;
import com.baidu.mapapi.map.PopupClickListener;
import com.baidu.mapapi.map.PopupOverlay;
程序中使用initMapView()函數(shù)來完成初始化地圖,包括設(shè)置地圖中心坐標(biāo),、地圖縮放參數(shù)和地圖控制控件等,。使用addAllMarker()和removeAllMarker()兩個(gè)函數(shù),實(shí)現(xiàn)在地圖中添加避難場(chǎng)所位置麻點(diǎn)和刪除這些麻點(diǎn)。
在LBSMapActivity類中定義了MyGeneralListener和OverlayIcon兩個(gè)類,分別用于監(jiān)控網(wǎng)絡(luò)和定義麻點(diǎn)樣式,。
3 軟件測(cè)試
3.1 云存儲(chǔ)
百度云存儲(chǔ)接口支持單個(gè)geotable億級(jí)數(shù)據(jù)及數(shù)百GB大小的存儲(chǔ),,每天支持百萬量級(jí)讀寫,每秒支持萬量級(jí)讀寫,,完全滿足本設(shè)計(jì)的需求,。在進(jìn)行軟件測(cè)試前,通過批量上傳的方式將應(yīng)急避難場(chǎng)所的信息存到百度云端。除了百度云自帶的字段外還需要自定義擴(kuò)展字段image、type和shelterurl,。其中image為string類型,,用來存儲(chǔ)展示在終端的避難場(chǎng)所圖片地址;type為double類型,,用來區(qū)分避難場(chǎng)所類型,;shelterurl為string類型,用來存儲(chǔ)避難場(chǎng)所專輯頁面地址,。
3.2 手機(jī)測(cè)試
軟件通過Android SDK模擬器仿真后進(jìn)入到手機(jī)實(shí)物測(cè)試,,本次測(cè)試所用的手機(jī)為華為G520。手機(jī)測(cè)試步驟為:
(1)檢測(cè)在無網(wǎng)絡(luò)情況下程序是否退出,;
(2)在無線WiFi網(wǎng)絡(luò)下,,打開程序在列表模式下瀏覽避難場(chǎng)所列表,檢查列表中的避難場(chǎng)所能否與百度云端存儲(chǔ)的數(shù)據(jù)對(duì)應(yīng),;
(3)檢查列表中的內(nèi)容和圖片是否與設(shè)計(jì)一致,,列表中的定位以及距離計(jì)算是否準(zhǔn)確;
(4)按照行政區(qū)和避難場(chǎng)所分類逐一進(jìn)行篩選測(cè)試,,檢測(cè)篩選是否有誤,;
(5)切換到周邊模式進(jìn)行周邊檢索,檢查周邊檢索是否準(zhǔn)確,;
(6)將列表模式切換到地圖模式,,檢查地圖上麻點(diǎn)能否與列表對(duì)應(yīng);
(7)將WiFi網(wǎng)絡(luò)換成GSM網(wǎng)絡(luò),,重復(fù)步驟(2)~步驟(6)進(jìn)行檢測(cè),。
經(jīng)過上述測(cè)試,,應(yīng)急避難場(chǎng)所查詢軟件所有功能工作正常,,達(dá)到了預(yù)期目標(biāo)。圖3,、圖4為篩選模式和附近模式下列表/地圖的測(cè)試照片,。
本文設(shè)計(jì)了一個(gè)基于Android操作系統(tǒng)的應(yīng)急避難場(chǎng)所查詢方案,實(shí)現(xiàn)了對(duì)應(yīng)急避難場(chǎng)所的查詢,、篩選和地圖展示等功能,。本設(shè)計(jì)的創(chuàng)新點(diǎn)是使用了百度LBS云技術(shù),將避難場(chǎng)所的位置信息存儲(chǔ)到百度云端,,并通過云檢索獲取信息,。與傳統(tǒng)方式相比省去了架設(shè)服務(wù)器保存信息和維護(hù)信息的開銷。同時(shí)使用百度地圖API和定位API,,將定位所得到的百度經(jīng)緯度和避難場(chǎng)所的經(jīng)緯度顯示在百度地圖上,。手機(jī)測(cè)試結(jié)果表明,本設(shè)計(jì)完成了預(yù)期的全部功能。
參考文獻(xiàn)
[1] 趙士達(dá),張楠,楊爽. 地震時(shí)人口疏散模型研究[J]. 軟件導(dǎo)刊,2013(5):6-8.
[2] 馬志強(qiáng).基于Android平臺(tái)即時(shí)通信系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[D].北京:北京交通大學(xué), 2009.
[3] 李寧. Android應(yīng)用開發(fā)實(shí)戰(zhàn)[M].北京:機(jī)械工業(yè)出版社, 2012.
[4] 豆瑞星.百度成立LBS事業(yè)部[J].互聯(lián)網(wǎng)周刊, 2012,11(21):56-57.
[5] 鄭云卿,黃琦.基于Android平臺(tái)的軟件自動(dòng)化監(jiān)控工具的設(shè)計(jì)開發(fā)[J].計(jì)算機(jī)應(yīng)用與軟件,2013,30(2):235-238.
[6] 彭璇,,吳肖. Google Map API在網(wǎng)絡(luò)地圖服務(wù)中的應(yīng)用[J]. 測(cè)繪信息與工程,,2010,35(1):25-27.
[7] BURNETTE E. Hello, Android: introducing google’s mobile development platform[M]. American Pragmatic Bookshelf, 2009.
[8] 江燕良.基于Android智能終端的遠(yuǎn)程控制系統(tǒng)[J].電子技術(shù)應(yīng)用,2012,38(8):129-132.