Android之百度地图定位,高德地图定位
问题
最近几天我们的客户给我们反应说,app中的百度地图定位有误差,不能准确的定位到实时位置,而用微信里面的定位就能准确的定位到具体门牌号,然后就说是我们的问题,需要处理(因为我们的app对定位精度要求比较高,必须准确到号牌)
思路
[1].刚开始听到这个问题觉得不应该,百度地图不可能有问题,一种分析是SDK版本太老了,核对之后发现是较新的jar
[2].之后同事让我集成一个高德地图的demo,看一看高德地图定位效果如何,集成之后发现高德地图有的时候也会出现位置偏差,偏差还蛮大,于是排除了这种可能
[3].后来在两台手机上定位效果也是不同的,一台有SIM卡,一台没有,发现有卡的手机很多时候都能定位到比较精确的位置(误差范围内),然后调到飞行模式连接wifi,发现也有问题,就想到可能是基站定位取代了GPS定位导致误差
[4].之后就随意看以一下博客,逐渐的查到了误差较大的原因,原因就是在不同的定位条件下,精确度是不同的
查资料
之前集成百度地图,对一些定位知识没有太去关注,原来定位有4中方式:
[1].GPS定位
[2].WIFI定位
[3].基站定位
[4].AGPS定位
定位具体有什么特点我就不做介绍了,相关的博客有很多,有一点强调的就是GPS定位通常要比其他定位要精确,同时GPS定位在室内信号很微弱,几乎不能定位室内
解决
有了上面的了解之后,我们知道GPS不能定位室内,因此在室内走的是其他定位,精确度会差一些(那哥们测试一直是在室内,定位不到门牌号就正常了);找到原因后就和同事商量解决办法,经过一番讨论后,采取了保存最近一次GPS定位的地址,当位置更新时,在回调里面判断这次位置更新是GPS还是其他,如果是GPS,更新地址,否则使用保存的地址(如果用户一直在室内的话,这个误差也解决不了),具体代码如下:
`public void onReceiveLocation(BDLocation location) {
if (latitude != 0 || longitude != 0) {
if (location.getLatitude() - latitude == 0 || location.getLongitude() -longitude == 0) {
// 经纬度没有改变
return;
}
}
StringBuffer sb = new StringBuffer(256);
sb.append("\nlatitude : ");
sb.append(location.getLatitude());// 获得纬度
sb.append("\nlontitude : ");
sb.append(location.getLongitude());// 获得经度
sb.append("\nradius : ");
sb.append(location.getRadius());
latitude = location.getLatitude();
longitude = location.getLongitude();
if (location.getLocType() == BDLocation.TypeGpsLocation) {
// 通过GPS定位
sb.append(location.getAddrStr());// 获得当前地址
sb.append(location.getDirection());// 获得方位
// 记录GPS地址
mGpsAddress = location.getAddrStr();
resultLocationInfo(latitude, longitude, mGpsAddress);
} else if (location.getLocType() == BDLocation.TypeNetWorkLocation) {
// 通过网络连接定位
sb.append(location.getAddrStr());// 获得当前地址
if (mGpsAddress == null) {
// 非GPS
resultLocationInfo(latitude, longitude, location.getAddrStr());
} else {
// GPS传最近一次GPS更新的地址
resultLocationInfo(latitude, longitude, mGpsAddress);
}
}
}`
注
以上解决是我们自己的解决方案,可能欠妥,如果大家有更加好的解决办法,请指正!