手机端定位偏移问题
1、坐标系
- WGS-84原始坐标系:也就是GPS定位拿到的经纬度,谷歌和高德在国外可以正常使用GPS定位,国内不允许各个平台使用GPS坐标。
- GCJ-02坐标系,又名火星坐标系,由WGS-84加密而成,在国内各个地图平台需要使用这种坐标系,或者在GCJ-02的基础上在进行加密。像谷歌,高德,腾讯都是通用的GCJ-20坐标系
- BD-09坐标系,是百度地图通过再次加密GCJ-20坐标系得到的独有的坐标系只适用于百度地图。(慎用)
2、原生安卓,ios定位偏移(vue+crodova)
navigator.geolocation.getCurrentPosition(geolocationSuccess,
[geolocationError],
[geolocationOptions]);
以上代码为crodova调用手机的原生定位方法,得到的经纬度为GPS坐标系,在国内各个地图平台上是无法使用的,亲测会发生大约一公左右的偏移。
3、偏移解决方案
以高德地图为例,高德地图中jsapi中有一个坐标转换的方法可将gps坐标转换为GCJ-20坐标。
var gps = [116.3, 39.9];
AMap.convertFrom(gps, 'gps', function (status, result) {
if (result.info === 'ok') {
var lnglats = result.locations; // Array.<LngLat>
}
});
4.地图API定位
地图SDK会自动选择加密的方式,然后再将点显示在地图上,这个时候是没有偏移的。以高德地图为例。
mapObj = new AMap.Map('iCenter');
mapObj.plugin('AMap.Geolocation', function () {
geolocation = new AMap.Geolocation({
enableHighAccuracy: true,//是否使用高精度定位,默认:true
timeout: 10000, //超过10秒后停止定位,默认:无穷大
maximumAge: 0, //定位结果缓存0毫秒,默认:0
convert: true, //自动偏移坐标,偏移后的坐标为高德坐标,默认:true
showButton: true, //显示定位按钮,默认:true
buttonPosition: 'LB', //定位按钮停靠位置,默认:'LB',左下角
buttonOffset: new AMap.Pixel(10, 20),//定位按钮与设置的停靠位置的偏移量,默认:Pixel(10, 20)
showMarker: true, //定位成功后在定位到的位置显示点标记,默认:true
showCircle: true, //定位成功后用圆圈表示定位精度范围,默认:true
panToLocation: true, //定位成功后将定位到的位置作为地图中心点,默认:true
zoomToAccuracy:true //定位成功后调整地图视野范围使定位位置及精度范围视野内可见,默认:false
});
mapObj.addControl(geolocation);
geolocation.getCurrentPosition();
AMap.event.addListener(geolocation, 'complete', onComplete);//返回定位信息
AMap.event.addListener(geolocation, 'error', onError); //返回定位出错信息
});
在移动端,如果开发者开启了sdk辅助定位,那么安卓手机上我们会优先尝试调用sdk的定位接口,失败之后优先调用浏览器原生定位接口进行定位,浏览器定位失败之后尝试进行精确IP定位,如果以上三种定位全部尝试失败则返回error事件或回调error信息,否则和PC端的一样,定位成功之后进行高德坐标转化和地址融合。