百度地图SDK自从3.0.0以后就不再兼容以前版本的方法了,然而之前项目里一直采用的是2.3.5的,无意中发现这个版本无法在4.4以上Android系统手机上使用,然后研究了百度地图开发者平台中的更新日志,在SDK2.4.1上修复了这个问题,所以无奈只得更换项目所引用的jar包,还好版本的更新引起的api变动很小,那么问题来了,如果百度地图在3.0以后再修复了什么系统不兼容的bug的话,那开发者所使用的老版本sdk就坑爹了,肯定要更改很多代码,因为很多方法已经变了,要么废弃了,要么进化了,所以与其等到那时再临时抱佛脚,不如现在就深入了学习下新版的百度地图,顺便写个demo供以后借用
先上两张简单效果图
给地图添加覆盖物并获取对应索引:
mMapView = (MapView) findViewById(R.id.bmapView2); mBaiduMap = mMapView.getMap(); // 普通地图 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL); initOverlay(); mBaiduMap.setOnMarkerClickListener(new OnMarkerClickListener() { @Override public boolean onMarkerClick(Marker marker) { // TODO Auto-generated method stub final int pos = marker.getZIndex();//获取覆盖物索引 View popview = LayoutInflater.from(MapOverlayActivity.this) .inflate(R.layout.map_overlay_pop, null, false); TextView text = (TextView) popview .findViewById(R.id.map_overlay_name); text.setText("海贼王" + pos); OnInfoWindowClickListener listener = null; listener = new OnInfoWindowClickListener() { public void onInfoWindowClick() { Toast.makeText(MapOverlayActivity.this, "luffy" + pos, Toast.LENGTH_SHORT).show(); mBaiduMap.hideInfoWindow(); } }; LatLng ll = marker.getPosition(); mInfoWindow = new InfoWindow(BitmapDescriptorFactory .fromView(popview), ll, -47, listener); mBaiduMap.showInfoWindow(mInfoWindow); return true; } }); /** * 创建五个地图覆盖物 */ public void initOverlay() { list.add(new LatLng(studioLat, studioLon)); list.add(new LatLng(31.360673, 120.466979)); list.add(new LatLng(31.422323, 120.607834)); list.add(new LatLng(31.308855, 120.637154)); list.add(new LatLng(31.395695, 120.945884)); // add marker overlay for (int i = 0; i < list.size(); i++) { OverlayOptions overlay = new MarkerOptions().position(list.get(i)) .icon(bd).zIndex(i).draggable(false); markerList.add((Marker) (mBaiduMap.addOverlay(overlay))); } MapStatusUpdate u = MapStatusUpdateFactory.newLatLng(list.get(0)); mBaiduMap.setMapStatus(u); }
接下来是路径规划的监听关键代码:
mPoiSearch = PoiSearch.newInstance(); mPoiSearch.setOnGetPoiSearchResultListener(this); MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(17.0f);// 设置默认缩放等级 mBaiduMap.setMapStatus(msu); mSearch = RoutePlanSearch.newInstance(); OnGetRoutePlanResultListener listener = new OnGetRoutePlanResultListener() { public void onGetWalkingRouteResult(WalkingRouteResult result) { // 获取步行线路规划结果 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MapGuideActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo() return; } if (result.error == SearchResult.ERRORNO.NO_ERROR) { // route = result.getRouteLines().get(0); WalkingRouteOverlay overlay = new WalkingRouteOverlay( mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); // routeOverlay = overlay; overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } } public void onGetTransitRouteResult(TransitRouteResult result) { // 获取公交换乘路径规划结果 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MapGuideActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo() return; } if (result.error == SearchResult.ERRORNO.NO_ERROR) { TransitRouteOverlay overlay = new TransitRouteOverlay( mBaiduMap); mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } } public void onGetDrivingRouteResult(DrivingRouteResult result) { // 获取驾车线路规划结果 if (result == null || result.error != SearchResult.ERRORNO.NO_ERROR) { Toast.makeText(MapGuideActivity.this, "抱歉,未找到结果", Toast.LENGTH_SHORT).show(); } if (result.error == SearchResult.ERRORNO.AMBIGUOUS_ROURE_ADDR) { // 起终点或途经点地址有岐义,通过以下接口获取建议查询信息 // result.getSuggestAddrInfo() return; } if (result.error == SearchResult.ERRORNO.NO_ERROR) { // route = result.getRouteLines().get(0); DrivingRouteOverlay overlay = new DrivingRouteOverlay( mBaiduMap); // routeOverlay = overlay; mBaiduMap.setOnMarkerClickListener(overlay); overlay.setData(result.getRouteLines().get(0)); overlay.addToMap(); overlay.zoomToSpan(); } } }; mSearch.setOnGetRoutePlanResultListener(listener);
PlanNode stNode = PlanNode.withLocation(new LatLng(currentLat, currentLon)); PlanNode enNode = PlanNode .withLocation(new LatLng(studioLat, studioLon)); mSearch.drivingSearch((new DrivingRoutePlanOption()).from(stNode) .to(enNode)); mSearch.transitSearch((new TransitRoutePlanOption()).from(stNode) .to(enNode)); mSearch.walkingSearch((new WalkingRoutePlanOption()).from(stNode) .to(enNode));