【文档说明】计算机学院第10章百度地图开发课件.pptx,共(103)页,302.452 KB,由小橙橙上传
转载请保留链接:https://www.ichengzhen.cn/view-77541.html
以下为本文档部分文字说明:
计算机学院第10章百度地图开发课件概述百度地图AndroidSDK是一套基于Android2.1及以上版本设备的应用程序接口,可以通过该接口实现丰富的LBS(LocationBasedService,基于位置服务)功能。本章主要知识点有:(
1)如何申请密钥、创建应用;(2)Android地图SDK之基础地图、离线地图和检索功能;(3)Android地图SDK之计算工具、定位和事件监听;(4)Android定位SDK;(5)Android导航SDK百度地图SDK功能概述•地
图:提供地图(2D、3D)的展示和缩放、平移、旋转、改变视角等地图操作;•POI检索:可根据关键字,对POI数据进行周边、区域和城市内三种检索;•线路规划:支持公交信息查询、公交换乘查询、驾车线路规划和步行路径检索;•覆盖物:提供多
种地图覆盖物(自定义标注、几何图形、文字绘制、地形图图层、热力图图层等),满足开发者的各种需求;概述•定位:采用多种定位模式,使用定位SDK获取位置信息,使用地图SDK我的位置图层进行位置展示;•离线地图:支持使用离线地图,节省用户流量,同时为用户带来更好的地图体验;概述•导航:支持调启
百度地图导航和Web导航来满足用户对导航功能的需求;•LBS云检索:支持用户检索存储在LBS云内的自有POI数据,并展示;准备工作—申请密钥在使用百度地图SDK提供的各种LBS能力之前,需要获取百度地图移动版的开发密钥,该密钥与你的百度账户
相关联。因此,必须先有百度帐户,才能获得开发密钥。并且,该密钥与你创建的过程名称有关,具体流程请参考如下介绍。Key的申请地址为:http://lbsyun.baidu.com/apiconsole/key10.1.1基础地图百度地图SDK为广大开发者提供的基础地图和上面的各种覆盖物元素,
具有一定的层级压盖关系,具体如下(从下至上的顺序):(1)基础底图(包括底图、底图道路、卫星图等);(2)地形图图层(GroundOverlay);(3)热力图图层(HeatMap);(4)实时路况图图层(BaiduMap.setT
rafficEnabled(true););(5)百度城市热力图(BaiduMap.setBaiduHeatMapEnabled(true););(6)底图标注(指的是底图上面自带的那些POI元素);(7)几何图形图
层(点、折线、弧线、圆、多边形);(8)标注图层(Marker),文字绘制图层(Text);(9)指南针图层(当地图发生旋转和视角变化时,默认出现在左上角的指南针);(10)定位图层(BaiduMap.setMyLocationEnabled(true););(11)弹出窗图层(Info
Window);(12)自定义View(MapView.addView(View););2.地图类型百度地图AndroidSDK提供了两种类型的地图资源(普通矢量地图和卫星图),开发者可以利用BaiduMap中的mapType()方法来设置地图类型。核心
代码如下:mMapView=(MapView)findViewById(R.id.bmapView);mBaiduMap=mMapView.getMap();//普通地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);//卫星
地图mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);3.实时交通图当前,全国范围内已支持多个城市实时路况查询,且会陆续开通其他城市。在地图上打开实时路况的核心代码如下:mMapView=(MapView)findViewById(R.id.
bmapView);mBaiduMap=mMapView.getMap();//开启交通图mBaiduMap.setTrafficEnabled(true);4.百度城市热力图百度地图SDK继为广大开发者开放热力图本地绘制能力之后,再次进一步开放百度
自有数据的城市热力图层,帮助开发者构建形式更加多样的移动端应用。百度城市热力图的性质及使用与实时交通图类似,只需要简单的接口调用,即可在地图上展现样式丰富的百度城市热力图。在地图上开启百度城市热力图的核心代码如下:m
MapView=(MapView)findViewById(R.id.bmapView);mBaiduMap=mMapView.getMap();//开启热力图mBaiduMap.setBaiduHeatMapEnabled(true);5.标
注覆盖物为了能更方便的使用SPI模块,我们要对SPI模块进行构件化。只要良好地封装好每一个构件,在使用时就可以直接调用。出此之外,尤其是对同一芯片的移植非常有助于减少重复性写程序。开发者可根据自己实际的业务需求,利用标注覆盖物,在地图指定的位
置上添加标注信息。具体实现方法如下:在地图上开启百度城市热力图的核心代码如下://定义Maker坐标点LatLngpoint=newLatLng(39.963175,116.400244);//构建Marker图标BitmapDescriptorbitmap=BitmapDescr
iptorFactory.fromResource(R.drawable.icon_marka);//构建MarkerOption,用于在地图上添加MarkerOverlayOptionsoption=newMarkerOptions().position(po
int).icon(bitmap);//在地图上添加Marker,并显示mBaiduMap.addOverlay(option);针对已经添加在地图上的标注,可采用如下方式进行手势拖拽:第一步,设置可拖拽:Ove
rlayOptionsoptions=newMarkerOptions().position(llA)//设置marker的位置.icon(bdA)//设置marker图标.zIndex(9)//设置mar
ker所在层级.draggable(true);//设置手势拖拽//将marker添加到地图上marker=(Marker)(mBaiduMap.addOverlay(options));第二步,设置监听方法://
调用BaiduMap对象的setOnMarkerDragListener方法设置marker拖拽的监听mBaiduMap.setOnMarkerDragListener(newOnMarkerDragListener(){publicvoidonMarkerDrag(Ma
rkermarker){//拖拽中}publicvoidonMarkerDragEnd(Markermarker){//拖拽结束}publicvoidonMarkerDragStart(Markermarker){//开始拖拽}});6.几何图形覆盖物地图SDK提供多种结
合图形覆盖物,利用这些图形,可帮助构建更加丰富多彩的地图应用。目前提供的几何图形有:点(Dot)、折线(Polyline)、弧线(Arc)、圆(Circle)、多边形(Polygon)。//定义多边形的五个顶点LatLngpt1=newLatLng(39.93923,116.3
57428);LatLngpt2=newLatLng(39.91923,116.327428);LatLngpt3=newLatLng(39.89923,116.347428);LatLngpt4=newLatLng(39.89923,116.367
428);LatLngpt5=newLatLng(39.91923,116.387428);List<LatLng>pts=newArrayList<LatLng>();pts.add(pt1);pts.add(pt2);pts.add(pt3);pts.add(pt4
);pts.add(pt5);//构建用户绘制多边形的Option对象OverlayOptionspolygonOption=newPolygonOptions().points(pts).stroke(n
ewStroke(5,0xAA00FF00)).fillColor(0xAAFFFF00);//在地图上添加多边形Option,用于显示mBaiduMap.addOverlay(polygonOption)7.文字覆盖物文字,在地图中也是一种覆盖物,开发者可利用相关的接口,快速实现在地图上书写
文字的需求。实现方式如下://定义文字所显示的坐标点LatLngllText=newLatLng(39.86923,116.397428);//构建文字Option对象,用于在地图上添加文字OverlayOptionstextOption=newTextO
ptions().bgColor(0xAAFFFF00).fontSize(24).fontColor(0xFFFF00FF).text("百度地图SDK").rotate(-30).position(
llText);//在地图上添加该文字对象并显示mBaiduMap.addOverlay(textOption);8.弹出窗覆盖物弹出窗覆盖物的实现方式如下,开发者可利用此接口,构建具有更强交互性的地图页面。//创建InfoWind
ow展示的viewButtonbutton=newButton(getApplicationContext());button.setBackgroundResource(R.drawable.popup);//
定义用于显示该InfoWindow的坐标点LatLngpt=newLatLng(39.86923,116.397428);//创建InfoWindow,传入view,地理坐标,y轴偏移量InfoWindowm
InfoWindow=newInfoWindow(button,pt,-47);//显示InfoWindowmBaiduMap.showInfoWindow(mInfoWindow);9.地形图图层地形图图层(GroundOverlay),又可
叫做图片图层,即开发者可在地图的指定位置上添加图片。该图片可随地图的平移、缩放、旋转等操作做相应的变换。该图层是一种特殊的Overlay,它位于底图和底图标注层之间(即该图层不会遮挡地图标注信息)。在地图
中添加使用地形图覆盖物的方式如下://定义Ground的显示地理范围LatLngsouthwest=newLatLng(39.92235,116.380338);LatLngnortheast=newLatLn
g(39.947246,116.414977);LatLngBoundsbounds=newLatLngBounds.Builder().include(northeast).include(southwest).build();//定义Ground显示
的图片BitmapDescriptorbdGround=BitmapDescriptorFactory.fromResource(R.drawable.ground_overlay);//定义Ground覆盖物选项
OverlayOptionsooGround=newGroundOverlayOptions().positionFromBounds(bounds).image(bdGround).transparency(0.8f);//在地图中添加Ground覆盖物mB
aiduMap.addOverlay(ooGround);10.热力图功能热力图是用不同颜色的区块叠加在地图上描述人群分布、密度和变化趋势的一个产品,百度地图SDK将绘制热力图的能力为广大开发者开放,帮助开发者利用自有数据,构建属于
自己的热力图,提供丰富的展示效果。利用热力图功能构建自有数据热力图的方式如下:第一步,设置颜色变化://设置渐变颜色值int[]DEFAULT_GRADIENT_COLORS={Color.rgb(102,225,0),Color.rgb(255,0,0)};//设置渐变颜色起始值floa
t[]DEFAULT_GRADIENT_START_POINTS={0.2f,1f};//构造颜色渐变对象Gradientgradient=newGradient(DEFAULT_GRADIENT_COLOR
S,DEFAULT_GRADIENT_START_POINTS);第二步,准备数据://以下数据为随机生成地理位置点,开发者根据自己的实际业务,传入自有位置数据即可List<LatLng>randomList=newArrayList<LatLng>();Rando
mr=newRandom();for(inti=0;i<500;i++){//116.220000,39.780000116.570000,40.150000intrlat=r.nextInt(370000);intrlng=r.nextIn
t(370000);intlat=39780000+rlat;intlng=116220000+rlng;LatLngll=newLatLng(lat/1E6,lng/1E6);randomList.add(ll);}第三步,
添加、显示热力图://在大量热力图数据情况下,build过程相对较慢,建议放在新建线程实现HeatMapheatmap=newHeatMap.Builder().data(randomList).gradient(gradient
).build();//在地图上添加热力图mBaiduMap.addHeatMap(heatmap);第四步,删除热力图:heatmap.removeHeatMap();10.2定位百度地图Android定位SDK是利用设备当前的GPS信息(G
PS定位),基站信息(基站定位)和Wi-Fi信息(Wi-Fi定位)完成定位的。开发者在应用中成功集成百度定位SDK以后,既可以方便的通过定位SDK的接口向百度定位服务请求位置信息。定位SDK会根据设备当前的实
际情况(如是否开启GPS,是否连接网络,是否扫描到Wi-Fi信息等)生成定位依据,并根据开发者设置的实际定位策略(包括三种:高精度模式,低功耗模式,仅用设备模式)进行定位。//开启定位图层mBaiduMap.setMyLocationEnabled(true);//构造定位数据MyLocat
ionDatalocData=newMyLocationData.Builder().accuracy(location.getRadius())//此处设置开发者获取到的方向信息,顺时针0-360.direction(100).latit
ude(location.getLatitude()).longitude(location.getLongitude()).build();10.3导航1.SDK组成百度导航SDK由三部分组成:代码Jar包,资源包,so动态库。代码Jar包由Java源代码编译打包而成,提
供在线导航、线路规划、语音播报等功能。资源包由导航所需的配置数据、基础数据,以及导航功能所需的layout、drawable、string等资源打包而成。So动态库是由native代码编译而成,主要是地图、导航、路线规划、语音播报等功能的底层
实现。2.工程配置1)带TTS的SDK在新建的Android工程里的assets目录添加BaiduNaviSDK_Resource_vX_X_X.png和channel文件,在libs目录添加BaiduNaviSDK_vX_X
_X.jar、android_api_1.1_forsdk.jar、galaxy_mini.jar、galaxy_mini_lbs.jar、lbsCoreSDK.jar,在libs/armeabi目录添加libapp_BaiduNaviApplib
_vX_X.so、libejTTS.so、libCNPackage.so、liblocnaviSDK.so。2)不带TTS的SDK在新建的Android工程里的assets目录添加BaiduNaviSDK_Resource_vX_X_X.png和channel文件,在libs目录
添加BaiduNaviSDK_vX_X_X.jar、android_api_1.1_forsdk.jar、galaxy_mini.jar、galaxy_mini_lbs.jar、lbsCoreSDK.
jar,在libs/armeabi目录添加libapp_BaiduNaviApplib_vX_X.so、liblocnaviSDK.so。3)注意事项对于android_api_1.1_forsdk.jar,它是
百度移动统计SDK的部分,如果开发者同样也使用了百度移动统计SDK,并且添加android_api_1.1_forsdk.jar到工程时候发生代码冲突,此时应该把android_api_1.1_forsdk.jar去除掉。3.
一键导航百度导航SDK提供便捷的方式让开发者快速地发起导航:第一步:创建并配置工程(具体方法参见工程配置部分的介绍);第二步:在Manifest中添加使用权限及Android版本支持;导航需要的权限如下
:<!--使用导航功能所需权限--><uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/><uses-permissionandroid:name="android.permission.IN
TERNET"/><uses-permissionandroid:name="android.permission.ACCES_MOCK_LOCATION"/><uses-permissionandroid:name="android.
permission.ACCESS_FINE_LOCATION"/><uses-permissionandroid:name="com.android.launcher.permission.READ_SETTINGS/><uses-pe
rmissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/><uses-permissionandroid:name="android.permission.BROADCAST_STICKY"/><use
s-permissionandroid:name="android.permission.WRITE_SETTINGS"/><uses-permissionandroid:name="android.permission.PROCESS_OUTGOING_
CALLS"/><uses-permissionandroid:name="android.permission.READ_PHONE_STATE"/>注意在AndroidManifest.xml中application标签下添加如下代码,“com
.baidu.lbsapi.API_KEY”中放入开发者申请的的APIKey。<meta-dataandroid:name="com.baidu.lbsapi.API_KEY"android:value="bEDE2Ut8zsrZGa4p9caq4LNU"/><se
rviceandroid:name="com.baidu.navi.location.f"android:enabled="true"/>第三步:初始化导航引擎:在应用的入口activity中privatebooleanmIsE
ngineInitSuccess=false;privateNaviEngineInitListenermNaviEngineInitListener=newNaviEngineInitListener(){pu
blicvoidengineInitSuccess(){//导航初始化是异步的,需要一小段时间,以这个标志来识别引擎是否//初始化成功,为true时候才能发起导航mIsEngineInitSuccess=true;}publicvoidengineInitStart(){}publicv
oidengineInitFail(){}};privateStringgetSdcardDir(){if(Environment.getExternalStorageState().equalsIgnoreCase(E
nvironment.MEDIA_MOUNTED)){returnEnvironment.getExternalStorageDirectory().toString();}returnnull;}publicvoidonCr
eate(BundlesaveInstance){super.onCreate(saveInstance);//初始化导航引擎BaiduNaviManager.getInstance().initEngine(this,ge
tSdcardDir(),mNaviEngineInitListener,"我的key",null);}第四步:配置导航页activity再新建一个activity,在Manifest中加入导航页的声明<activityandroid:name=".BNavigato
rActivity"android:configChanges="orientation|screenSize|keyboard|keyboardHidden"/>初始化导航页activity<sourcelang="java">//导航监
听器privateIBNavigatorListenermBNavigatorListener=newIBNavigatorListener(){@OverridepublicvoidonYawingRequestSu
ccess(){//TODO偏航请求成功}@OverridepublicvoidonYawingRequestStart(){//TODO开始偏航请求}@OverridepublicvoidonPageJump(intjumpTiming,Objectarg){//TOD
O页面跳转回调if(IBNavigatorListener.PAGE_JUMP_WHEN_GUIDE_END==jumpTiming){finish();}elseif(IBNavigatorListener.PAGE_JUMP_WHEN_
ROUTE_PLAN_FAIL=jumpTiming){finish();}}@OverridepublicvoidnotifyGPSStatusData(intarg0){//TODOAuto-gener
atedmethodstub}@OverridepublicvoidnotifyLoacteData(LocDataarg0){//TODOAuto-generatedmethodstub}@Overridepublicvoidnotify
NmeaData(Stringarg0){//TODOAuto-generatedmethodstub}@OverridepublicvoidnotifySensorData(SensorDataarg0){
//TODOAuto-generatedmethodstub}@OverridepublicvoidnotifyStartNav(){//TODOAuto-generatedmethodstubBaiduNaviManager.getInstance().dismissWaitProgres
sDialog();}@OverridepublicvoidnotifyViewModeChanged(intarg0){//TODOAuto-generatedmethodstub}};publicvoidonCr
eate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//创建NmapViewMapGLSurfaceViewnMapView=Ba
iduNaviManager.getInstance().createNMapView(this);//创建导航视图ViewnavigatorView=BNavigator.getInstance().init(BNavigatorAct
ivity.this,getIntent().getExtras(),nMapView);//填充视图setContentView(navigatorView);BNavigator.getInstance().setListener(mBN
avigatorListener);BNavigator.getInstance().startNav();•//初始化TTS.开发者也可以使用独立TTS模块,不用使用导航SDK提供的TTSBNTTS
Player.initPlayer();//设置TTS播放回调BNavigatorTTSPlayer.setTTSPlayerListener(newIBNTTSPlayerListener(){@OverridepublicintplayTTSTex
t(Stringarg0,intarg1){//开发者可以使用其他TTS的APIreturnBNTTSPlayer.playTTSText(arg0,arg1);}BNRoutePlaner.getInstance().setObserve
r(newRoutePlanObserver(this,newIJumpToDownloadListener(){@OverridepublicvoidonJumpToDownloadOfflineData(){//TODOAuto-gener
atedmethodstub}}));}重写如下方法,管理API:@OverridepublicvoidonResume(){BNavigator.getInstance().resume();super.onResume();BNMapController.get
Instance().onResume();};@OverridepublicvoidonPause(){BNavigator.getInstance().pause();super.onPause();BNMapController.getInst
ance().onPause();}@OverridepublicvoidonConfigurationChanged(ConfigurationnewConfig){BNavigator.getInstance().onConfigurationChanged(n
ewConfig);super.onConfigurationChanged(newConfig);}publicvoidonBackPressed(){BNavigator.getInstance().o
nBackPressed();}@OverridepublicvoidonDestroy(){BNavigator.destory();BNRoutePlaner.getInstance().setObserver(null);super.onDestro
y();}第五步:在导航初始化成功后,在第三个activityRouteGuideDemo中输入起始点,发起导航BaiduNaviManager.getInstance().launchNavigator(this,40.0508
7,116.30142,"百度大厦",39.90882,116.39750,"北京天安门",NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME,//算路方式true,//真实导航BaiduNaviManager.STRATEGY_FORCE_ONLINE_
PRIORITY,//在离线策略newOnStartNavigationListener(){//跳转监听@OverridepublicvoidonJumpToNavigator(BundleconfigParams){Intentintent=newI
ntent(RouteGuideDemo.this,BNavigatorActivity.class);intent.putExtras(configParams);startActivity(intent);}@Overridepublic
voidonJumpToDownloader(){}});此外,还可以通过指定不同坐标类型的导航起终点来发起一键导航,privatevoidlaunchNavigator2(){BNaviPointstartPoint=newBNaviPoint(116.3
07854,40.055878,"百度大厦",BNaviPoint.CoordinateType.BD09_MC);BNaviPointendPoint=newBNaviPoint(116.403875,39.915168,"北京天安门",BNaviPoint.Coordinat
eType.BD09_MC);BaiduNaviManager.getInstance().launchNavigator(this,startPoint,//起点(可指定坐标系)endPoint,//终点(可指定坐标系)NE_RoutePlan_Mode.
ROUTE_PLAN_MOD_MIN_TIME,//算路方式true,//真实导航BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY,newOnStartNavigationListener(){…}//跳转
监听);}或者增加一个或者多个途经点(最多三个),根据导航点列表来发起一键导航,privatevoidlaunchNavigatorViaPoints(){List<BNaviPoint>points=newArrayList<BNaviPoint>();points.add(mSta
rtPoint);points.addAll(mViaPoints);points.add(mEndPoint);BaiduNaviManager.getInstance().launchNavigator(this,points,//路
线点列表NE_RoutePlan_Mode.ROUTE_PLAN_MOD_MIN_TIME,//算路方式true,//真实导航BaiduNaviManager.STRATEGY_FORCE_ONLINE_PRIORITY,newOnStartNavigationLis
tener(){…}//跳转监听);}10.4实训项目:实现基本地图功能和公交线路查询10.4.1任务说明1.基本地图功能创建一张百度地图并管理地图的生命周期。2.地图操作功能介绍地图基本控制方法。3.UI控制功能介绍
开关手势功能和显示隐藏UI控件。4.自定义绘制功能介绍自定义绘制点、线、多边形、圆等几何图形和文字。5.公交线路查询功能介绍查询公交线路功能10.4.2代码实现•1.主要程序结构。2.DemoApplicationpublicclassDemoApplication
extendsApplication{@OverridepublicvoidonCreate(){super.onCreate();//在使用SDK各组间之前初始化context信息,传入ApplicationContextSDKInitializer.
initialize(this);}}3.BMapApiDemoMainpublicclassBMapApiDemoMainextendsActivity{privatestaticfinalStringLTAG=BMapApiDemoMain.
class.getSimpleName();//构造广播监听类,监听SDKkey验证以及网络异常广播publicclassSDKReceiverextendsBroadcastReceiver{publicvoidonReceive(Contextcontext,
Intentintent){Strings=intent.getAction();Log.d(LTAG,"action:"+s);TextViewtext=(TextView)findViewById(R.id.text_Info);text.setTextCol
or(Color.RED);if(s.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){text.setText("key验证出错!请在AndroidManifest.x
ml文件中检查key设置");}elseif(s.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){text.setText("网络出错");}}}privateSDKReceivermReceiver;@Over
ridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main)
;TextViewtext=(TextView)findViewById(R.id.text_Info);text.setTextColor(Color.YELLOW);text.setText("欢迎使用百度地图AndroidSD
Kv"+VersionInfo.getApiVersion());ListViewmListView=(ListView)findViewById(R.id.listView);//添加ListItem,设置事件响应mListView.
setAdapter(newDemoListAdapter());mListView.setOnItemClickListener(newOnItemClickListener(){publicvoidonItemClick(AdapterView<?>arg0
,Viewv,intindex,longarg3){onListItemClick(index);}});//注册SDK广播监听者IntentFilteriFilter=newIntentFilter();iFilter.addAction(SDKInitializer.SDK
_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);iFilter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);mReceiver=newSD
KReceiver();registerReceiver(mReceiver,iFilter);}voidonListItemClick(intindex){Intentintent=null;intent=newIntent(BMapApiDemoMai
n.this,demos[index].demoClass);this.startActivity(intent);}privatestaticfinalDemoInfo[]demos={newDemoInfo(R.string.de
mo_title_basemap,R.string.demo_desc_basemap,BaseMapDemo.classnewDemoInfo(R.string.demo_title_map_fragment,R.string.demo_desc_map_fr
agment,MapFragmentDemo.class),newDemoInfo(R.string.demo_title_multimap,R.string.demo_desc_multimap,Mu
ltiMapViewDemo.class),newDemoInfo(R.string.demo_title_layers,R.string.demo_desc_layers,LayersDemo.class),newDemoInfo(R.string.demo_title_contr
ol,R.string.demo_desc_control,MapControlDemo.class),@OverrideprotectedvoidonResume(){super.onResume();}@OverrideprotectedvoidonDestroy(
){super.onDestroy();//取消监听SDK广播unregisterReceiver(mReceiver);}privateclassDemoListAdapterextendsBaseAdapter{publicDemoLis
tAdapter(){super();}@OverridepublicViewgetView(intindex,ViewconvertView,ViewGroupparent){convertView=View.inflate(BMapA
piDemoMain.this,R.layout.demo_info_item,null);TextViewtitle=(TextView)convertView.findViewById(R.id.title);TextViewdesc=(TextView)convertV
iew.findViewById(R.id.desc);title.setText(demos[index].title);desc.setText(demos[index].desc);if(index>=14&&index<=17){title.set
TextColor(Color.YELLOW);}returnconvertView;}@OverridepublicintgetCount(){returndemos.length;}@Overridepubl
icObjectgetItem(intindex){returndemos[index];}@OverridepubliclonggetItemId(intid){returnid;}}privatestaticclassDemoInfo{privatefinalinttitle;priva
tefinalintdesc;privatefinalClass<?extendsandroid.app.Activity>demoClass;publicDemoInfo(inttitle,intdesc,Class<?extendsandroid.app.Activity>demoClass)
{this.title=title;this.desc=desc;this.demoClass=demoClass;}}}4.BusLineSearchDemo/*此demo用来展示如何进行公交线路详情检索,并使用RouteOv
erlay在地图上绘制同时展示如何浏览路线节点并弹出泡泡*/publicclassBusLineSearchDemoextendsFragmentActivityimplementsOnGetPoiSearchResultListener
,OnGetBusLineSearchResultListener,BaiduMap.OnMapClickListener{privateButtonmBtnPre=null;//上一个节点privateButtonmBtnNext=nu
ll;//下一个节点privateintnodeIndex=-2;//节点索引供浏览节点时使用privateBusLineResultroute=null;//保存驾车/步行路线数据的变量,供浏览节点时使用privateList
<String>busLineIDList=null;privateintbusLineIndex=0;//搜索相关privatePoiSearchmSearch=null;//搜索模块,也可去掉地图模块独立使用privateBusLineSearchmBu
sLineSearch=null;privateBaiduMapmBaiduMap=null;protectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceS
tate);setContentView(R.layout.activity_busline);CharSequencetitleLable="公交线路查询功能";setTitle(titleLable);mBtnPre=(Button)findViewById(R.id.pre);mBt
nNext=(Button)findViewById(R.id.next);mBtnPre.setVisibility(View.INVISIBLE);mBtnNext.setVisibility(View.INVISIBLE);mBaiduMap=((SupportMap
Fragment)getSupportFragmentManager().findFragmentById(R.id.bmapView)).getBaiduMap();mBaiduMap.setOnMapClickListener(this);mSear
ch=PoiSearch.newInstance();mSearch.setOnGetPoiSearchResultListener(this);mBusLineSearch=BusLineSearch.ne
wInstance();mBusLineSearch.setOnGetBusLineSearchResultListener(this);busLineIDList=newArrayList<String>();}/*发
起检索@paramv*/publicvoidsearchButtonProcess(Viewv){busLineIDList.clear();busLineIndex=0;mBtnPre.setVisibility(View.INVISIBLE);mBtnNext.s
etVisibility(View.INVISIBLE);EditTexteditCity=(EditText)findViewById(R.id.city);EditTexteditSearchKey=(EditText)fin
dViewById(R.id.searchkey);//发起poi检索,从得到所有poi中找到公交线路类型的poi,再使用该poi的uid进行公交详情搜索mSearch.searchInCity((new
PoiCitySearchOption()).city(editCity.getText().toString()).keyword(editSearchKey.getText().toString()));}publicvoidSearchN
extBusline(Viewv){if(busLineIndex>=busLineIDList.size()){busLineIndex=0;}if(busLineIndex>=0&&busLineIndex<busLineID
List.size()&&busLineIDList.size()>0){mBusLineSearch.searchBusLine((newBusLineSearchOption().city(((EditText)findViewById(R.id.city)).getText().to
String()).uid(busLineIDList.get(busLineIndex))));busLineIndex++;}}/*节点浏览示例@paramv*/publicvoidnodeClick(Viewv){if(nodeIndex<-1||route==null||nodeInd
ex>=route.getStations().size())return;TextViewpopupText=newTextView(this);popupText.setBackgroundResource(R.drawab
le.popup);popupText.setTextColor(0xff000000);//上一个节点if(mBtnPre.equals(v)&&nodeIndex>0){//索引减nodeIndex--
;}//下一个节点if(mBtnNext.equals(v)&&nodeIndex<(route.getStations().size()-1)){//索引加nodeIndex++;}//移动到指定索引的坐标mBaiduMap.setMapStatus(MapStatusUpdateFac
tory.newLatLng(oute.getStations().get(nodeIndex).getLocation()));//弹出泡泡popupText.setText(route.getStations().get(no
deIndex).getTitle());mBaiduMap.showInfoWindow(newInfoWindow(popupText,route.getStations().get(nodeIndex).getLocation(),null));}@Overrideprotec
tedvoidonPause(){super.onPause();}@OverrideprotectedvoidonResume(){super.onResume();}@OverrideprotectedvoidonDestr
oy(){mSearch.destroy();mBusLineSearch.destroy();super.onDestroy();}@OverridepublicvoidonGetBusLineResul
t(BusLineResultresult){if(result==null||result.error!=SearchResult.ERRORNO.NO_ERROR){Toast.makeText(BusLineSearchDemo.this,"抱歉,未找到结果",Toa
st.LENGTH_LONG).show();return;}mBaiduMap.clear();route=result;nodeIndex=-1;BusLineOverlayoverlay=newBusLine
Overlay(mBaiduMap);mBaiduMap.setOnMarkerClickListener(overlay);overlay.setData(result);overlay.addToMap();overlay.zoomToSpan();mBtnPre.setVisibi
lity(View.VISIBLE);mBtnNext.setVisibility(View.VISIBLE);Toast.makeText(BusLineSearchDemo.this,result.getBusLi
neName(),Toast.LENGTH_SHORT).show();}@OverridepublicvoidonGetPoiResult(PoiResultresult){if(result==null||result.error!=SearchResu
lt.ERRORNO.NO_ERROR){Toast.makeText(BusLineSearchDemo.this,"抱歉,未找到结果",Toast.LENGTH_LONG).show();return;}//遍历所有poi,找到类型为公交线路的poibusLineID
List.clear();for(PoiInfopoi:result.getAllPoi()){if(poi.type==PoiInfo.POITYPE.BUS_LINE||poi.type==PoiInfo.POITYP
E.SUBWAY_LINE){busLineIDList.add(poi.uid);}}SearchNextBusline(null);route=null;}@OverridepublicvoidonGetPoiDetailResult(Poi
DetailResultresult){}@OverridepublicvoidonMapClick(LatLngpoint){mBaiduMap.hideInfoWindow();}@OverridepublicbooleanonMapPoiCli
ck(MapPoipoi){returnfalse;}}5.UISettingDemo//演示地图UI控制功能publicclassUISettingDemoextendsActivity{//MapView是地图主控件privateMapViewmMapVie
w;privateBaiduMapmBaiduMap;privateUiSettingsmUiSettings;@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);
setContentView(R.layout.activity_uisetting);mMapView=(MapView)findViewById(R.id.bmapView);mBaiduMap=mMapVi
ew.getMap();mUiSettings=mBaiduMap.getUiSettings();MapStatusms=newMapStatus.Builder().overlook(-30).build();MapStatusUpdateu=MapStatusUpd
ateFactory.newMapStatus(ms);mBaiduMap.animateMapStatus(u,1000);}*是否启用缩放手势*@paramvpublicvoidsetZoomEnable(Vi
ewv){mUiSettings.setZoomGesturesEnabled(((CheckBox)v).isChecked());}/*是否启用平移手势*@paramv*/publicvoidsetScrollEnable(Viewv){mUiSettings.setScroll
GesturesEnabled(((CheckBox)v).isChecked());}/*是否启用旋转手势*@paramv*/publicvoidsetRotateEnable(Viewv){mUiSetti
ngs.setRotateGesturesEnabled(((CheckBox)v).isChecked());}*是否启用俯视手势*@paramvpublicvoidsetOverlookEnable(Viewv){mUi
Settings.setOverlookingGesturesEnabled(((CheckBox)v).isChecked());}*是否启用指南针图*@paramv*/publicvoidsetCompassEnable(Viewv){m
UiSettings.setCompassEnabled(((CheckBox)v).isChecked());}@OverrideprotectedvoidonPause(){//MapView的生命周期与A
ctivity同步,当activity挂起时需调用MapView.onPause()mMapView.onPause();super.onPause();}@OverrideprotectedvoidonResume(){//Ma
pView的生命周期与Activity同步,当activity恢复时需调用MapView.onResume()mMapView.onResume();super.onResume();}@OverrideprotectedvoidonDestroy(){//MapView
的生命周期与Activity同步,当activity销毁时需调用MapView.destroy()mMapView.onDestroy();super.onDestroy();}}6.OverlayDemo/*演示覆盖物的用法*/publiccl
assOverlayDemoextendsActivity{/***MapView是地图主控件*/privateMapViewmMapView;privateBaiduMapmBaiduMap;privateMarkerm
MarkerA;privateMarke;rmMarkerB;privateMarkermMarkerC;privateMarkermMarkerD;privateInfoWindowmInfoWind
ow//初始化全局bitmap信息,不用时及时recycleBitmapDescriptorbdA=BitmapDescriptorFactory.fromResource(R.drawable.icon_marka);BitmapDescriptorbdB=
BitmapDescriptorFactory.fromResource(R.drawable.icon_markb);BitmapDescriptorbdC=BitmapDescriptorFactory.fromResource(R.drawable.icon_m
arkc);BitmapDescriptorbdD=BitmapDescriptorFactory.fromResource(R.drawable.icon_markd);BitmapDescriptorbd
=BitmapDescriptorFactory.fromResource(R.drawable.icon_gcoding);BitmapDescriptorbdGround=BitmapDescriptorFactoryf(dbldl)@Override
publicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.ac
tivity_overlay);mMapView=(MapView)findViewById(R.id.bmapView);mBaiduMap=mMapView.getMap();MapStatusUpdatemsu=MapStatusUpdateFactory.zoomTo(14
.0f);mBaiduMap.setMapStatus(msu);initOverlay();mBaiduMap.setOnMarkerClickListener(newOnMarkerClickListener(){publicbooleanonMarkerClick
(finalMarkermarker){Buttonbutton=newButton(getApplicationContext());button.setBackgroundResource(R.drawable.popup);finalLatLngll=marker.getP
osition();Pointp=mBaiduMap.getProjection().toScreenLocation(ll);p.y-=47;LatLngllInfo=mBaiduMap.getProjection().fromScreenL
ocation(p);OnInfoWindowClickListenerlistener=null;if(marker==mMarkerA||marker==mMarkerD){button.setText("更改位置");listener=newOnInfoWindowClick
Listener(){publicvoidonInfoWindowClick(){LatLngllNew=newLatLng(ll.latitude+0.005,ll.longitude+0.005);marker.setPositio
n(llNew);mBaiduMap.hideInfoWindow();}};}elseif(marker==mMarkerB){button.setText("更改图标");listener=newO
nInfoWindowClickListener(){publicvoidonInfoWindowClick(){marker.setIcon(bd);mBaiduMap.hideInfoWindow();}};}elseif(marker==mMarker
C){button.setText("删除");listener=newOnInfoWindowClickListener(){publicvoidonInfoWindowClick(){marker.rem
ove();mBaiduMap.hideInfoWindow();}};}mInfoWindow=newInfoWindow(button,llInfo,listener);mBaiduMap.showInfoWindow(mInfoWindow)
;returntrue;}});}publicvoidinitOverlay(){//addmarkeroverlayLatLngllA=newLatLng(39.963175,116.400244);LatLngllB=newLatLn
g(39.942821,116.369199);LatLngllC=newLatLng(39.939723,116.425541);LatLngllD=newLatLng(39.906965,116.401394);OverlayOption
sooA=newMarkerOptions().position(llA).icon(bdA).zIndex(9).draggable(true);mMarkerA=(Marker)(mBaiduMap.add
Overlay(ooA));OverlayOptionsooB=newMarkerOptions().position(llB).icon(bdB).zIndex(5);mMarkerB=(Marker)(mBaiduMap.addOverlay(ooB));
OverlayOptionsooC=newMarkerOptions().position(llC).icon(bdC).perspective(false).anchor(0.5f,0.5f).rotate(30).zIndex(7);mMarkerC=(Marker)(mB
aiduMap.addOverlay(ooC));OverlayOptionsooD=newMarkerOptions().position(llD).icon(bdD).perspective(false).zIndex(7);mMarkerD=(Mark
er)(mBaiduMap.addOverlay(ooD));/addgroundoverlayLatLngsouthwest=newLatLng(39.92235,116.380338);LatLngnorthe
ast=newLatLng(39.947246,116.414977);LatLngBoundsbounds=newLatLngBounds.Builder().include(northeast).in
clude(southwest).build();OverlayOptionsooGround=newGroundOverlayOptions().positionFromBounds(bounds).image(bdGround).transparency(0.8f)
;mBaiduMap.addOverlay(ooGround);MapStatusUpdateu=MapStatusUpdateFactory.newLatLng(bounds.getCenter());mBai
duMap.setMapStatus(u);mBaiduMap.setOnMarkerDragListener(newOnMarkerDragListener(){publicvoidonMarkerDrag(Markermarker){}publicvoidonMarkerDragEnd(
Markermarker){Toast.makeText(OverlayDemo.this,"拖拽结束,新位置:"+marker.getPosition().latitude+","+marker.getPosition().longitude,Toast.LENGTH_LONG).sh
ow();}publicvoidonMarkerDragStart(Markermarker){}});}*清除所有Overlay*@paramview*/publicvoidclearOverlay(Viewview){mBaiduMap.clear
();}/***重新添加Overlay*@paramview*/publicvoidresetOverlay(Viewview){clearOverlay(null);initOverlay();}@OverrideprotectedvoidonPause(){//MapView的生命周期与Ac
tivity同步,当activity挂起时需调用MapView.onPause()mMapView.onPause();super.onPause();}@OverrideprotectedvoidonResume(){//MapView的生命周期与Activit
y同步,当activity恢复时需调用MapView.onResume()mMapView.onResume();super.onResume();}@OverrideprotectedvoidonDestroy(){//MapView的生命周期与Activity同步,当activity
销毁时需调用MapView.destroy()mMapView.onDestroy();super.onDestroy();//回收bitmap资源bdA.recycle();bdB.recycle();bdC.recycle();bdD.recycle();b
d.recycle();bdGround.recycle();}}