用高德js api做h5定位功能

定位失败?what

最近项目中有一需求要实现手机定位当前城市功能, 查了高德地图api,根据文档说明很快就做出来了。
AMap.plugin('AMap.CitySearch', function () {
var citySearch = new AMap.CitySearch()
citySearch.getLocalCity(function (status, result) {
if (status === 'complete' && result.info === 'OK') {
// 查询成功,result即为当前所在城市信息
}
})
})
然而在测试阶段,出现了一些问题:

当手机连接wifi的时候,明明在北京却定位到了上海,

或者在浙江的测试人员4g情况下无法定位

更或者河北的直接定位到了郑州......心里一片妈卖批。后台将高德的地图编码全都转成自己对应的数据了,这时候更改定位方式,保不齐要杀我祭天。

于是赶紧滚过去撸一下开发文档:

en ...似乎没什么问题

那么再去看看手机定位的原理吧。

手机定位的原理

一般情况下手机定位的方法有GPS定位、基站定位、WIFI定位、蓝牙定位、地磁定位等。其中蓝牙定位和地磁定位主要用于室内定位技术,在百度地图和高德地图的室内定位技术中应该都曾经尝试用过这两项技术,百度还专门投资了一家做地磁定位的芬兰新创企业IndoorAtlas。这两种方法一般人都用不到,可暂时略过。

1.GPS定位

利用手机中的GPS模块获取位置信息,不仅能获取经纬度,还能包括海拔高度、方向角度等信息。众多周知,GPS是通过三角定位的原理来实现定位的。即为了计算地面的空间坐标(x,y,z),理论上GPS接收机只要通过3颗卫星获取当前位置到三颗卫星的距离,就可以构造三个方程求解三个未知参数x,y,z。但实际上卫星钟与GPS接收机的石英钟是不同步,这样就会出现一个新的未知数-时钟差,因此就需要同时接收到4颗以上的卫星信号构造四个方程来求解定位点坐标。

在城市高楼林立的环境下,GPS信号遮挡严重,所以定位效果要比在开阔地差很多。除此观测卫星数量的原因外,复杂的环境也是降低GPS自身的精度的原因所在。

大气层影响

扫描二维码关注公众号,回复: 4173573 查看本文章

大气层中的电离层和对流层对GPS信号会起到延迟的作用,电离层对电磁波的折射效应使得GPS信号的传播速度发生变化,对流层同样会对电磁波产生折射效应,从而影响GPS信号的传播速度。

卫星星历误差

卫星星历是由地面监控站跟踪监测卫星求定的。由于卫星运行中要受到多种摄动力的复杂影响,而通过地面监控站又难以充分可靠地测定这些作用力或掌握其作用规律,因此在星历预报时会产生较大的误差。它不仅严重影响单点定位的精度,也是精密相对定位的重要误差来源。

卫星时钟误差

卫星钟差是指GPS卫星时钟与GPS标准时间的差别。为了保证时钟的精度,GPS卫星均采用高精度的原子钟,但它们与GPS标准时之间的偏差和漂移和漂移总量仍在1ms~0.1ms以内,由此引起的等效误差将达到300km~30km。这是一个系统误差必须加于修正。

多径效应

多径效应由于接收终端周围环境的影响,使得接收机所接收到的卫星信号中还包含有反射和折射信号的影响,这也是影响在室内和城市楼宇密集的地区定位偏差大的一大因素。

  1. 基站定位

基站定位主要是通过移动网络运营商搭建的基站实现定位。它的基本原理是通过移动设备测量不同基站的下行导频信号,得到不同基站下行导频的TOA(Time of Arrival,到达时刻)或TDOA(Time Difference of Arrival,到达时间差),根据该测量结果并结合基站的坐标采用三角公式估计算法,就能够计算出移动设备的位置。一般而言,移动设备观测到的基站数目越多,测量精度越高,定位性能改善越明显。

所以基站定位精度依赖于基站的密度,密度越大,定位越精确。

  1. WIFI定位

它的原理大概如下:每一个无线AP都有一个全球唯一的MAC地址(中国山寨比较多,所以在中国的WIFI定位技术会更加复杂),并且一般来说无线AP在一段时间内是不会移动的; 设备在开启Wi-Fi的情况下,即可扫描并收集周围的AP信号,无论是否加密,是否已连接,甚至信号强度不足以显示在无线信号列表中,都可以获取到AP广播出来的MAC地址;设备将这些能够标示AP的数据发送到位置服务器,服务器检索出每一个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到用户设备.

WIFI定位的精度取决于位置服务商的数据库的准确度和实时性。有的时候你可能会发现自己搬家到了一个新的地方,把之前的路由器也带过来了,一段时间内手机定位总是把你定位到之前住的地方,就是这个原因。

各种定位方法自身的缺陷和误差都会导致定位结果的误差。当然国内为了国家安全的考量,会对电子地图供应商的定位结果进行非线性偏移,这种被称为火星坐标系的偏移也会造成定位精度的偏差。

排查问题

在仔细看完定位原理和高德地图api的文档, 发现高德的citySearch方法仅仅支持ip定位。

地理定位

高德地图的geolocation定位方式说明中提及了整合了浏览器定位、精确IP定位、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); //返回定位出错信息
});
在这段代码中有很多配置项,那么定位是否也能进行配置呢?

找到它 进行配置就可以了。

然而问题并非能这么快解决的, 高德的ip城市定位和地理定位方法返回的adcode值是不一致的;ip城市定位的adcode 仅仅代表市,比如北京市:110000, 而在地理定位中的adcode 可以直接定位到区,比如城市仍可以继续显示北京市,而adcode的值却变成了 110108。那么这时,就需要跟后端协商确认是否已经将所有的省市区的编码入库。另外仍需要考虑实际问题是全国的各种高新技术开发区或者区与区之间的合并都会引起数据错误,也都需要及时进行更新国家标准城市编码信息。

如何改善用户体验

在定位系统无法做到万无一失的情况下, 加入手动选择所在城市是一个不错的选择。

例如京东的定位功能然错把北京的我定位到了湖北,但它附加的手动选择很好的补全了定位不准的问题。

==嗯,快去跟产品设计好好聊会天了。

前端小白一枚, 欢迎指正。

猜你喜欢

转载自www.cnblogs.com/lanhuona/p/9995844.html
今日推荐