百度地图开发总结

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

当前名称:百度地图开发总结
文章来源:http://ybzwz.com/article/ghegpe.html