《Android的百度地图开发.ppt》由会员分享,可在线阅读,更多相关《Android的百度地图开发.ppt(33页珍藏版)》请在三一办公上搜索。
1、Android的百度地图开发,Android进阶,百度地图API平台介绍,百度地图 Android SDK是一套基于Android 2.1(v1.3.5及以前版本支持android 1.5以上系统)及以上版本设备的应用程序接口。可以使用该套 SDK开发适用于Android系统移动设备的地图应用,通过调用地图SDK接口,您可以轻松访问百度地图服务和数据,构建功能丰富、交互性强的地图类应用程序。百度地图Android SDK提供的所有服务是免费的,接口使用无次数限制。您需申请密钥(key)后,才可使用百度地图Android SDK。任何非营利性产品请直接使用。,百度地图API平台,百度地图API网
2、址:http:/申请新密钥及查看原先申请的密钥开发指南 在安卓平台上使用百度地图的开发指南类参考 地图库所提供的类及方法说明相关下载 开发所使用的相关包及说明示例下例,申请key,点击 获取密钥 进入密钥申请页并阅读相关的使用条款勾选 已阅读并同意条款填写应用名称填写一下应用的相应功能及描述输入验证码确定后 密钥即可申请成功,如何把API 添加到我的Android工程中,在工程里新建libs文件夹(若不存在的话),将开发包里的baidumapapi_v2_1_1.jar拷贝到libs根目录下,将libapp_BaiduMapApplib_v2_1_1.so和libvi_voslib.so 拷贝
3、到libsarmeabi目录下项目属性中Java Build Path-Order and Export中,确定Android Private Libaries与Android Dependencies这两项前面的选择框被选上后,点确定菜单Project-clean重新编译项目后就可以正常使用地图中的功能进行编程了。上图包中的liblockSDK3.1.jar及对应的so文件是用于定位与搜索功能的,如果不需要可以不加入到项目当中,项目清单添加权限,在Manifest中添加使用权限,项目清单添加权限,在清单文件中添加对屏幕的支持,对需要加载地图的Activity进行属性设置,项目清单添加权限,在
4、布局中添加百度地图显示控件,这个就是加载百度地图的控件框,这个布局你可以根据自己的需要进行调整,或是放置到你的Activity需要的地方去。此控件需要接收到点击事件,所以需要把clickable设置成true。,MapActivity基类,管理显示在MapView类中activity处理逻辑的基础类。MapActivity这个基类不是必须的,但一般情况下,我们会把地图配置处相关处理代码放在基类中,然后在实现此基类的子类中专心实现业务的相关逻辑,而不是把大量的地图设置与业务逻辑混杂在一起。它的责任包括:Activity及地图生命周期管理 地图控制相关配置在一个MapView后面创建和销毁服务 定
5、位结果返回后的处理,BMapManager,地图、定位、搜索功能都需要用BMapManager对象来管理,BMapManager提供四个接口:init()、start()、stop()、destroy()。在应用程序里生成BMapManager 对象并初始化,在程序退出时调用destroy(),在需要使用sdk功能的Activity的onCreate()方法里调用start()方法,onDestroy()方法里调用stop()方法,或者onResume()/onPause()分别调用start()和stop()。常用方法:destroy():在程序退出前调用boolean init(java.
6、lang.StringstrKey,MKGeneralListener listener)初始化地图引擎,需要送入申请的百度地图Keyboolean start():开启百度地图APIboolean stop():终止百度地图API,调用此函数后,不会再发生回调,MKGeneralListener,一般事件通知接口,该接口返回网络状态,授权验证等结果,用户需要实现该接口以处理相应事件。void onGetPermissionState(intiError):返回授权验证错误,iError 为错误号,值为300,验证失败void onGetNetworkState(int iError)返回网络
7、错误参数:iError-错误号,MapView,一个显示地图的视图控件,当被焦点选中时,它能捕获按键事件和触摸手势去平移和缩放地图 setBuiltInZoomControls(booleanon):设置是否启用内置的缩放控件 getController():返回地图的MapController,这个对象可用于控制和驱动平移和缩放setDoubleClickZooming(booleanbDoubleClickZooming):设置mapview是否支持双击放大效果 getOverlays():获取当时地图控件中的已有图层refresh():刷新此地图控件,MapController,处理地图
8、移动和缩放的工具类setCenter(GeoPointpoint):设置地图视图中心点,必须设置中心点才能显示地图setZoom(intzoomLevel):设置地图的缩放级别。3-19值越大地图上建筑越大zoomIn/Out():放大/缩小一个级别animateTo(GeoPoint p,Message m):以动画的方式将地图视图移到到指定点上,结果后发送一个指定的消息。,GeoPoint(int latitudeE6,int longitudeE6)普通经纬度要乘以106表示一个地理坐标点,存放经度和纬度,以微度的整数形式存储,LocationClient,定位处理功能的核心类regis
9、terLocationListener(BDLocationListener)接收到定位数据后可由指定监听器中的onReceiveLocation(BDLocation)的方法来接收相关的数据并做相关的处理构造:new LocationClient(getApplicationContext()setLocOption(LocationClientOption)设置定位的参数start()启动定位功能,此功能是持续的,可以定义间隔刷新时间stop()结束定位功能,但前面设置的定位参数不会消失,可以再启动requestLocation()发起异步定位请求,如果位置没有变化,不会发起网络请求,直接
10、返回上次的位置。(2次间隔需要大于1秒),LocationClientOption,设置定位功能的定位方式disableCache(boolean)真表示禁用缓存定位setOpenGPS(boolean)是否使用GPS定位,前提是手机打开了GPS定位setAddrType(String)当字串为all时返回此位置地址信息,其它不返回setCoorType(String)设置返回坐标的格式gcj02-国测局bd09百度墨卡托bd0911百度经纬坐标(手机默认)setScanSpan(int)定时定位的时间间隔(ms)此值大于1000时,每隔此值指定的时间就会发起一次定位此值小于1000时或不设置
11、此值时,调用一次requestLocation()方法则定位一次,LocationData,保存用户位置的数据实例double latitude 纬度值double longitude 经度值float accuracy 定位精度float direction GPS定位时的方向角度int satellitesNum GPS卫星的数量speed GPS定位时速度,MapActivity代码,protected void onDestroy()mapView.destroy();if(mapManager!=null)mapManager.destroy();mapManager=null;su
12、per.onDestroy();,protected void onPause()mapView.onPause();if(mapManager!=null)mapManager.stop();super.onPause();,protected void onResume()mapView.onResume();if(mapManager!=null)mapManager.start();super.onResume();,地图代码示例,protected void onCreate(Bundle savedInstanceState)/MapActivity基类的Createsuper.o
13、nCreate(savedInstanceState);mapManager=new BMapManager(getApplication();mapManager.init(BAIDU_MAP_KEY,null);locationClient=new LocationClient(getApplicationContext();locationClient.registerLocationListener(this);LocationClientOption lco=new LocationClientOption();lco.setOpenGps(true);lco.setCoorType
14、(bd09ll);lco.setPriority(LocationClientOption.GpsFirst);/lco.setScanSpan(5000);locationClient.setLocOption(lco);locData=new LocationData();,protected void initMap(int mapId)/初始化地图mapView=(MapView)findViewById(mapId);mapView.setBuiltInZoomControls(true);mc=mapView.getController();locData.latitude=39.
15、915d;locData.longitude=116.404d;mc.setCenter(new GeoPoint(int)(locData.latitude*1e6),(int)(locData.longitude*1e6);mc.enableClick(true);mc.setZoom(14);locationOverlay=new MyLocationOverlay(mapView);mapView.getOverlays().add(locationOverlay);locationOverlay.enableCompass();mapView.refresh();,地图示例效果图,m
16、apView.setTraffic(true),mapView.setSatellite(true),覆盖物,所以叠加或覆盖到地图的内容,统称为地图覆盖物。如标注、矢量图形元素(包括折线、多边形和圆)、定位图标等。覆盖物拥有自己的地理坐标,当拖动或缩放地图时,覆盖物也会做相应的移动。地图API提供如下几种覆盖物:Overlay:覆盖物的抽象基类,所有的覆盖物都继承此类的方法,实现用户自定义图层显示。MyLocationOverlay:负责显示用户当前位置的Overlay。ItemizedOverlay:Overlay的一个基类,包含了一个OverlayItem列表,相当于一组分条的Overla
17、y,通过继承此类,将一组兴趣点显示在地图上。PoiOverlay:本地搜索图层,提供某一特定地区的位置搜索服务,比如北京市搜索公园,通过此图层将公园显示在地图上。PopupOverlay 用于快速在特定位置显示一个弹窗,通常用于导航,搜索定位点的提供RouteOverlay:步行、驾车导航线路图层,将步行、驾车出行方案的路线及关键点显示在地图上。TransitOverlay:公交换乘线路图层,将某一特定地区的公交出行方案的路线及换乘位置显示在地图上。,覆盖物类继承图,com.baidu.mapapi.map.Overlay,GraphicsOverlay,MyLocationOverlay,P
18、opupOverlay,ItemizedOverlay,PoiOverlay,RouteOverlay,TransitOverlay,标注我的位置,MyLocationOverlay myLay=new MyLocationOverlay(mapView);LocationData locData=new LocationData();locData.latitude=26.04968d;locData.longitude=119.307784d;/手动设定经纬度myLay.setData(locData);mapView.getOverlays().add(myLay);mapView.re
19、fresh();mapView.getController().animateTo(newGeoPoint(int)(locData.latitude*1e6),(int)(locData.longitude*1e6);,在实际的开发中,位置的经纬度是要通过LocationClient接口去获取的可以看到位置图层不仅可以显示所在的点,还可以显示定位信号的误差范围(蓝色的圈表示),标注图形及文字,Bitmap bp=Bitmap.createBitmap(120,120,Config.ARGB_8888);/需要绘制的图形Canvas c=new Canvas(bp);Paint p=new P
20、aint();p.setColor(android.graphics.Color.BLUE);Bitmap arrow=BitmapFactory.decodeResource(getResources(),android.R.drawable.arrow_down_float);/获取图形资源库中的箭头图形c.drawBitmap(arrow,60,60,p);p.setTextSize(20);c.drawText(中心点,60,60,p);BitmapDrawable bd=new BitmapDrawable(bp);/通过此类进行Bitmap至Drawable转换ItemizedOv
21、erlay cLay=new ItemizedOverlay(bd,mapView);OverlayItem centerItem=new OverlayItem(mapView.getMapCenter(),中心点,搜索的中心点);cLay.addItem(centerItem);mapView.getOverlays().add(cLay);mapView.refresh();,如果仅需要绘制图形,只需要在new ItemizedOverlay构造的第一个参数送入相应的Drawable资源文件就可以了如果需要绘制文字,则需要先将文字绘制在图形文件中,然后再把图形文件通过ItemizedOv
22、erlay对象绘制到地图上即可,根据范围和关键字检索位置,MKSearch search=new MKSearch();search.init(bmm,new MySearchListener();search.poiSearchNearBy(searchText.getText().toString(),mapView.getMapCenter(),2000);,public void onGetPoiResult(MKPoiResult res,int type,int error)if(mapView=null)return;if(error=MKEvent.ERROR_RESULT_N
23、OT_FOUND)Toast.makeText(XRMapActivity.this,抱歉,未找到结果,0).show();return;else if(error!=0|res=null)Toast.makeText(XRMapActivity.this,抱歉,搜索出错,0).show();return;Overlay o=null;for(Iterator ir=mapView.getOverlays().iterator();ir.hasNext();)o=(Overlay)ir.next();if(o instanceof PoiOverlay)ir.remove();mapView.
24、refresh();/去除上次搜索的结果PoiOverlay pLay=new PoiOverlay(XRMapActivity.this,mapView);pLay.setData(res.getAllPoi();/获取查询返回的结果mapView.getOverlays().add(pLay);mapView.refresh();,标注搜索范围,mapView.getOverlays().clear();mapView.refresh();/清除先前生成的内容GraphicsOverlay gLay=new GraphicsOverlay(mapView);Geometry geo=new
25、 Geometry();geo.setCircle(mapView.getMapCenter(),2000);/使用一个圆来表示范围Symbol sym=new Symbol();Symbol.Color circleColor=sym.new Color();circleColor.alpha=80;/设置透明度circleColor.red=0;circleColor.green=200;/绿色的圆circleColor.blue=0;sym.setSurface(circleColor,1,1);/第一个参数表示圆需要填充,后面表示边界Graphic gra=new Graphic(ge
26、o,sym);gLay.setData(gra);mapView.getOverlays().add(gLay);mapView.refresh();,上面这个图是叠加了前面三种图层产生的综合结果,其中的绿色圆圈,为右侧代码所生成,路线搜索,/先要查询出来当前地图中心点所在的城市名称search.reverseGeocode(mapView.getMapCenter();,public void onGetAddrResult(MKAddrInfo res,int error)if(error!=0|res=null)return;String city=res.addressComponen
27、ts.city;MKPlanNode startNode=new MKPlanNode();startNode.name=startText.getText().toString();MKPlanNode endNode=new MKPlanNode();endNode.name=endText.getText().toString();switch(radioGroup.getCheckedRadioButtonId()case R.id.radio0:search.walkingSearch(city,startNode,city,endNode);break;case R.id.radi
28、o1:/可以设置策略,最省时,或最省钱 search.setDrivingPolicy(MKSearch.ECAR_TIME_FIRST);search.drivingSearch(city,startNode,city,endNode);break;case R.id.radio2:search.transitSearch(city,startNode,endNode);break;/获取到city字串后就可以调用相关的接口实现相关的功能,由于相关的接口需要指定搜索所在的城市名,所以我们可以先通过接口获取相关的城市名,再调用后续的搜索接口展示不同的路线结果。,路线搜索,public void
29、 onGetWalkingRouteResult(MKWalkingRouteResult res,int error)/步行if(error!=0|res=null)return;mapView.getOverlays().clear();mapView.refresh();RouteOverlay ro=new RouteOverlay(XRMapActivity.this,mapView);ro.setData(res.getPlan(0).getRoute(0);mapView.getOverlays().add(ro);mapView.refresh();/驾车代码与其完全一样,只有
30、参数名不一样 MKDrivingRouteResult,public void onGetWalkingRouteResult(MKWalkingRouteResult res,int error)/公交if(error!=0|res=null)return;mapView.getOverlays().clear();mapView.refresh();TransitOverlay to=new TransitOverlay(XRMapActivity.this,mapView);to.setData(res.getPlan(0);mapView.getOverlays().add(to);m
31、apView.refresh();/公交用的图层与上面的不一样,路线搜索效果图,不同的搜索类型在点击地图上的相关图标点时,提示也会有不同。比如公交线路搜索会直接提示需要坐几路车,经过多少站。,公交详细路线图,查找公交线路需要分三步进行查找当前视图中心点所在城市名称查找此城市指定线路的uid根据城市名称及线路uid查询所有的站点并标注相关信息,/查找城市名search.reverseGeocode(mapView.getMapCenter();public void onGetAddrResult(MKAddrInfo res,int error)if(error!=0|res=null)ret
32、urn;String city=res.addressComponents.city;search.poiSearchInCity(city,K2);/查找线路uid Log.d(city,city);,公交详细路线图,/查找线路uidpublic void onGetPoiResult(MKPoiResult res,int type,int error)MKPoiInfo curInfo=null;for(int i=0;i res.getNumPois();i+)curInfo=res.getPoi(i);if(2=curInfo.ePoiType)/指定公交线路类型 break;Log
33、.d(uid,curInfo.uid);search.busLineSearch(city,curInfo.uid);/搜索线路信息,/搜索线路信息public void onGetBusDetailResult(MKBusLineResult res,int error)if(error!=0|res=null)return;mapView.getOverlays().clear();mapView.refresh();RouteOverlay ro=new RouteOverlay(XRMapActivity.this,mapView);ro.setData(res.getBusRoute
34、();/将线路输出到图层mapView.getOverlays().add(ro);mapView.refresh();Log.d(res,res.getBusName();/打印出线路名称(带起止站名称)searchType=0;,可以看出,其实都是图层处理其实都是大同小异的,只是数据源不同而已。可以通过多步调用的方式,一步一步地从百度提供的API中获取我们所关心的数据内容,最后再将这些数据展示在地图图层中,就完成了我们所需要的效果。,实现定位与目的地导航,从v2.1.1 版本开始,sdk提供一键调起百度地图客户端导航功能,而无需再自己实现相关的功能。注意:使用该 功能需安装 百度地图v5.
35、0及其以上版本,相关的导航Activity其实是由百度地图所提供的导航的页面来实现的。,/查寻当前地图中心点所在城市search.reverseGeocode(mapView.getMapCenter();public void onGetAddrResult(MKAddrInfo res,int error)if(error!=0|res=null)return;String city=res.addressComponents.city;/获取城市名称Log.d(city,city+searchContent);search.geocode(五一广场,city);/获取目标地点坐标,pub
36、lic void onGetAddrResult(MKAddrInfo res,int error)if(error!=0|res=null)return;searchObj=res.geoPt;/目标地点坐标保存起来locationClient.requestLocation();/获取自己当前坐标,此设置参考前面类介绍,实现定位与目的地导航,/获取当前用户所在位置坐标public void onReceiveLocation(BDLocation l)if(l=null|mapView=null)return;GeoPoint startPt=new GeoPoint(int)(l.get
37、Latitude()*1e6),(int)(l.getLongitude()*1e6);mc.animateTo(startPt);NaviPara para=new NaviPara();para.startName=起;para.startPoint=startPt;para.endName=终;para.endPoint=(GeoPoint)searchObj;try BaiduMapNavigation.openBaiduMapNavi(para,this);/调用百度导航Activity catch(Exception e)String msg=null;if(e instanceof BaiduMapAppNotSupportNaviException)msg=请安装百度地图5.0以上版本后再使用此功能;elsemsg=启动导航出错;Toast.makeText(this,msg,0).show();,作业,将福州大学及闽江学院的图标标注在百度地图上学校所在的位子上,并且显示两个校区之间最少转车次数的公交出行方案。,
链接地址:https://www.31ppt.com/p-2878226.html