摘要:基于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.