百度地图开发总结
1. 怎么接入百度SDK,百度文档说得很明白,我就不说了。
2. 注意
1)初始化的时候,上下文用全局的,即ApplicationContext。
2)要在Activity的相应生命周期方法里调用MapView对应的生命周期方法。
3. 百度地图的核心类:
1)SDKInitializer 百度地图初始化类
》》注册网络错误、key验证错误的广播
这样一样百度地图崩溃了,或者出异常了,就知道有没有可能是这一块出现了问题。
privatevoidinitSDK(){SDKInitializer.initialize(getApplicationContext());//注册网络错误和KEY验证失败的广播IntentFilterfilter=newIntentFilter();filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR);filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR);registerReceiver(newMyReceiver(),filter);}classMyReceiverextendsBroadcastReceiver{@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();if(action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){Toast.makeText(getApplicationContext(),"网络错误",0).show();}elseif(action.equals(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR)){Toast.makeText(getApplicationContext(),"key验证失败",0).show();}}}
2)MapView 显示百度地图的组件
》》设置绽放按钮显示与隐藏
mMapView.showZoomControls(false);
》》设置比例尺显示与隐藏
mMapView.showScaleControl(false);
》》替换百度地图logo
将"baidumapapi_v3_3_0.jar"复制到桌面,然后解压,将assets目录下的logo_h,logo_l
用自己的图片替换掉。然后再将jar包拷贝回去。
可以做addView操作,而BaiduMap是addOverlay()添加覆盖物。
3)BaiduMap 控制器 通过MapView.getMap()获取
》》设置地图的状态map.setMapStatus(MapStatusUpdate)
通过MapStatusUpdateFactory.方法()可以得到参数
//设置地图的绽放级别
MapStatusUpdatezoom=MapStatusUpdateFactory.zoomTo(18);map.setMapStatus(zoom);
//设置中心点,注意LatLng的构造函数latitude,longtitude,分别为纬度、经度,在百度地
图上查的坐标与这个正好相反的。
map.setMapStatus(MapStatusUpdateFactory.newLatLng(newLatLng(40.050513,116.30361)));
Android百度地图默认位置中心点设置
http://blog.csdn.net/xyy410874116/article/details/32094157
//旋转百度地图(以中心点)
//得到地图之前的状态和角度MapStatusmapStatus=map.getMapStatus();floatpreRotate=mapStatus.rotate;//利用MapStatus.Builder静态内部类来构造新的状态,对之前状态的角度累加一个值。Builderbuilder=newMapStatus.Builder();MapStatusnewStatus=builder.rotate(preRotate+30).build();//将新的状态设置给百度地图map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus));
//翻转百度地图(以直线),改变俯角,也就是看百度地图的角度。
MapStatusmapStatus2=map.getMapStatus();floatpreOverlook=mapStatus2.overlook;Builderbuilder2=newMapStatus.Builder();MapStatusnewStatus2=builder2.overlook(preOverlook-5).build();map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus2));
//移动百度地图到指定中心点
animateMapStatus方法有重载形式,可以指定动画的时长。(默认300ms)
MapStatusUpdatestatusUpdate=MapStatusUpdateFactory.newLatLng(LatLng(39.979982,116.309258));map.animateMapStatus(statusUpdate);
》》更改底图和添加交通图图层
//底图设置为默认的
map.setMapType(BaiduMap.MAP_TYPE_NORMAL);
//底图设置成卫星图
map.setMapType(BaiduMap.MAP_TYPE_SATELLITE);
//显示交通图图层
map.setTrafficEnabled(true);
4)OverlayOptions 本地覆盖物的抽象基类
OverlavOptions关于覆盖物的操作:
1)创建覆盖物
2)给覆盖物添加数据
一般都要设置坐标(覆盖物具体摆在哪儿)
其它的。。。
3)把覆盖物添加到地图上
例1:添加圆形覆盖物CircleOptions
//创建圆形覆盖物CircleOptionsoptions=newCircleOptions();//设置数据//圆心坐标options.center(newLatLng(40.050513,116.30361))//圆半径.radius(1000)//填充颜色.fillColor(Color.BLUE)//圆的边框宽度和颜色.stroke(newStroke(5,Color.RED));//将覆盖物添加到地图上map.addOverlay(options);
效果如下图:
例2:添加文字覆盖物 TextOptions
TextOptionsoptions=newTextOptions();options.fontColor(Color.BLUE).fontSize(100).bgColor(0x3300ff00).rotate(30).typeface(Typeface.SERIF).position(newLatLng(40.050513,116.30361)).text("我在北京");map.addOverlay(options);
效果如下图:
通过上面的两个例子,发现,文字(包括百度地图本身的文字)并不会随着地图一起缩放,
但是圆形覆盖物会随着地图一起缩放。
例3:添加标记覆盖物 MarkerOptions
MarkerOptionsoptions=newMarkerOptions();BitmapDescriptoricon;options.position(testPos).title("我在北京")//是否可拖拽.draggable(true)//图标(工厂创建).icon(BitmapDescriptorFactory.fromResource(R.drawable.eat_icon));map.addOverlay(options);
作为一个注重产品性能的程序员,应该在设置icon的时候创建一个BitmapDescriptor的引用,
在onDestroy里回收资源
//释放图片资源bitmapDescriptor.recycle();
4)OverlavManager 搜索覆盖物的抽象基类
显示和管理多个Overlay的基类
|--本地搜索覆盖物:PoiOverlay
|--驾车路线覆盖物:DrivingRouteOverlay
|--步行路线覆盖物:WalkingRouteOverlay
|--换乘路线覆盖物:TransitOverlay
|--公交路线覆盖物:BusLineOverlay
百度地图移动版API集成搜索服务包括
|---位置检索、周边检索、范围检索 (点搜索)
使用PoiSearch和OnGetPoiSearchResultListener核心类
|---公交检索、驾乘检索、步行检索 (线搜索)
使用RoutePlanSearch和OnGetRoutePlanResultListener核心类
POI(Point of Interest兴趣点)搜索有三种方式
根据范围和检索词发起范围检索searchInBound
周边检索searchNearby
城市poi检索searchInCity
poi详细信息检索 searchPoiDetail
结果的展示: PoiOverlay
例1:搜索指定范围内的加油站(矩形区域搜索)
privatevoidsearch(){PoiSearchsearch=PoiSearch.newInstance();search.setOnGetPoiSearchResultListener(newMyOnGetPoiSearchResultListener());//范围内搜索PoiBoundSearchOptionboundOption=newPoiBoundSearchOption();//搜索关键字boundOption.keyword("加油站");//搜索范围LatLngBoundslatLngBounds=newLatLngBounds.Builder().include(newLatLng(39.98,116.310)).include(newLatLng(39.96,116.30)).build();boundOption.bound(latLngBounds);search.searchInBound(boundOption);}classMyOnGetPoiSearchResultListenerimplementsOnGetPoiSearchResultListener{@OverridepublicvoidonGetPoiDetailResult(PoiDetailResultarg0){//详情搜索在此处理结果}@OverridepublicvoidonGetPoiResult(PoiResultresult){if(result==null||result.error==SearchResult.ERRORNO.RESULT_NOT_FOUND){return;//无搜索结果}//找到搜索结果//创建覆盖物MyOverlayoverlay=newMyOverlay(map);//++++++++监听覆盖物的点击事件++++++++++map.setOnMarkerClickListener(overlay);//为覆盖物绑定数据overlay.setData(result);//将覆盖物添加到地图上overlay.addToMap();//显示全部的搜索结果overlay.zoomToSpan();}}//自定义一个实现了点击事件的覆盖物classMyOverlayextendsPoiOverlay{publicMyOverlay(BaiduMaparg0){super(arg0);}@OverridepublicbooleanonPoiClick(intindex){PoiResultresult=getPoiResult();//在搜索集中找到被点击的覆盖物的信息PoiInfopoiInfo=result.getAllPoi().get(index);Toast.makeText(getApplicationContext(),poiInfo.address,0).show();returnsuper.onPoiClick(index);}}
例2:搜索周边的地铁站(圆形区域搜索)
原理和加油站的搜索一下,只是PoiSearch调用的方法及方法的参数不同,监听者不用改变。
可以进行共用。
PoiNearbySearchOptionnearbySearchOption=newPoiNearbySearchOption();nearbySearchOption.keyword("地铁站").radius(1000).location(testPos);search.searchNearby(nearbySearchOption);
上面两个例子,MyOverlay在监听点击的时候,得到了覆盖物的PoiInfo,通过PoiInfo又可以得
到uid,根据uid就可以发起详情搜索:
//详情搜索protectedvoiddetailSearch(PoiInfopoiInfo){PoiDetailSearchOptiondetailSearchOption=newPoiDetailSearchOption();detailSearchOption.poiUid(poiInfo.uid);search.searchPoiDetail(detailSearchOption);}
监听详情搜索结果
@OverridepublicvoidonGetPoiDetailResult(PoiDetailResultresult){if(result==null||result.error==SearchResult.ERRORNO.RESULT_NOT_FOUND){return;}Toast.makeText(getApplicationContext(),"电话:"+result.getTelephone(),0).show();}
例3:城市搜索
//城市搜索privatevoidcitySearch(){PoiCitySearchOptioncitySearchOption=newPoiCitySearchOption();citySearchOption.city("北京").keyword("武术馆").pageNum(pageIndex++);//分布显示数据search.searchInCity(citySearchOption);}
注意分页显示数据的时候,要清除之前的数据,在onGetPoiResult方法里:
//清除数据,防止分布的时候显示前一页的数据。map.clear();
4. 百度地图高级开发:
案例1:泡泡提示信息
第1步:初始化PopView,并添加到MapView当中,隐藏PopView
privatevoidinitPop(){pop=View.inflate(getApplicationContext(),R.layout.mark_item,null);tip=(TextView)pop.findViewById(R.id.tv);MapViewLayoutParamsparams=newMapViewLayoutParams.Builder().layoutMode(ELayoutMode.mapMode).position(testPos).width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).build();mMapView.addView(pop,params);pop.setVisibility(View.INVISIBLE);}
第2步:为BaiduMap添加Marker覆盖物的点击监听
map.setOnMarkerClickListener(this);
第3步:处理点击事件
将PopView定位到Marker的位置、获得Marker的信息并展示到PopView上去。
@OverridepublicbooleanonMarkerClick(Markermarker){MapViewLayoutParamsparams=newMapViewLayoutParams.Builder().layoutMode(ELayoutMode.mapMode).position(marker.getPosition()).width(MapViewLayoutParams.WRAP_CONTENT).height(MapViewLayoutParams.WRAP_CONTENT).build();mMapView.updateViewLayout(pop,params);pop.setVisibility(View.VISIBLE);tip.setText(marker.getTitle());returntrue;}
效果图如下:
4. 百度地图定位SDK使用:
上面讲的的这些,都是地图SDK的开发。下面要说的就是定位SDK使用,就是定位手机当前的
位置。照着百度定位SDK开发文档做,但是代码需要有一定的改动。
代码如下:
publicclassLocateActivityextendsBaseActivity{publicLocationClientmLocationClient=null;publicBDLocationListenermyListener=newMyLocationListener();@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);mLocationClient=newLocationClient(getApplicationContext());//声明LocationClient类mLocationClient.registerLocationListener(myListener);//注册监听函数initLocation();}@OverrideprotectedvoidonStart(){super.onStart();mLocationClient.start();}@OverrideprotectedvoidonStop(){super.onStop();mLocationClient.stop();}privatevoidinitLocation(){LocationClientOptionoption=newLocationClientOption();option.setLocationMode(LocationMode.Hight_Accuracy);//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系intspan=1000;option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要option.setOpenGps(true);//可选,默认false,设置是否使用gpsoption.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集mLocationClient.setLocOption(option);//设置自己的定位图标BitmapDescriptoricon=BitmapDescriptorFactory.fromResource(R.drawable.icon_geo);MyLocationConfigurationconfiguration=newMyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS,true,icon);map.setMyLocationConfigeration(configuration);}publicclassMyLocationListenerimplementsBDLocationListener{@OverridepublicvoidonReceiveLocation(BDLocationlocation){//ReceiveLocationBuilderbuilder=newMyLocationData.Builder();builder.latitude(location.getLatitude())//纬度.longitude(location.getLongitude());//经度map.setMyLocationEnabled(true);//允许定位图层map.setMyLocationData(builder.build());//设置定位数据}}}
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。