郝 帥, 程德福
(吉林大學 儀器科學與電氣工程學院,吉林 長春130012)
目前國內(nèi)GPS地圖類軟件有百度地圖、高德地圖、騰訊地圖、搜狗地圖等,但這些地圖類軟件只提供了路線規(guī)劃[1]、導航等功能,無法滿足應用需求.目前安卓智能手機在市場上占據(jù)了相當大的份額.Android系統(tǒng)以開源為優(yōu)勢,采用流行的JAVA語言來編寫應用程序,這一點優(yōu)于蘋果公司的IOS系統(tǒng).因為在目前來看,IOS系統(tǒng)封閉,APP管理嚴格,編寫的軟件很難通過APPSTORE的審核,這就大大延長了開發(fā)周期.另外,鑒于蘋果手機的價格與普及性,Android無疑是首選.本文在Android平臺的基礎上,設計并實現(xiàn)了航跡指示儀,能夠預先設定軌跡以及進行軌跡的記錄和保存,為野外飛行勘探和監(jiān)測工作提供服務.
Android系統(tǒng)的系統(tǒng)架構(gòu),可以大致分為4個層次,從低到高包括Linux內(nèi)核層、系統(tǒng)運行庫層、應用程序框架層和應用程序?qū)覽2].
Android應用程序開發(fā)所采用的開發(fā)環(huán)境為Eclipse軟件,對應用程序的測試可以采用Android SDK軟件開發(fā)工具包來解決,SDK內(nèi)包括Android 各個版本的API,以及各個API的Reference,可供開發(fā)時參考使用.另外,SDK可以運行各個API的虛擬機,用來測試編寫的應用程序的功能.Android的上層應用程序是用JAVA語言開發(fā)的,還需要安裝JAVA的運行庫,即JDK.
本文通過使用百度地圖安卓SDK提供的控件來顯示地圖,在使用百度SDK之前,需要針對所要開發(fā)的應用到百度API控制臺申請api key ,選擇所需要功能的SDK進行下載,輸入開發(fā)的應用名稱,Eclipse的證書,以及應用程序的包名,便可以申請到一個api key.這個api key需要寫到Manifest中,然后在官網(wǎng)下載相應的BaiduLBS_AndroidSDK_Lib庫,并把其放到工程中的libs目錄下,然后右鍵工程,在配置構(gòu)建路徑->庫->添加外部庫選項,選擇baidumapapi_v3_3_0.jar和 locSDK_5.0.jar,將其添加到工程中.
整體設計由主屏幕(MainActivity),預設軌跡屏幕(SetLineActivity),軌跡保存列表查看(MyTracksActivity),離線地圖列表(OfflineActivity)這幾部分組成.整個功能模塊總圖如圖1所示.
預設軌跡屏幕(SetLineActivity)提供預設軌跡的功能,輸入并保存預設軌跡起始點和經(jīng)過點的經(jīng)緯度坐標點,保存之后的預設軌跡可以在軌跡列表(MyTracksActivity)中查看.
軌跡列表(MyTracksActivity)負責從數(shù)據(jù)庫中讀取軌跡數(shù)據(jù),具有查看和刪除軌跡的功能,每條軌跡已預設或者記錄軌跡的開始時間點.
主屏幕中實現(xiàn)了程序中最主要的功能,負責地圖的顯示,GPS定位信息和軌跡的顯示.同時對記錄的軌跡和預設軌跡進行對比,當偏離預設軌跡一定范圍時會有語音以及文字提醒.
離線地圖列表查看負責從SD卡讀取離線地圖列表并顯示給用戶.
4.1.1主屏幕布局主屏幕顯示地圖使用了來自百度地圖SDK內(nèi)的Mapview控件,并對當前點的經(jīng)緯度坐標、記錄時間計時、記錄的軌跡總距離進行顯示,同時包含了地圖縮放的按鈕,開始記錄軌跡按鈕,保存軌跡按鈕,重置按鈕,地圖模式切換按鈕.同時在Actionbar中包括了主屏幕到其他幾個屏幕的跳轉(zhuǎn)按鈕.
4.1.2GPS位置監(jiān)聽器的實現(xiàn)獲取GPS經(jīng)緯度信息通過建立位置監(jiān)聽器來實現(xiàn),主要分為三步:(1) 初始化LocationClient類,mLocClient =new LocationClient(this).(2) 配置定位SDK參數(shù),包括定位模式、返回坐標類型、是否打開GPS、定位的時間間隔,這個時間間隔大于1 000 ms才有效[5].(3) 實現(xiàn)BDLocationListener接口,BDLocationListener為結(jié)果監(jiān)聽接口,接口中包含了監(jiān)聽GPS位置信息的方法,使用location.getLatitude()和location.getLongitude()方法來分別獲得緯度和經(jīng)度.當監(jiān)聽到用戶位置發(fā)生變化后,使用animateMapStatus()方法更新地圖狀態(tài),使定位點始終保持在屏幕中央.
表1 軌跡信息數(shù)據(jù)
4.1.3數(shù)據(jù)庫設計采用Android系統(tǒng)本身自帶的SQLite數(shù)據(jù)庫,進行軌跡信息的存儲[6].SQLite數(shù)據(jù)庫能夠存儲大量的數(shù)據(jù),同時能夠方便系統(tǒng)隨時添加、查看、刪除和更新數(shù)據(jù)[7].首先創(chuàng)建一個名字為“Record”的數(shù)據(jù)庫,并且在數(shù)據(jù)庫中創(chuàng)建表1.然后構(gòu)造ContentValues,使用put()方法以鍵值對的形式存放軌跡記錄的相關信息,如開始時間、起始坐標等.調(diào)用insert()方法將ContentValues中的數(shù)據(jù)插入info表,保存該條軌跡上全部定位點的經(jīng)緯度.
4.1.4軌跡繪制本文的軌跡繪制分為兩種,一種是實時記錄運動軌跡的DrawMoving()方法,另一種為查看已保存軌跡的DrawTracks()方法.
(1) 實時軌跡繪制. 實現(xiàn)了位置監(jiān)聽器之后,可以從GPS獲取的經(jīng)緯度位置數(shù)據(jù),在地圖上畫出實時運動的軌跡,創(chuàng)建OverlayOptions對象option,來添加折線覆蓋到地圖上[8].
(2) 保存軌跡繪制. 在軌跡列表界面選中某條軌跡,點擊“查看軌跡”按鈕,系統(tǒng)會將界面跳轉(zhuǎn)回地圖界面,同時傳回列表界面的數(shù)據(jù),這一過程是通過onActivityResult(int requestCode, int resultCode, Intent data)函數(shù)實現(xiàn)的.用Bundle對象獲取Intent攜帶的數(shù)據(jù)傳回地圖界面,根據(jù)sorl的值判斷查看的是保存軌跡還是預設軌跡.讀取軌跡數(shù)據(jù),將軌跡點保存到drawlist列表中,調(diào)用DrawTracks()函數(shù),根據(jù)drawlist列表的坐標繪制軌跡.
4.1.5計算偏移距離以及語音提醒這部分主要對使用者實時位置和預設軌跡的偏移距離進行計算.首先使用Spatial RelationUtil.get Nearest Point From Line()方法來得到預設軌跡上與使用者實時位置最近的坐標點,然后使用DistanceUtil.getDistance()方法計算這一點和使用者實時位置點之間的距離,即為使用者實時位置和預設軌跡之間的距離.當超過設定的偏移距離時,便進行語音和文字提醒.
預設軌跡使用了三個文本框(TextView)來顯示需要提示用戶輸入的內(nèi)容,兩個文本輸入框(EditText)分別獲取用戶輸入的經(jīng)緯度坐標.三個按鈕(Button)分別用來保存單點坐標和整條預設軌跡坐標.預留了返回按鈕,使用戶可以通過此按鈕返回到主屏幕(MainActivity).存儲軌跡經(jīng)緯度數(shù)據(jù)依然采用SQLite數(shù)據(jù)庫存儲的方式,獲取用戶輸入經(jīng)緯度數(shù)據(jù)的關鍵代碼如下:
(1) 獲取文本輸入框(EditText)的內(nèi)容:getText().toString();
(2) 判斷文本輸入框(EditText)內(nèi)容是否為空: if((lon.getText().toString().equals(""))‖ (la.getText().toString().equals("")) ).[9]通過判斷輸入框是否為空,可以避免用戶輸入為空進行保存的時候發(fā)生程序崩潰問題.
創(chuàng)建一個名為“Setrecord”的數(shù)據(jù)庫和以創(chuàng)建時間為表名的數(shù)據(jù)表,構(gòu)造ContentValues,使用put()方法以鍵值對的形式存放預設軌跡點的坐標,調(diào)用insert()方法將ContentValues中的數(shù)據(jù)插入info表.
軌跡列表屏幕(MyTracksActivity)是一個tabhost布局,用tabhost.addTab()方法對界面布局進行設置,提供了預設軌跡和本地軌跡列表顯示,同時提供了返回主屏幕(MainActivity)按鈕.
軌跡列表的管理是通過initGroupRadio()函數(shù)實現(xiàn)的,在此函數(shù)中用cursor存儲從SQLite數(shù)據(jù)庫中查詢的軌跡信息,創(chuàng)建RadioButton對象,調(diào)用setId()和setText()方法設置列表樣式,每條軌跡顯示記錄時間、起始坐標、記錄點數(shù)、距離等信息,最后用addView()函數(shù)添加到View中.若點擊“查看軌跡”按鈕,則采用Intent和Bundle的方法將選中的軌跡表名回傳到主屏幕(MainActivity)進行軌跡的顯示.若點擊“刪除記錄”按鈕,則執(zhí)行db.execSQL(′′delete from info where StartTime =′′′+ starttime +′′′′′)和db.execSQL(′′DROP TABLE m′′+ starttime)[10]語句,完成數(shù)據(jù)的刪除,然后使用initGroupRadio()方法刷新軌跡列表.
實驗測試地點選擇在長春市文化廣場的一條直線道路上,該地點附近沒有明顯的高樓遮擋物,有利于GPS定位數(shù)據(jù)的獲取.圖2為預設軌跡和記錄軌跡的對比圖,其中有箭頭標志指示方向的為實際記錄的軌跡,當實際軌跡偏移預設軌跡超過10 m時,系統(tǒng)會進行語音及文字提醒,如圖3所示.
基于Android 開放平臺,結(jié)合GPS定位技術和百度地圖開源SDK設計實現(xiàn)了一款航跡指示儀軟件.經(jīng)過測試,該軟件可以達到預定的目標,并且界面友好,使用穩(wěn)定,實現(xiàn)了通過預設軌跡尋找到實際地理位置的目的,為野外勘探和飛行勘測提供了有效的解決方案.
參考文獻
[1] 劉儒香, 魚明, 于雷. 一種用于移動數(shù)據(jù)庫查詢結(jié)果排序的改進方法[J]. 湘潭大學自然科學學報, 2017,39(3): 80-84.
[2] 王青松, 李爽, 馬瑞萍,等. 基于模糊聚類分析的數(shù)據(jù)庫模糊查詢的研究[J]. 小型微型計算機系統(tǒng), 2015, 36(6): 1199-1202.
[3] 王威威, 陳永鋒. 基于云模型的BIM項目質(zhì)量協(xié)同管理績效評價[J]. 湘潭大學自然科學學報, 2018, 40(1): 86-90.
[4] GISBRECHT A, HARMMER B. Relevance learning in generative topographic mapping[J]. Neurocomputing, 2011, 74(9): 1351-1358.
[5] VALLIANATOS F. A note on the topographic distortion of magnetotelluric impedance[J]. Annals of Geophysics, 2002, 45(2): 313-320.
[6] 王振鐸, 王振輝, 王紅剛,等. 基于MongoDB的移動信息分享平臺[J]. 計算機系統(tǒng)應用, 2016, 25(4): 112-117.
[7] 張怡, 李辰, 王喜斌,等. 基于安卓平臺的智能定位追蹤系統(tǒng)研究[J]. 電視技術, 2016, 40(4): 48-51.
[8] UWE DRESCHER. D-Eph-ective endocytosis disrupts topographic mapping[J]. The EMBO Journal, 2011, 30(8):1422-1424.
[9] 彭鳳凌, 庹先國, 王洪輝,等. 安卓手機與數(shù)據(jù)庫交互系統(tǒng)的設計與實現(xiàn)[J]. 計算機工程與設計, 2013, 34(11): 3907-3911.
[10] 熊思純, 楊超, 馬建峰,等. 一種隨機剔除點的安卓圖形解鎖方案[J]. 軟件學報, 2017, 28(2): 361-371.