通信工程毕业论文范文.doc
基于安卓平台的百度地图的导航设计摘要现代社会,手机导航己经成为人们工作生活中必不可缺少的一项导航定位服务。随着手机硬件的快速升级换代,对应于手机的各种高级软件服务和应用层出不穷。在这当中,手机导航定位服务,是一项全新且具有广阔市场和应用价值的业务。这其中的领航者百度地图,是百度公司向全国提供的电子地图服务。它拥有纸质地图无法比拟的优越性,特别是在近年来移动设备智能化、轻便化的趋势下,再加上网络速度的提升,更是让百度地图与人们的生活产生更为息息相关。在操作系统方面,谷歌于2007年11月推出了一款开源的移动终端操作系统安卓,截止至2012年11月数据显示,安卓占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。在手机地图导航开发方面,百度公司为开发者提供了非常灵活的百度地图展示与控制功能。由于开发百度地图的免费性和使用安卓平台的开源性,不仅能够有效降低开发成本,而且能使每个用户自由的获取信息,这也为手机地图导航定位服务的普及做出了重要的贡献。本人毕业设计的论题为基于Android移动平台的百度地图的导航设计,采用时下最新版的百度地图V2.1.0,该应用可以用来浏览城市的地图,并能对其放大、缩小和移动,三种视图的切换,同时实现GPS定位技术、公交路线的查询、兴趣点的搜索和路线导航等功能,具有很强的应用前景。关键词:手机导航,安卓,百度地图Based on Android Platform Baidu Map NavigationAbstract In modern society,mobile navigation has already become one of the most essential navigation service in the peoples life.Along with the rapid upgrade in mobile hardware,a large number of advanced software will be appeared.Mobile navigation service is a new market service among them.Baidu Map is the No.1 map application in China, it provide the whole country with the electronic map.It has superiority than paper map,especially in recently mobile turn into intelligence and convenience,and improve the speed of network,the relationship between people and Baidu Map become more related.In the operate system,Google corporation released an open mobile terminal system-Android in November,2007,up to November,2012,android system occupied 76% quotas in the world on the smart phone system,the market share is 90% in China.In the mobile map navigation,Baidu corporation provides developer with flexible display and control function.Because Baidu Map is free,and android platform is opened.It can reduce the cost of developer.This promotes the development of mobile map navigation.My graduate subject is Based on android platform Baidu Map Navigation,it adopts the latest Baidu Map Version 2.1.0,it can be able to move,zoom out or in ,scan city map and switch three display.It also could achieve GPS location、acquire bus line information、search key words and car line navigation,it has a bright future.Key words: Mobile Navigation, Android, Baidu Map目 录第1章 绪论11.1 研究背景及意义11.2 研究现状11.3 研究课题主要内容31.4 论文组织3第2章 安卓平台与开发环境42.1 安卓平台简介42.2 安卓平台框架52.3 安卓开发环境搭建之JDK7下载安装62.4 安卓开发环境搭建之Eclipse组件下载安装6第3章 基于安卓平台的百度地图导航设计83.1 百度地图API申请和使用简介83.2 百度地图SDK简介93.3 百度地图库文件的工程配置流程93.4 百度地图初始化的代码配置流程10第4章 软件功能的实现144.1 百度地图的进入窗口144.2 百度地图的地图展示154.3 百度地图的地图搜索兴趣点164.4 百度地图的地图导航184.5 百度地图的公交路线站点查询214.6 百度地图的定位当前所在地22结论25参考文献26谢辞27第1章 绪论1.1 研究背景及意义随着移动平台操作系统的快速发展和地图导航应用领域的不断延伸1,在手机上拓展GPS功能已成为移动应用开发的一个热点。安卓手机操作系统作为一款新型智能手机操作系统,具有开放性好、软硬件功能扩展性强的特点,开发基于安卓 的地图应用潜力巨大2。2012年11月数据显示,安卓占据全球智能手机操作系统市场76%的份额,中国市场占有率为90%。同时据统计,人们的日常生活中,有大量的事件需要用到导航功能。见图1-1所示。图1-1 导航在手机软件中的使用率为了寻找某个地点,人们常常需要耗费大量的精力,所以伴随着现代生活节奏的不断加快,实时的地理位置信息正在成为人们最渴求的信息之一。2010年前的地图服务主要是以单机或者Web的方式实现,不适合身处外地的用户使用,给用户的出行带来了不便。而手机地图服务的便携性和数据的实时性3很好的解决了这一问题,因此,设计和优化地图定位服务的应用具有非常实用的价值4。1.2 研究现状在国外,主要以Google Map5为主,由谷歌公司提供的电子地图服务,包括局部详细的卫星照片。此款服务可以提供含有行政区和交通以及商业信息的矢量地图、不同分辨率的卫星照片和街景视图6的离线地图包7。2012年8月16日,谷歌针对移动设备升级了地图服务,本次升级的重点是全球将近500个城市的公交选择列表,包含了全球100多万个公交站的始发时间和行进路线。谷歌还将针对部分车站提供室内导航8,帮助乘车者寻找路线。2012年12月3日,Google Map v1 版正式被废弃,不能再申请API Key。2012年12月5日,Google Map v2 版正式被启用,采用最新的SHA1进行申请,原有的MD5申请方式被废弃,同时启用全新的Google APIs Console9对相关使用权限进行管理10,见图1-2所示。 图1-2 Google APIs Console2013年2月26日和3月12日,Google Map v2 11又进行了不同的程度的修改和更新。在国内,主要以Baidu Map12为主,见图1-3所示。图1-3 三家地图运营公司使用率Baidu Map是百度提供的一项网络地图搜索服务,覆盖了国内近400个城市、数千个区县。在百度地图里,用户可以查询街道、商场、楼盘的地理位置,也可以找到离您最近的所有餐馆、学校、银行、公园等等。2012年12月3日,Android SDK:v1.3.5 栅格版地图最终版发布,实现用户数据地图展现,完美兼容安卓4.2。2013年1月23日 Android SDK:v2.0.0由栅格版地图彻底转向矢量版地图,较之栅格版地图,增加19级显示,地图显示更详细。定位功能模块分离,即Android SDK 2.0.0版本不再包含定位功能(保留定位图层),开发者在需要定位功能时,请引入定位SDK。同时增加地图3D显示特效。2013年3月28日 Android SDK:V2.1.0产品上线,新增地图截图功能、自定义线路绘制,根据起点、终点和关键点绘制3D视角控制接口。1.3 研究课题主要内容本课题将最终完成的主要成果为:(1)自我位置更新定位和三类视图切换点击获取当前位置按钮,实现当前所在地的定位。点击菜单,将出现三类地图menu按钮,依据所需,按其所需。(2)3D控制接口和旋转度控制根据3D俯视度,可调整观看地图的角度,实现三维地图的感受。根据旋转度的调整,可360度的调转方向。(3)A点到B点的导航A点到达B点,有四种实现方式。分别是步行模式、公交模式、驾车模式、自设模式。(4)公交车路线查询根据城市名和公交车的号码,可调出从起始站到终点站的所有站名和路线,将其显示在地图上。1.4 论文组织文章分为四个部分。第一章主要介绍了设计的研究背景、意义和研究课题的主要内容。第二章主要介绍了安卓平台的框架和功能,比较细致的介绍了JDK7的下载安装和Eclipse组件的环境搭建。第三章主要介绍了百度地图API如何申请和使用,百度地图SDK的功能介绍,以及要使用百度地图最开始的库文件的工程配置流程和代码配置流程。第四章主要介绍了百度地图相关功能的实现,比如地图的展示,兴趣点地点的搜索,地图的两地导航,公交车的站点路线查询,定位当前位置和卫星地图等的切换。最后在结论部分对本次毕业设计的过程做大致的回首,同时对应用软件存在的问题做出分析。第2章 安卓平台与开发环境2.1 安卓平台简介(1)显示布局安卓操作系统支持更大的分辨率,VGA,2D显示,3D显示都给予OpenGL ES 2.0标准规格,并且支持传统的智能手机。(2)数据存储安卓操作系统内置SQLite小型关联式资料库管理系统来负责存储数据。(3)网络安卓操作系统支持所有的网络制式,包括GSM/EDGE、IDEN、CDMA、EV-DO、UMTS、Bluetooth、Wi-Fi、LTE、NFC和WiMAX。(4)信息作为原设计给手机使用的操作系统,安卓操作系统原生支持短信和邮件,并且支持所有的云端信息和服务器信息。(5)语言安卓操作系统支持多语言。(6)浏览器安卓操作系统中内置的网页浏览器基于WebKit内核,并且采用了Chrome V8引擎。在安卓 4.0内置的浏览器测试中,HTML5和Acid3故障处理中均获得了满分,并且于2.2版及之后能原生支持Flash。(7)支持Java虽然安卓操作系统中的应用程序大部分都是由Java编写的,但是安卓却是以转换为Dalvik executables的文件在Dalvik虚拟机上运行的。由于安卓中并不自带Java虚拟机,因此无法直接运行Java程序。不过安卓平台上提供了多个Java虚拟机供用户下载使用,安装了Java虚拟机的安卓系统可以运行J2ME的程序。(8)媒体支持安卓操作系统本身支持以下格式的音频/视频/图片媒体:WebM、H.263, H.264 (in 3GP or MP4 container)、MPEG-4 SP、AMR, AMR-WB (in 3GP container)、AAC, HE-AAC (in MP4 or 3GP container)、MP3、MIDI、Ogg Vorbis、FLAC、WAV、JPEG、PNG、GIF、BMP。如果用户需要播放更多格式的媒体,可以安装其他第三方应用程序。(9)流媒体支持安卓操作系统支持RTP/RTSP(3GPP PSS, ISMA)的流媒体以及(HTML5 <video>)的流媒体,同时还支持Adobe的Flash,在安装了RealPlayer之后,还支持苹果公司的流媒体。(10)硬件支持安卓操作系统支持识别并且使用视频/照片摄像头,多点电容/电阻触摸屏,GPS,加速计,陀螺仪,气压计,磁强计,键盘,鼠标,USB Disk,专用的游戏控制器,体感控制器,游戏手柄,蓝牙设备,无线设备,感应和压力传感器,温度计,加速2D位位块传输(硬件方向,缩放,像素格式转换)和3D图形加速。(11)多点触控安卓支持原生的多点触摸,在最初的HTC Hero手机上即有这个功能。该功能是内核级别。(12)蓝牙安卓支持A2DP,AVRCP,发送文件(OPP),访问电话簿(PBAP),语音拨号和发送手机之间的联系。同时支持键盘,鼠标和操纵杆(HID)。(13)语音功能除了支持普通的电话通话之外,安卓操作系统从最初的版本开始就支持使用语音操作来使用谷歌进行网页搜索等功能。(14)无线共享功能安卓操作系统支持用户使用本机充当“无线路由器”,并且将本机的网络共享给其他手机,其他机器只需要通过WiFi寻找到共享的无线热点,就可以上网。而在Android OS v2.2版本之前的操作系统则需要通过第三方应用或者其他定制版系统来实现这个功能。(15)截图功能从Android OS v4.0版本开始,安卓操作系统便支持截图功能,该功能允许用户直接抓取手机屏幕上的任何画面。2.2 安卓平台框架Android的底层建立在Linux系统之上。它采用一种软件叠层的方式进行构建。这种软件层结构使得层与层之间互相分离,分工明确。保证了层与层之间的低耦合,当下层的层下或者层内发生改变时,上层应用程序无需做任何改变。安卓系统主要由三部分组成:(1)应用部分(2)核心部分(3)底层部分见图2-1所示浏览器应用联系人应用通话应用桌面应用应用部分系统数据源组件窗口管理服务组件管理服务资源管理服务控件框架核心部分SQLiteWebkitlibeJava核心类库生化危机Java虚拟机FreeTypeOpenGL通话接口GPS接口音视频接口底层部分电源管理驱动进程/线程图2-1 安卓平台框架2.3 安卓平台开发环境搭建之JDK7下载安装首先需要的是JDK。Android SDK需要JDK 6或更高的版本,我们使用JDK 7来开发。从( )下载JDK 7并安装。接下来,设置JAVA_HOME环境变量以指向JDK安装文件夹。右键单击“计算机”选择“属性”,选择“高级系统设置”,然后单击“环境变量”。单击“新建”添加JAVA_HOME变量,如果该变量已存在,单击“编辑”修改它。JAVA_HOME的值类似于“C:Program FilesJavajdk1.7.0_10”。2.4 安卓平台开发环境搭建之Eclipse组件下载安装谷歌公司为了方便广大的开发者,已将Eclipse ADT、Android SDK等软件都集中捆绑下载了。从(图2-2 Android SDK下载页面第3章 基于安卓平台的百度地图导航设计3.1 百度地图API申请和使用简介百度地图移动版API是一套基于安卓 1.5及以上设备的应用程序接口,通过该接口,您可以轻松访问百度服务和数据,构建功能丰富、交互性强的地图应用程序。百度地图移动版API不仅包含构建地图的基本接口,还提供了诸如地图定位、本地搜索、路线规划等数据服务,你可以根据自己的需要进行选择。用户在使用API之前需要获取百度地图移动版API Key,该Key与你的百度账户相关联,您必须先有百度帐户,才能获得API KEY。并且,该KEY与您引用API的程序名称有关,KEY的申请具体流程请看下图3-1。图3-1 申请百度API密钥然后获得已申请的API密钥,如图3-2所示。为了能使用百度地图应用,首先将API包括的两个文件baidumapapi.jar和libBMapApiEngine.so拷贝到工程根目录及libsarmeabi目录下,并在工程属性->Java Build Path->Libraries中选择“Add JARs”,选定baidumapapi.jar,确定后返回,这样就可以在程序中使用API了。图3-2 已获得的百度API密钥3.2 百度地图SDK简介百度地图Android SDK是一套基于安卓 2.1(v1.3.5及以前版本支持安卓 1.5以上系统)及以上版本设备的应用程序接口,您可以通过该接口实现丰富的LBS功能:(1)地图展示:包括2D图、卫星图、3D图地图展示。(2)地图操作:提供平移、缩放、双指手势操作、底图旋转等地图相关操作。(3)地图搜索:提供根据关键字进行范围检索、城市检索和周边检索。且支持LBS云检索用户自有数据。(4)线路规划:提供公交、驾车和步行三种类型,多种方案(不含地铁、时间优先、最少换乘、最少步行)的线路规划。(5)位置标注:提供一个或多个POI位置标注,且支持用户自定义图标。(6)实时路况:提供城市实时交通路况信息图。(7)定位:采用GPS、WIFI、基站、IP混合定位模式,请使用安卓定位SDK获取定位信息,使用地图SDK定位图层进行位置展示。 百度地图Android SDK从2.0.0版本开始采用的是矢量版的地图,开发者如果需要使用栅格版的地图数据,请使用1.3.5及之前的版本。3.3 百度地图库文件的工程配置流程首先,在工程里新建libs文件夹,将开发包里的baidumapapi_v2_1_1.jar拷贝到libs根目录下,将libapp_BaiduMapApplib_v2_1_1.so和libvi_voslib.so 拷贝到libsarmeabi目录下,拷贝完成后的工程目录如下图3-3所示。图3-3 百度地图库文件3.4 百度地图初始化的代码配置流程百度地图为开发者提供了便捷的显示百度地图数据的接口,通过以下几步操作,即可在您的应用中使用百度地图数据。 (1)在Manifest中添加使用权限<!-使用网络功能所需权限 -><uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/><uses-permission android:name="android.permission.INTERNET"/><!- 获取设置信息所需权限 -><uses-permission android:name="android.permission.READ_PHONE_STATE"/><!- 使用定位功能所需权限 -><uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/><permission android:name="android.permission.BAIDU_LOCATION_SERVICE"/><uses-permission android:name="android.permission.BAIDU_LOCATION_SERVICE"/><uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/><uses-permission android:name="android.permission.ACCES_MOCK_LOCATION"/><uses-permission android:name="android.permission.ACCESS_GPS"/> (2)配置Activity:<activity android:name=".Map" android:screenOrientation="sensor" android:configChanges="orientation|keyboardHidden"></activity>(3)添加屏幕及版本支持:<supports-screens android:largeScreens="true" android:normalScreens="true" android:smallScreens="true" android:resizeable="true" android:anyDensity="true"/><uses-sdkandroid:minSdkVersion="7"></uses-sdk>(4)在布局xml文件中添加地图控件,布局文件保存为activity_main.xml:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android=" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="hello world" /> <com.baidu.mapapi.map.MapView android:id="+id/bmapsView" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" /></LinearLayout>(5)创建地图Activity,并import相关类:import android.app.Activity;import android.content.res.Configuration;import android.os.Bundle;import android.view.Menu;import android.widget.FrameLayout;import android.widget.Toast;import com.baidu.mapapi.BMapManager;import com.baidu.mapapi.map.MKMapViewListener;import com.baidu.mapapi.map.MapController;import com.baidu.mapapi.map.MapPoi;import com.baidu.mapapi.map.MapView;import api.basestruct.GeoPoint; public class MyMapActivity extends Activity Override public void onCreate(Bundle savedInstanceState) (5)初始化地图Activity、使用key:在MyMapActivity中定义成员变量:BMapManager mBMapMan = null;MapView mMapView = null;在onCreate方法中增加以下代码,并将你申请的Key替换“我的Key”super.onCreate(savedInstanceState);mBMapMan=new BMapManager(getApplication();mBMapMan.init("我的Key", null); /注意:请在试用setContentView前初始化BMapManager对象,否则会报错setContentView(R.layout.activity_main);mMapView=(MapView)findViewById(R.id.bmapsView);mMapView.setBuiltInZoomControls(true);/设置启用内置的缩放控件MapController mMapController=mMapView.getController();/ 得到mMapView的控制权,可以用它控制和驱动平移和缩放GeoPoint point =new GeoPoint(int)(39.915* 1E6),(int)(116.404* 1E6);/用给定的经纬度构造一个GeoPoint,单位是微度 (度 * 1E6)mMapController.setCenter(point);/设置地图中心点mMapController.setZoom(12);/设置地图zoom级别重写以下方法,管理APIOverrideprotected void onDestroy() /用来终止百度API mMapView.destroy(); if(mBMapMan!=null) mBMapMan.destroy(); mBMapMan=null; super.onDestroy();Overrideprotected void onPause() /用来暂停百度API mMapView.onPause(); if(mBMapMan!=null) mBMapMan.stop(); super.onPause();Overrideprotected void onResume() /用来恢复百度API mMapView.onResume(); if(mBMapMan!=null) mBMapMan.start(); super.onResume();完成以上步骤后,运行程序,即可在应用中展示百度地图的视窗。第4章 百度地图的导航实现4.1 百度地图的地理编码百度地图应用设计的地理编码解析流程图4-1如下4-1百度地图应用设计的流程图4.2 百度地图的进入界面进入界面的列表顺序设计的核心代码。ListView mListView = null;String mStrs = "地图展示", "地图搜索兴趣点", "地图导航", "公交路线站点查询", "定位当前所在地",;Class<?> mActivities = BaseMap.class,PoiSearch.class,RoutePlan.class,BusLineSearch.class,LocationOverlay.class,;点击手机上的图标如下图4-2图4-2 打开手机里的图标然后手机屏幕上出现下面的列表视图如下4-3图4-3 列表视图4.3 百度地图的地图展示地图展示功能的核心代码/截图方法 public void captureMapClick() mMapView.getCurrentMap();/获取当前显示的地图 /设置地图旋转角度 public void setMapRotateClick() EditText rotate = (EditText)findViewById(R.id.rotateangle); mMapView.getController().setRotation(Integer.parseInt(rotate.getText().toString(); /设置地图俯视角度 public void setMapOverlookingClick() EditText overlooking = (EditText)findViewById(R.id.overlookangle);mMapView.getController().setOverlooking(Integer.parseInt(overlooking.getText().toString();地图展示功能的视图4-4如下图4-4 地图展示视图4.4 百度地图的地图搜索兴趣点地图搜索兴趣点的核心代码 mSearch = new MKSearch();/ 初始化搜索模块,注册事件监听 mSearch.init(app.mBMapManager, new MKSearchListener()/mBMapManager:地图引擎管理类, 开启和终止百度地图API,只用初始化一次。/MKGeneralListener:一般事件通知接口。该接口返回网络状态,授权验证等结果。 Override public void onGetPoiResult(MKPoiResult res, int type, int error) if (error != 0 | res = null) Toast.makeText(PoiSearch.this, "抱歉,未找到结果", Toast.LENGTH_LONG).show(); return;if (res.getCurrentNumPois() > 0) /若监听的兴趣点结果数量大于0,将poi结果显示到地图上MyPoiOverlay poiOverlay = new MyPoiOverlay(PoiSearch.this, mMapView, mSearch); poiOverlay.setData(res.getAllPoi();/获取所有的兴趣点,进行数据设置 mMapView.getOverlays().clear();/清空之前地图上的所有覆盖物 mMapView.getOverlays().add(poiOverlay);/将兴趣点覆盖物添加显示mMapView.refresh();/刷新地图,进行overlay增删操作后,需调用此方法以刷新地图显示。 for( MKPoiInfo info : res.getAllPoi() ) if ( info.pt != null )mMapView.getController().animateTo(info.pt);/控制视图将第一个poi点移动至地图中心 break; 地图搜索兴趣点的视图4-5如下 图4-5 地图搜索兴趣点视图4.5 百度地图的地图导航地图导航的核心代码public void onGetDrivingRouteResult(MKDrivingRouteResult res,int error) if (error != 0 | res = null) Toast.makeText(RoutePlan.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show();return; RouteOverlay:使用SDK内置图标及展现方式展示路线信息,RouteOverlay routeOverlay = new RouteOverlay(RoutePlan.this, mMapView);routeOverlay.setData(res.getPlan(0).getRoute(0);/ 通过setdata接口设置路线数据mMapView.getOverlays().clear();/清空之前地图上的所有覆盖物