百度地图开发总结-创新互联

1.  怎么接入百度SDK,百度文档说得很明白,我就不说了。

专注于为中小企业提供成都网站建设、网站制作服务,电脑端+手机端+微信端的三站合一,更高效的管理,为中小企业临沭免费做网站提供优质的服务。我们立足成都,凝聚了一批互联网行业人才,有力地推动了上千家企业的稳健成长,帮助中小企业通过网站建设实现规模扩充和转变。

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());  //设置定位数据
        }
	}
	
}

另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


本文名称:百度地图开发总结-创新互联
文章转载:http://ybzwz.com/article/shedh.html