高德
1、修正AP源数据:
高德地图app的定位采用1次/秒的定位频率,同样存在初次定位不准确的问题,核心原因是设备为定位器准备的AP源数据(伪基站、WiFi不新鲜)不准确。高德地图app尽量采用连续定位的策略,当设备在环境中获得正确的AP数据源时,采用的持续定位就会返回相对精准的地理位置覆盖掉之前失准的结果。
然而集成定位SDK的app并非都是出行行业,也并非都可以像高德地图这样获保持如此高的定位频率。定位SDK团队为用户设计了这样一个单次定位接口:
mLocationOption.setOnceLocationLatest(true); //设置setOnceLocationLatest(boolean b)接口为true,启动定位时SDK会返回最近3s内精度最高的一次定位结果 //且该结果一定来自与设备环境相符合的AP源
也可以参考:http://lbs.amap.com/api/android-location-sdk/guide/startlocation/#t4
2、增加一些判断:
我们也建议可以通过简单的判断来提高定位的精度。
合并多次定位结果,选择使用持续定位,例如定位间隔3s。
a)一次过滤:
mAMapLocation.getLocationType(); //通过以上方法获取定位类型,如果对定位类型要求比较高,可以过滤掉基站定位(类型6)结果。
定位类型对照表可参考:
响应码 | 说明 | 介绍 |
---|---|---|
0 | 定位失败 | 请通过AMapLocation.getErrorCode()方法获取错误码,并参考错误码对照表进行问题排查。 |
1 | GPS定位结果 | 通过设备GPS定位模块返回的定位结果,精度较高,在10米-100米左右 |
2 | 前次定位结果 | 网络定位请求低于1秒、或两次定位之间设备位置变化非常小时返回,设备位移通过传感器感知。 |
4 | 缓存定位结果 | 返回一段时间前设备在同样的位置缓存下来的网络定位结果 |
5 | Wifi定位结果 | 属于网络定位,定位精度相对基站定位会更好,定位精度较高,在5米-200米之间。 |
6 | 基站定位结果 | 纯粹依赖移动、联通、电信等移动网络定位,定位精度在500米-5000米之间。 |
8 | 离线定位结果 | - |
b)二次过滤:
mAMapLocation. getAccuracy(); //通过以上方法获取定位精度,例如超过500M精度的定位结果可以考虑不在业务场景里使用。
参考:
为什么高德地图APP的定位效果比我开发的APP效果好?
android系统api原生定位
//获取LocationManager
LocationManager lManager =
(LocationManager) mContext.getSystemService(Context.LOCATION_SERVICE);
/**
* 参1:选择定位的方式
* 参2:定位的间隔时间
* 参3:当位置改变多少时进行重新定位
* 参4:位置的回调监听
*/
lManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1, 0, new LocationListener() { //当位置改变的时候调用
@Override
public void onLocationChanged(Location location) { //经度
double longitude = location.getLongitude(); //纬度
double latitude = location.getLatitude(); //海拔
double altitude = location.getAltitude();
} //当GPS状态发生改变的时候调用
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
switch (status) {
case LocationProvider.AVAILABLE:
Toast.makeText(mContext, "当前GPS为可用状态!", Toast.LENGTH_SHORT).show();
break;
case LocationProvider.OUT_OF_SERVICE:
Toast.makeText(mContext, "当前GPS不在服务内", Toast.LENGTH_SHORT).show();
break;
case LocationProvider.TEMPORARILY_UNAVAILABLE:
Toast.makeText(mContext, "当前GPS为暂停服务状态", Toast.LENGTH_SHORT).show();
break;
}
} //GPS开启的时候调用
@Override
public void onProviderEnabled(String provider) {
Toast.makeText(mContext, "GPS开启了", Toast.LENGTH_SHORT).show();
} //GPS关闭的时候调用
@Override
public void onProviderDisabled(String provider) {
Toast.makeText(mContext, "GPS关闭了", Toast.LENGTH_SHORT).show();
}
});
缺点:需要较长的时间才能定位。
总结
在室内使用高德定位时,误差不可避免的有50~100米之间,android原生GPS定位误差有几百米。