《武汉工程大学学报》  2016年05期 490-494   出版日期:2016-11-02   ISSN:1674-2869   CN:42-1779/TQ
基于Android的百度地图多功能实现


1 引 言百度地图是一项网络地图搜索服务[1],地图覆盖区域广、查询功能多样,Android是基于Linux的操作系统,多用于移动设备. 随着移动通信网络技术、互联网技术、GPS技术[2]和GIS技术的发展,二者的结合使得一种新形式的电子地图应用服务得以出现[3]. 因此,为满足用户基本需求,需要申请百度地图密钥[4]和使用百度提供的开源核心类接口[5],在手机端设计并实现浏览地图[6]、搜寻地点、路线规划、自我定位[7]等多功能. 2 理论算法2.1 墨卡托投影百度地图使用的投影方法是墨卡托投影. 墨卡托投影是由荷兰地图学家墨卡托(G.Mercator) 于1569年创拟. 假设地球被套在一个圆柱中,赤道与圆柱相切,然后在地球中心放一盏灯,把球面上的图形投影到圆柱体上,再把圆柱体展开,就形成了一幅墨卡托投影的世界地图,广泛应用于航空、航海中. 假设墨卡托投影的坐标系原点为 (0,[λ0]),表示X轴为赤道,Y轴则在经度为[λ0]处垂直于赤道,X轴的刻度是等距的,Y轴方向越靠近两极变形越大. 墨卡托投影公式为[x=λ-λ0y=ln[tan(π4+12φ)]=ln(tanφ+secφ)φ=2tan-1(ey)-12π=gd(y)λ=x+λ0], (1)式(1)中,[λ]为经度,[φ]为纬度. 即有经纬度([φ],[λ])对应的墨卡托平面坐标即为(x×R,y×R). 很明显,y方向的距离只有在赤道附近才是接近实际距离的. 2.2 A*寻径算法A*算法可运用到百度地图路径搜索中. A*算法是一种静态路网中求解最短路径最有效的直接搜索方法,算法中的距离估算值与实际值越接近,最终搜索速度越快. 寻径公式表示为[f(n)=g(n)+h(n)] . (2)对于路径搜索问题,状态就是图中的节点,代价就是距离. 定义f(n)是代价估计,g(n)为实际代价,h(n)最佳路径的估计代价. 保证找到最短路径(最优解的)条件,关键在于估价函数f(n)的选取(或者说h(n)的选取),以d(n)表达状态n到目标状态的距离,那么h(n)的选取大致有如下3种情况:1)如果h(n)≤d(n)到目标状态的实际距离,这种情况下,搜索的点数多,搜索范围大,效率低, 但能得到最优解;2)如果h(n) = d(n),即距离估计h(n)等于最短距离,那么搜索将严格沿着最短路径进行, 此时的搜索效率是最高的;3)如果 h(n)>d(n),则搜索的点数少、搜索范围小、效率高,但不能保证得到最优解. 3 总体方案设计3.1 API Key申请及清单文件配置百度地图是在软件Eclipse中进行开发.首先,在Eclipse中导入百度地图的核心开发包,开发包文件包括:baidumapapi_v3_3_0.jar、locSDK_5.0.jar、libBaiduMapSDK_v3_3_0_15.so 和liblocSDK5.so等文件,其中,locSDK_5.0.jar和liblocSDK5.so为百度定位SDK所使用.自v2.1.3版本开始,需要进入新的key申请系统. 申请流程如图1所示,打开命令行进入Android签名目录,使用JDK的keytool.exe生成数字签名,根据规则加上应用包名,合成安全码,进而获取key. 申请密钥和百度地图开发权限需要在清单文件中配置. 3.2 总体方案基于开源的百度地图API的核心类及接口,设计出一套总体方案,总体流程如图2所示. 当打开手机APP时,会进入菜单主页面,这个页面显示的就是常用的百度地图应用列表. 大致分为普通地图显示,地图图层切换(底图、卫星图、实时交通信息图),地图覆盖物(用户自行对地图进行标注)、指定范围内搜索、路线策略显示(驾车、步行、公交换乘)、自我定位. 任意打开一个菜单列表都会校验Key、GPS(定位时才需要)、网络是否打开,不满足条件,无法进入应用,界面会提示用户打开相应的操作. 当用户进入到某应用时,按返回键会重新回到主页面. 4 程序部分代码及真机实现结果4.1 定义基类在程序中首先定义了一个基类BaseActivity让其作为父类[8],应用开发的类都是继承这个类,这样使得代码利用率高且程序简洁. 首先初始化基类,然后定义两个对象即百度地图控件对象和控制器对象,再使用MapStatusUpdateFactory类来描述地图状态,如设置缩放级别、坐标、中心点. 其流程如图3所示. 4.2 覆盖物地图覆盖物[9]是覆盖到地图上的内容,包括:本地覆盖物和搜索覆盖物. 本地覆盖物[11-13]的抽象基类:OverlayOptions,搜索覆盖物抽象类: OverlayManager. 对于本地覆盖物,以marker覆盖物为例,会先新建markerOptions对象,然后设置对象的位置、图标、是否可以拖拽(默认是否)、标题等,最后将覆盖物添加至底图中. 圆形覆盖物CircleOptions、文字覆盖物TextOptions等大体思路都与上例是一致的. Marker覆盖物运行结果如图4所示,图4中加入了泡泡窗口. 对于搜索覆盖物[14-15],包括位置检索、周边检索、范围检索、公交检索、驾乘检索、步行检索等,初始化PoiSearch类,通过setOnGetPoiSearch ResultListener方法注册搜索结果的监听对象OnGetPoiSearchResultListener,通过自定义MySearchListener实现类,处理不同的回调方法,获得搜索结果,再结合覆盖物展示结果. 以步行路线为例,流程如图5所示. 以从武汉工程大学步行到华中科技大学为例,运行结果如图6所示. 4.3 定 位定位获取位置主要有GPS定位、网络定位和WIFI定位. 定位流程如图7所示. 图8为寝室WIFI定位. 5 结 语本文基于墨卡托投影法及A*寻径算法等理论方法,通过使用开源的百度地图API核心类及接口,进行了密钥的申请、清单文件的配置,设计了一套百度地图方案,在真机上实现了3个常见应用,展示文字、全城搜索、公交换乘等其他应用均已实现,因篇幅有限没有列出. 基于Android平台的地图服务具有日常实用性,未来研究重点是在Android平台下,完善和创新百度地图的应用,并以百度地图为基础,进一步拓展研究用户需求的其他项目.