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中百度地图的使用(三)中进行下载,我把地图模式的切换、地位以及覆盖物的添加整合到一个例子中。