Android中百度地图的使用(二)

我们上一篇博客介绍了一下百度地图的配置,我们这篇博客着重来讲一下百度地图模式的切换和定位。

地图SDK提供了3种预置的地图类型,包括普通地图卫星图空白地图

地图类型

百度地图SDK为您提供了3种类型的地图资源(普通矢量地图、卫星图和空白地图),BaiduMap 类提供图层类型常量,详细如下:

类型名称 说明
MAP_TYPE_NORMAL 普通地图(包含3D地图)
MAP_TYPE_SATELLITE 卫星图
MAP_TYPE_NONE 空白地图

我们可以通过BaiduMap中的setMapType()方法来设置地图类型

普通地图

基础的道路地图。 显示道路、建筑物、绿地以及河流等重要的自然特征。

设置普通地图的代码如下:

 mMapView = (MapView) findViewById(R.id.mv_map);
        mBaiduMap = mMapView.getMap();
        //放大地图的倍数
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mBaiduMap.setMapStatus(msu);
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

效果图如下:

卫星地图

显示卫星照片数据。

设置卫星地图的代码如下:

 mMapView = (MapView) findViewById(R.id.mv_map);
        mBaiduMap = mMapView.getMap();
        //放大地图的倍数
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mBaiduMap.setMapStatus(msu);
 mBaiduMap.setMapType(BaiduMap.MAP_TYPE_SATELLITE);

效果图所下:

空白地图

无地图瓦片,地图将渲染为空白地图。不加载任何图块,将不会使用流量下载基础地图瓦片图层。支持叠加任何覆盖物。

设置空白地图代码如下:

 mMapView = (MapView) findViewById(R.id.mv_map);
        mBaiduMap = mMapView.getMap();
        //放大地图的倍数
        MapStatusUpdate msu = MapStatusUpdateFactory.zoomTo(15.0f);
        mBaiduMap.setMapStatus(msu);
mBaiduMap.setMapType(BaiduMap.MAP_TYPE_NORMAL);

效果图如下:

定位功能

百度地图Android定位SDK是为Android移动端应用提供的一套简单易用的定位服务接口,专注于为广大开发者提供最好的综合定位服务。通过使用百度定位SDK,开发者可以轻松为应用程序实现智能、精准、高效的定位功能。

1.准备工作

使用百度地图定位的时候需要一个定位的jar,可以去平台自己下载,具体配置已经在Android中百度地图的使用(一)中已经讲解过了,在这就不讲解了。

2.初始化LocationClient类

请在主线程中声明LocationClient类对象,该对象初始化需传入Context类型参数。推荐使用getApplicationConext()方法获取全进程有效的Context。

核心代码段如下:

   mLocationClient = new LocationClient(getApplicationContext());
        myListener = new MyLocationListener();
        //注册监听函数
        mLocationClient.registerLocationListener(myListener);

3.配置定位SDK参数

通过参数配置,可选择定位模式、可设定返回经纬度坐标类型、可设定是单次定位还是连续定位。

定位SDK所提供的定位模式包括三种:高精度、低功耗和仅用设备定位。开发者请根据自己的实际使用需求进行选择。

定位SDK能够返回三种坐标类型的经纬度(国内),分别是gcj02(国测局坐标)、bd09(百度墨卡托坐标)和bd09ll(百度经纬度坐标)。如果开发者想利用定位SDK获得的经纬度直接在百度地图上标注,请选择坐标类型bd09ll。

利用LocationClientOption类配置定位SDK参数。核心代码如下:

 LocationClientOption option = new LocationClientOption();
        //可选,设置定位模式,默认高精度
        //LocationMode.Hight_Accuracy:高精度;
        //LocationMode. Battery_Saving:低功耗;
        //LocationMode. Device_Sensors:仅使用设备;
        option.setLocationMode(LocationClientOption.LocationMode.Hight_Accuracy);
        //可选,设置返回经纬度坐标类型,默认gcj02
        //gcj02:国测局坐标;
        //bd09ll:百度经纬度坐标;
        //bd09:百度墨卡托坐标;
        //海外地区定位,无需设置坐标类型,统一返回wgs84类型坐标
        option.setCoorType("bd09ll");
        //可选,设置发起定位请求的间隔,int类型,单位ms
        //如果设置为0,则代表单次定位,即仅定位一次,默认为0
        //如果设置非0,需设置1000ms以上才有效
        option.setScanSpan(1000);
        //可选,设置是否使用gps,默认false
        //使用高精度和仅用设备两种定位模式的,参数必须设置为true
        option.setOpenGps(true);
        //可选,设置是否当GPS有效时按照1S/1次频率输出GPS结果,默认false
        option.setLocationNotify(true);
        //可选,定位SDK内部是一个service,并放到了独立进程。
        //设置是否在stop的时候杀死这个进程,默认(建议)不杀死,即setIgnoreKillProcess(true)
        option.setIgnoreKillProcess(false);
        //可选,设置是否收集Crash信息,默认收集,即参数为false
        option.SetIgnoreCacheException(false);
        //可选,7.2版本新增能力
        //如果设置了该接口,首次启动定位时,会先判断当前WiFi是否超出有效期,若超出有效期,会先重新扫描WiFi,然后定位
        option.setWifiCacheTimeOut(5*60*1000);
        //可选,设置是否需要过滤GPS仿真结果,默认需要,即参数为false
        option.setEnableSimulateGps(false);
        //mLocationClient为第二步初始化过的LocationClient对象
        //需将配置好的LocationClientOption对象,通过setLocOption方法传递给LocationClient对象使用
        //更多LocationClientOption的配置,请参照类参考中LocationClientOption类的详细说明
        option.setIsNeedAddress(true);

4.实现BDAbstractLocationListener接口

Android定位SDK对外提供了Abstract类型的监听接口BDAbstractLocationListener,用于实现定位监听。核心代码如下:

 class MyLocationListener extends BDAbstractLocationListener {

        @Override
        public void onReceiveLocation(BDLocation bdLocation) {
            //此处的BDLocation为定位结果信息类,通过它的各种get方法可获取定位相关的全部结果
            //以下只列举部分获取经纬度相关(常用)的结果信息
            //更多结果信息获取说明,请参照类参考中BDLocation类中的说明

            double latitude = bdLocation.getLatitude();    //获取纬度信息
            double longitude = bdLocation.getLongitude();    //获取经度信息
            float radius = bdLocation.getRadius();    //获取定位精度,默认值为0.0f
//            String coorType = bdLocation.getCoorType();
//            MapStatusUpdate mapUpdate = MapStatusUpdateFactory.zoomTo(radius);
//            mBaiduMap.setMapStatus(mapUpdate);

            MyLocationData data = new MyLocationData.Builder()//
                    .direction(mCurrentX)//
                    .accuracy(radius)//
                    .latitude(latitude)//
                    .longitude(longitude)//
                    .build();
            mBaiduMap.setMyLocationData(data);
            //设置自定义图标
            mBaiduMap.setMyLocationConfiguration(new MyLocationConfiguration(
                    mCurrentMode, true, mIcon));
            //更新经纬度
            mLatitude=   bdLocation.getLatitude();
            mLongitude=bdLocation.getLongitude();
            LatLng  point=  new LatLng(latitude,longitude);
            if (isFirstIn){
                //开始移动
                MapStatusUpdate mapLatlng = MapStatusUpdateFactory.
                        newLatLng(point);
                mBaiduMap.animateMapStatus(mapLatlng);
                Toast.makeText(mContext,bdLocation.getAddrStr(), Toast.LENGTH_SHORT).show();
                isFirstIn=false;
             }
        }
    }

5.启动定位,核心代码如下:

mLocationClient.start();
//mLocationClient为第二步初始化过的LocationClient对象
//调用LocationClient的start()方法,便可发起定位请求

定位时注意各种Android版本的兼容性,特别是6.0以上Android版本加强了获取权限的机制以后,需要手动确认。

android6.0系统以及以上版本,如果是,需要动态添加权限,核心代码如下:

 if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION)
                != PackageManager.PERMISSION_GRANTED) {
            //若权限没有开启,则请求权限
            ActivityCompat.requestPermissions(this,
                    new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, Location_Permission);
        }else{
           initLocal();
        }

以上就是百度地图定位的使用了,关于覆盖物的添加,我们在下一篇博客Android中百度地图的使用(三)进行讲解,地图的demo也可以在Android中百度地图的使用(三)中进行下载,我把地图模式的切换、地位以及覆盖物的添加整合到一个例子中。

猜你喜欢

转载自blog.csdn.net/wen_haha/article/details/81169901