一、定位策略
混合GPS+基站+WiFi定位,百度地图定位SDK会根据环境自动调整定位策略。
定位方式 | 介绍 |
---|---|
GPS | 误差10M左右,精准、耗电、室内不可用。精度和GPS设备使用环境相关 |
wifi | 误差24M左右,较精准、需要连接wifi |
基站 | 误差210M左右,误差较大、使用范围广、需要连网 |
1. 高精度模式定位策略:这种定位模式下,会同时使用网络定位和GPS定位,优先返回最高精度的定位结果
2. 低功耗模式定位策略:该定位模式下,不会使用GPS,只会使用网络定位(Wi-Fi和基站定位)
3. 仅用设备模式定位策略:这种定位模式下,不需要连接网络,只使用GPS进行定位,这种模式下不支持室内环境的定位
二、做定位的思路
- 获取定位后的位置信息(百度地图有获取当前位置信息的API)
- 把定位信息加载到地图上
三、尝试做第一个定位
(1)准备工作
- 申请key,这个就不多说了
- 下载相关jar包,和对应的.so文件(BaiduLBS_Android.jar)
(2)关键类
类名 | 含义 |
---|---|
MapView | 百度地图控件 |
BaiduMap | 地图对象的操作方法与接口 |
LocationClient | 定位关键类!定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动 |
LocationClientOption | 配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等 |
BDLocationListener | 定位请求回调接口,当获取位置信息的时候就会回调 |
BDLocation | 百度坐标类,内部封装了如经纬度、半径等属性信息 |
(3)代码
》》关于定位设置、启动
/**
* 初始化百度地图
*/
private void initMap() {
/*
百度地图:下面的是定位相关代码
LocationClientOption配置定位SDK各配置参数,比如定位模式、定位时间间隔、坐标系类型等
*/
LocationClientOption mLocationClientOption = new LocationClientOption();
mLocationClientOption.setCoorType("bd09ll");// 设置坐标类型
mLocationClientOption.setIsNeedAddress(true);// 设置是否需要地址信息,默认为无地址
mLocationClientOption.setOpenGps(true);// 设置是否打开gps进行定位
mLocationClientOption.setScanSpan(5000);// 设置扫描间隔,单位是毫秒 当<1000(1s)时,定时定位无效
/*
LocationClient定位服务的客户端。宿主程序在客户端声明此类,并调用,目前只支持在主线程中启动
*/
LocationClient mLocationClient = new LocationClient(context, mLocationClientOption);// 设置入LocationClient
/*
开始定位
*/
MyBDLocationListener mBDLocationListener = new MyBDLocationListener();// 获取监听对象(MyBDLocationListener是实现了BDLocationListener接口的类)
mLocationClient.registerLocationListener(mBDLocationListener);// 注册定位监听函数
mLocationClient.start();// 启动定位sdk
}
》》关于定位回调接口的实现,BDLocationListener
/**
* 实现定位请求回调接口
*/
private class MyBDLocationListener implements BDLocationListener {
/**
* 发生定位时的回调方法
*
* @param bdLocation 百度坐标类,内部封装了如经纬度、半径等属性信息
*/
@Override
public void onReceiveLocation(BDLocation bdLocation) {
/*
百度地图:下面是根据定位信息,落实到地图相关的代码,以及百度地图界面相关配置
*/
BaiduMap mBaiduMap = map_view.getMap();// 地图对象的操作方法与接口
mBaiduMap.setMyLocationEnabled(true);// 开启定位图层
MapStatusUpdate mMapStatusUpdate = MapStatusUpdateFactory.zoomTo(18.0f);// 设置初始缩放级别
mBaiduMap.setMapStatus(mMapStatusUpdate);// 改变地图状态
/*
MyLocationData定位数据对象
*/
MyLocationData mLocationData = new MyLocationData.Builder()
.accuracy(1)// 定位精度
.direction(bdLocation.getDirection())// GPS定位时方向角度,顺时针0-360
.latitude(bdLocation.getLatitude())//百度纬度坐标
.longitude(bdLocation.getLongitude())//百度经度坐标
.build();// 设置相关显示数据
mBaiduMap.setMyLocationData(mLocationData);// 把定位数据设置到BaiduMap对象
BitmapDescriptor mCurrentMarker = BitmapDescriptorFactory.fromResource(R.mipmap.icon_car);
BitmapDescriptor mFriendMarker = BitmapDescriptorFactory.fromResource(R.mipmap.icon_friend_point);
/*
MyLocationConfiguration配置定位图层显示方式
可以设置精度圈填充颜色、精度圈边框颜色、用户自定义定位图标、是否允许显示方向信息、定位图层显示方式
*/
MyLocationConfiguration mLocationConfiguration = new MyLocationConfiguration(
MyLocationConfiguration.LocationMode.COMPASS,
true,
mCurrentMarker);
mBaiduMap.setMyLocationConfigeration(mLocationConfiguration);// 把定位图层显示方式设置到BaiduMap对象
}
}
四、一些问题
- 目前没有接口限制,但不支持多线程并发访问。
- 百度定位SDK可以返回三种坐标系,分别是bd09, bd09ll和gcj02,其中bd09ll能无偏差地显示在百度地图上。
- 百度地图api中采用两种坐标体系,经纬度坐标系和墨卡托投影坐标系。
以下是遇到的坑,只能描述一些表现
- 死活出不来,没有报错,就是闪退,可能就是BDLocation为null
- Android6.0新特性,有些权限不能配置,需要手动申请。》》解决办法
- 百度地图4.9E-324,error code : 162 latitude : 4.9E-324 lontitude : 4.9E-324》》这个报错,只能说明一件事,定位信息没拿到。原因很多,需要分析,说几个:
1.可能是key的问题
2.可能是缺少权限问题,参照上一问题去分析
3.也可能是当前定位条件真的不行,可以到空旷的地域去测试
4.可能是.so文件没导入成功,可以仿照Baidu的Demo去放.so文件并在Gradle中配置好。