摘要:基于Android平臺, 利用GPS定位技術和百度地圖開源SDK, 設計了一款能夠預先設定軌跡以及進行軌跡記錄和保存的軟件.該軟件通過百度地圖API進行地圖顯示, 可根據需求通過經緯度坐標預先設定軌跡, 并實時記錄使用者的移動軌跡, 與預設軌跡進行對比, 當偏離預設軌跡一定范圍時會有語音以及文字提醒.軟件采用SQLite輕型數據庫存儲預設軌跡與記錄的軌跡內容.經過測試, 該軟件簡便易用, 能夠準確地記錄軌跡, 滿足航空測磁對于航跡規劃和航跡記錄的需求.
關鍵詞:Android; GPS; 百度地圖; 航跡指示儀; 數據庫存儲;
Abstract:Based on the Android platform, using GPS positioning technology and the open source SDK of Baidu Map, a software that can set track in advance and record the track is designed.The map is displayed through the Baidu Map API.It can set the track in advance by the latitude and longitude coordinates according to the demand, and record the user's moving track in real time.It can be compared with the presupposition track, and there will be voice and word reminding when the track is deviated from a certain range.SQLite lightweight database is used to store the preset track and record track content.Test results show that the software is simple and easy to use, and can accurately record the track.The software can meets the aviation magnetic measurement demand for track planning and track recording.
Keyword:Android; GPS; Baidu Map; track indicator; database storage;
目前國內GPS地圖類軟件有百度地圖、高德地圖、騰訊地圖、搜狗地圖等, 但這些地圖類軟件只提供了路線規劃[1]、導航等功能, 無法滿足應用需求.目前安卓智能手機在市場上占據了相當大的份額.Android系統以開源為優勢, 采用流行的JAVA語言來編寫應用程序, 這一點優于蘋果公司的IOS系統.因為在目前來看, IOS系統封閉, APP管理嚴格, 編寫的軟件很難通過APPSTORE的審核, 這就大大延長了開發周期.另外, 鑒于蘋果手機的價格與普及性, Android無疑是首選.本文在Android平臺的基礎上, 設計并實現了航跡指示儀, 能夠預先設定軌跡以及進行軌跡的記錄和保存, 為野外飛行勘探和監測工作提供服務.
1、Android操作系統介紹
Android系統的系統架構, 可以大致分為4個層次, 從低到高包括Linux內核層、系統運行庫層、應用程序框架層和應用程序層[2].
2、系統開發環境搭建
2.1、Android應用程序開發環境搭建
Android應用程序開發所采用的開發環境為Eclipse軟件, 對應用程序的測試可以采用Android SDK軟件開發工具包來解決, SDK內包括Android各個版本的API, 以及各個API的Reference, 可供開發時參考使用.另外, SDK可以運行各個API的虛擬機, 用來測試編寫的應用程序的功能.Android的上層應用程序是用JAVA語言開發的, 還需要安裝JAVA的運行庫, 即JDK.
2.2、百度地圖API的申請和使用
本文通過使用百度地圖安卓SDK提供的控件來顯示地圖, 在使用百度SDK之前, 需要針對所要開發的應用到百度API控制臺申請api key, 選擇所需要功能的SDK進行下載, 輸入開發的應用名稱, Eclipse的證書, 以及應用程序的包名, 便可以申請到一個api key.這個api key需要寫到Manifest中, 然后在官網下載相應的BaiduLBS_AndroidSDK_Lib庫, 并把其放到工程中的libs目錄下, 然后右鍵工程, 在配置構建路徑->庫->添加外部庫選項, 選擇baidumapapi_v3_3_0.jar和locSDK_5.0.jar, 將其添加到工程中.
圖1 系統總體功能框架圖
3、系統總體功能框架設計
整體設計由主屏幕 (MainActivity) , 預設軌跡屏幕 (SetLineActivity) , 軌跡保存列表查看 (MyTracksActivity) , 離線地圖列表 (OfflineActivity) 這幾部分組成.整個功能模塊總圖如圖1所示.
預設軌跡屏幕 (SetLineActivity) 提供預設軌跡的功能, 輸入并保存預設軌跡起始點和經過點的經緯度坐標點, 保存之后的預設軌跡可以在軌跡列表 (MyTracksActivity) 中查看.
軌跡列表 (MyTracksActivity) 負責從數據庫中讀取軌跡數據, 具有查看和刪除軌跡的功能, 每條軌跡已預設或者記錄軌跡的開始時間點.
主屏幕中實現了程序中最主要的功能, 負責地圖的顯示, GPS定位信息和軌跡的顯示.同時對記錄的軌跡和預設軌跡進行對比, 當偏離預設軌跡一定范圍時會有語音以及文字提醒.
離線地圖列表查看負責從SD卡讀取離線地圖列表并顯示給用戶.
4、程序設計及各界面具體實現
4.1、主屏幕 (MainActivity) 的功能實現
4.1.1、主屏幕布局
主屏幕顯示地圖使用了來自百度地圖SDK內的Mapview控件, 并對當前點的經緯度坐標、記錄時間計時、記錄的軌跡總距離進行顯示, 同時包含了地圖縮放的按鈕, 開始記錄軌跡按鈕, 保存軌跡按鈕, 重置按鈕, 地圖模式切換按鈕.同時在Actionbar中包括了主屏幕到其他幾個屏幕的跳轉按鈕.
4.1.2、GPS位置監聽器的實現
獲取GPS經緯度信息通過建立位置監聽器來實現, 主要分為三步: (1) 初始化LocationClient類, mLocClient=new LocationClient (this) . (2) 配置定位SDK參數, 包括定位模式、返回坐標類型、是否打開GPS、定位的時間間隔, 這個時間間隔大于1 000ms才有效[5]. (3) 實現BDLocationListener接口, BDLocationListener為結果監聽接口, 接口中包含了監聽GPS位置信息的方法, 使用location.getLatitude () 和location.getLongitude () 方法來分別獲得緯度和經度.當監聽到用戶位置發生變化后, 使用animateMapStatus () 方法更新地圖狀態, 使定位點始終保持在屏幕中央.
表1 軌跡信息數據
4.1.3、數據庫設計
采用Android系統本身自帶的SQLite數據庫, 進行軌跡信息的存儲[6].SQLite數據庫能夠存儲大量的數據, 同時能夠方便系統隨時添加、查看、刪除和更新數據[7].首先創建一個名字為“Record”的數據庫, 并且在數據庫中創建表1.然后構造ContentValues, 使用put () 方法以鍵值對的形式存放軌跡記錄的相關信息, 如開始時間、起始坐標等.調用insert () 方法將ContentValues中的數據插入info表, 保存該條軌跡上全部定位點的經緯度.
4.1.4、軌跡繪制
本文的軌跡繪制分為兩種, 一種是實時記錄運動軌跡的DrawMoving () 方法, 另一種為查看已保存軌跡的DrawTracks () 方法.
(1) 實時軌跡繪制.實現了位置監聽器之后, 可以從GPS獲取的經緯度位置數據, 在地圖上畫出實時運動的軌跡, 創建OverlayOptions對象option, 來添加折線覆蓋到地圖上[8].
(2) 保存軌跡繪制.在軌跡列表界面選中某條軌跡, 點擊“查看軌跡”按鈕, 系統會將界面跳轉回地圖界面, 同時傳回列表界面的數據, 這一過程是通過onActivityResult (int requestCode, int resultCode, Intent data) 函數實現的.用Bundle對象獲取Intent攜帶的數據傳回地圖界面, 根據sorl的值判斷查看的是保存軌跡還是預設軌跡.讀取軌跡數據, 將軌跡點保存到drawlist列表中, 調用DrawTracks () 函數, 根據drawlist列表的坐標繪制軌跡.
4.1.5、計算偏移距離以及語音提醒
這部分主要對使用者實時位置和預設軌跡的偏移距離進行計算.首先使用Spatial RelationUtil.get Nearest Point From Line () 方法來得到預設軌跡上與使用者實時位置最近的坐標點, 然后使用DistanceUtil.getDistance () 方法計算這一點和使用者實時位置點之間的距離, 即為使用者實時位置和預設軌跡之間的距離.當超過設定的偏移距離時, 便進行語音和文字提醒.
4.2、預設軌跡 (SetLineActivity) 的功能實現
預設軌跡使用了三個文本框 (TextView) 來顯示需要提示用戶輸入的內容, 兩個文本輸入框 (EditText) 分別獲取用戶輸入的經緯度坐標.三個按鈕 (Button) 分別用來保存單點坐標和整條預設軌跡坐標.預留了返回按鈕, 使用戶可以通過此按鈕返回到主屏幕 (MainActivity) .存儲軌跡經緯度數據依然采用SQLite數據庫存儲的方式, 獲取用戶輸入經緯度數據的關鍵代碼如下:
(1) 獲取文本輸入框 (EditText) 的內容:getText () .toString () ;
(2) 判斷文本輸入框 (EditText) 內容是否為空:if ( (lon.getText () .toString () .equals ("") ) ‖ (la.getText () .toString () .equals ("") ) ) .[9]通過判斷輸入框是否為空, 可以避免用戶輸入為空進行保存的時候發生程序崩潰問題.
創建一個名為“Setrecord”的數據庫和以創建時間為表名的數據表, 構造ContentValues, 使用put () 方法以鍵值對的形式存放預設軌跡點的坐標, 調用insert () 方法將ContentValues中的數據插入info表.
4.3、軌跡列表 (MyTracksActivity) 的功能實現
軌跡列表屏幕 (MyTracksActivity) 是一個tabhost布局, 用tabhost.addTab () 方法對界面布局進行設置, 提供了預設軌跡和本地軌跡列表顯示, 同時提供了返回主屏幕 (MainActivity) 按鈕.
軌跡列表的管理是通過initGroupRadio () 函數實現的, 在此函數中用cursor存儲從SQLite數據庫中查詢的軌跡信息, 創建RadioButton對象, 調用setId () 和setText () 方法設置列表樣式, 每條軌跡顯示記錄時間、起始坐標、記錄點數、距離等信息, 最后用addView () 函數添加到View中.若點擊“查看軌跡”按鈕, 則采用Intent和Bundle的方法將選中的軌跡表名回傳到主屏幕 (MainActivity) 進行軌跡的顯示.若點擊“刪除記錄”按鈕, 則執行db.execSQL (′′delete from info where StartTime=′′′+starttime+′′′′′) 和db.execSQL (′′DROP TA-BLE m′′+starttime) [10]語句, 完成數據的刪除, 然后使用initGroupRadio () 方法刷新軌跡列表.
圖2 預設軌跡與記錄軌跡對比
圖3 軌跡偏移時文字提醒示意
5、實驗效果
實驗測試地點選擇在長春市文化廣場的一條直線道路上, 該地點附近沒有明顯的高樓遮擋物, 有利于GPS定位數據的獲取.圖2為預設軌跡和記錄軌跡的對比圖, 其中有箭頭標志指示方向的為實際記錄的軌跡, 當實際軌跡偏移預設軌跡超過10m時, 系統會進行語音及文字提醒, 如圖3所示.
6、結論
基于Android開放平臺, 結合GPS定位技術和百度地圖開源SDK設計實現了一款航跡指示儀軟件.經過測試, 該軟件可以達到預定的目標, 并且界面友好, 使用穩定, 實現了通過預設軌跡尋找到實際地理位置的目的, 為野外勘探和飛行勘測提供了有效的解決方案.
參考文獻
[1]劉儒香, 魚明, 于雷.一種用于移動數據庫查詢結果排序的改進方法[J].湘潭大學自然科學學報, 2017, 39 (3) :80-84.
[2]王青松, 李爽, 馬瑞萍, 等.基于模糊聚類分析的數據庫模糊查詢的研究[J].小型微型計算機系統, 2015, 36 (6) :1199-1202.
[3]王威威, 陳永鋒.基于云模型的BIM項目質量協同管理績效評價[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].計算機系統應用, 2016, 25 (4) :112-117.
[7]張怡, 李辰, 王喜斌, 等.基于安卓平臺的智能定位追蹤系統研究[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]彭鳳凌, 庹先國, 王洪輝, 等.安卓手機與數據庫交互系統的設計與實現[J].計算機工程與設計, 2013, 34 (11) :3907-3911.
[10]熊思純, 楊超, 馬建峰, 等.一種隨機剔除點的安卓圖形解鎖方案[J].軟件學報, 2017, 28 (2) :361-371.