1. 怎么接入百度SDK,百度文档说得很明白,我就不说了。
创新互联是专业的商水网站建设公司,商水接单;提供成都网站建设、成都做网站,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行商水网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!
2. 注意
1)初始化的时候,上下文用全局的,即ApplicationContext。
2)要在Activity的相应生命周期方法里调用MapView对应的生命周期方法。
3. 百度地图的核心类:
1)SDKInitializer百度地图初始化类
》》注册网络错误、key验证错误的广播
这样一样百度地图崩溃了,或者出异常了,就知道有没有可能是这一块出现了问题。
private void initSDK() { SDKInitializer.initialize(getApplicationContext()); //注册网络错误和KEY验证失败的广播 IntentFilter filter = new IntentFilter(); filter.addAction(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR); filter.addAction(SDKInitializer.SDK_BROADTCAST_ACTION_STRING_PERMISSION_CHECK_ERROR); registerReceiver(new MyReceiver(), filter); } class MyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if(action.equals(SDKInitializer.SDK_BROADCAST_ACTION_STRING_NETWORK_ERROR)){ Toast.makeText(getApplicationContext(), "网络错误", 0).show(); }else if(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.方法()可以得到参数
//设置地图的绽放级别
MapStatusUpdate zoom = MapStatusUpdateFactory.zoomTo(18); map.setMapStatus(zoom);
//设置中心点,注意LatLng的构造函数latitude,longtitude,分别为纬度、经度,在百度地
图上查的坐标与这个正好相反的。
map.setMapStatus(MapStatusUpdateFactory.newLatLng( new LatLng(40.050513,116.30361)));
Android百度地图默认位置中心点设置
http://blog.csdn.net/xyy410874116/article/details/32094157
//旋转百度地图(以中心点)
//得到地图之前的状态和角度 MapStatus mapStatus = map.getMapStatus(); float preRotate = mapStatus.rotate; //利用MapStatus.Builder静态内部类来构造新的状态,对之前状态的角度累加一个 值。 Builder builder = new MapStatus.Builder(); MapStatus newStatus = builder.rotate(preRotate + 30).build(); //将新的状态设置给百度地图 map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus));
//翻转百度地图(以直线),改变俯角,也就是看百度地图的角度。
MapStatus mapStatus2 = map.getMapStatus(); float preOverlook = mapStatus2.overlook; Builder builder2 = new MapStatus.Builder(); MapStatus newStatus2 = builder2.overlook(preOverlook - 5 ).build(); map.setMapStatus(MapStatusUpdateFactory.newMapStatus(newStatus2));
//移动百度地图到指定中心点
animateMapStatus方法有重载形式,可以指定动画的时长。(默认300ms)
MapStatusUpdate statusUpdate = 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
//创建圆形覆盖物 CircleOptions options = new CircleOptions(); //设置数据 //圆心坐标 options.center(new LatLng(40.050513,116.30361)) //圆半径 .radius(1000) //填充颜色 .fillColor(Color.BLUE) //圆的边框宽度和颜色 .stroke(new Stroke(5, Color.RED)); //将覆盖物添加到地图上 map.addOverlay(options);
效果如下图:
例2:添加文字覆盖物 TextOptions
TextOptions options = new TextOptions(); options.fontColor(Color.BLUE) .fontSize(100) .bgColor(0x3300ff00) .rotate(30) .typeface(Typeface.SERIF) .position(new LatLng(40.050513,116.30361)) .text("我在北京"); map.addOverlay(options);
效果如下图:
通过上面的两个例子,发现,文字(包括百度地图本身的文字)并不会随着地图一起缩放,
但是圆形覆盖物会随着地图一起缩放。
例3:添加标记覆盖物 MarkerOptions
MarkerOptions options = new MarkerOptions(); BitmapDescriptor icon; 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:搜索指定范围内的加油站(矩形区域搜索)
private void search() { PoiSearch search = PoiSearch.newInstance(); search.setOnGetPoiSearchResultListener(new MyOnGetPoiSearchResultListener()); //范围内搜索 PoiBoundSearchOption boundOption = new PoiBoundSearchOption(); //搜索关键字 boundOption.keyword("加油站"); //搜索范围 LatLngBounds latLngBounds = new LatLngBounds.Builder() .include(new LatLng(39.98, 116.310)) .include(new LatLng(39.96, 116.30)) .build(); boundOption.bound(latLngBounds); search.searchInBound(boundOption); } class MyOnGetPoiSearchResultListener implements OnGetPoiSearchResultListener { @Override public void onGetPoiDetailResult(PoiDetailResult arg0) { //详情搜索在此处理结果 } @Override public void onGetPoiResult(PoiResult result) { if(result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { return ; //无搜索结果 } //找到搜索结果 //创建覆盖物 MyOverlay overlay = new MyOverlay(map); //++++++++监听覆盖物的点击事件++++++++++ map.setOnMarkerClickListener(overlay); //为覆盖物绑定数据 overlay.setData(result); //将覆盖物添加到地图上 overlay.addToMap(); //显示全部的搜索结果 overlay.zoomToSpan(); } } //自定义一个实现了点击事件的覆盖物 class MyOverlay extends PoiOverlay { public MyOverlay(BaiduMap arg0) { super(arg0); } @Override public boolean onPoiClick(int index) { PoiResult result = getPoiResult(); //在搜索集中找到被点击的覆盖物的信息 PoiInfo poiInfo = result.getAllPoi().get(index); Toast.makeText(getApplicationContext(), poiInfo.address, 0).show(); return super.onPoiClick(index); } }
例2:搜索周边的地铁站(圆形区域搜索)
原理和加油站的搜索一下,只是PoiSearch调用的方法及方法的参数不同,监听者不用改变。
可以进行共用。
PoiNearbySearchOption nearbySearchOption = new PoiNearbySearchOption(); nearbySearchOption.keyword("地铁站") .radius(1000) .location(testPos); search.searchNearby(nearbySearchOption);
上面两个例子,MyOverlay在监听点击的时候,得到了覆盖物的PoiInfo,通过PoiInfo又可以得
到uid,根据uid就可以发起详情搜索:
//详情搜索 protected void detailSearch(PoiInfo poiInfo) { PoiDetailSearchOption detailSearchOption = new PoiDetailSearchOption(); detailSearchOption.poiUid(poiInfo.uid); search.searchPoiDetail(detailSearchOption); }
监听详情搜索结果
@Override public void onGetPoiDetailResult(PoiDetailResult result) { if(result == null || result.error == SearchResult.ERRORNO.RESULT_NOT_FOUND) { return ; } Toast.makeText(getApplicationContext(),"电话:" + result.getTelephone(), 0).show(); }
例3:城市搜索
//城市搜索 private void citySearch() { PoiCitySearchOption citySearchOption = new PoiCitySearchOption(); citySearchOption.city("北京") .keyword("武术馆") .pageNum(pageIndex ++); //分布显示数据 search.searchInCity(citySearchOption); }
注意分页显示数据的时候,要清除之前的数据,在onGetPoiResult方法里:
//清除数据,防止分布的时候显示前一页的数据。 map.clear();
4. 百度地图高级开发:
案例1:泡泡提示信息
第1步:初始化PopView,并添加到MapView当中,隐藏PopView
private void initPop() { pop = View.inflate(getApplicationContext(), R.layout.mark_item, null); tip = (TextView) pop.findViewById(R.id.tv); MapViewLayoutParams params = new MapViewLayoutParams.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上去。
@Override public boolean onMarkerClick(Marker marker) { MapViewLayoutParams params = new MapViewLayoutParams.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()); return true; }
效果图如下:
4. 百度地图定位SDK使用:
上面讲的的这些,都是地图SDK的开发。下面要说的就是定位SDK使用,就是定位手机当前的
位置。照着百度定位SDK开发文档做,但是代码需要有一定的改动。
代码如下:
public class LocateActivity extends BaseActivity { public LocationClient mLocationClient = null; public BDLocationListener myListener = new MyLocationListener(); @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mLocationClient = new LocationClient(getApplicationContext()); //声明LocationClient类 mLocationClient.registerLocationListener( myListener ); //注册监听函数 initLocation(); } @Override protected void onStart() { super.onStart(); mLocationClient.start(); } @Override protected void onStop() { super.onStop(); mLocationClient.stop(); } private void initLocation(){ LocationClientOption option = new LocationClientOption(); option.setLocationMode(LocationMode.Hight_Accuracy );//可选,默认高精度,设置定位模式,高精度,低功耗,仅设备 option.setCoorType("bd09ll");//可选,默认gcj02,设置返回的定位结果坐标系 int span=1000; option.setScanSpan(span);//可选,默认0,即仅定位一次,设置发起定位请求的间隔需要大于等于1000ms才是有效的 option.setIsNeedAddress(true);//可选,设置是否需要地址信息,默认不需要 option.setOpenGps(true);//可选,默认false,设置是否使用gps option.setLocationNotify(true);//可选,默认false,设置是否当gps有效时按照1S1次频率输出GPS结果 option.setIgnoreKillProcess(false);//可选,默认false,定位SDK内部是一个SERVICE,并放到了独立进程,设置是否在stop的时候杀死这个进程,默认杀死 option.SetIgnoreCacheException(false);//可选,默认false,设置是否收集CRASH信息,默认收集 mLocationClient.setLocOption(option); //设置自己的定位图标 BitmapDescriptor icon = BitmapDescriptorFactory.fromResource(R.drawable.icon_geo); MyLocationConfiguration configuration = new MyLocationConfiguration(MyLocationConfiguration.LocationMode.COMPASS, true, icon); map.setMyLocationConfigeration(configuration); } public class MyLocationListener implements BDLocationListener { @Override public void onReceiveLocation(BDLocation location) { //Receive Location Builder builder = new MyLocationData.Builder(); builder.latitude(location.getLatitude()) //纬度 .longitude(location.getLongitude()); //经度 map.setMyLocationEnabled(true); //允许定位图层 map.setMyLocationData(builder.build()); //设置定位数据 } } }