kika
kika
  • 发布:2017-07-26 20:16
  • 更新:2020-05-30 15:05
  • 阅读:6879

plus.maps.Map("xxx").getUserLocation VS plus.geolocation.getCurrentPosition

分类:HTML5+

项目中一开始混用了

getUserLocation

getCurrentPosition

###############
官方文档写的很不透彻,我在开发的过程中也是用的模棱两可。
写这篇文章是自己开发过程的一个记录,也是功能迭代优化的不断尝试。
希望最终能把他两说清楚。
###############

前提是配置好地图SDK需要的appkey;

混用的原因是:

  1. 不但需要准确的地理坐标,还需要具体省市区街道信息
  2. getUserLocation得到的坐标经过reverseGeocode反向地理编码拿到的address是String,信息量很少
  3. getCurrentPosition得到的address直接就是Object:country、province、city、district、street、poiName、cityCode。

    这种数据用起来更方便。

    同时还有String格式的addresses属性,基本可以理解为address对象中地址属性串联,但也不是机械的串联,中间存在有语意的形容词。

  4. 真机调试时getCurrentPosition取到的地理坐标偏差非常大,2km的级别。而getUserLocation相对比较准确。

这里有个大坑
getCurrentPosition优先使用的定位模块:amap>baidu>system,来自HTML5 官方文档
真机调试默认baidu地图,baidu地图默认bd09ll坐标系,而getCurrentPosition不设置参数的话默认amap是gcj02坐标系!!!
偏差不大就见鬼了!没有偏差gcj02岂不是搞了个国际笑话!
有偏差才正常!
HBuilder这个默认不一致的坑把我坑坏了

最后做性能和代码优化的时候,觉得这种做法有问题,不够优雅!就仔细研究了他两的区别。

总结如下:

  1. 真机调试虽然是通过手机启动服务,但是实际上使用的是HBuilder默认的配置
  2. 默认使用的地图provider是baidu,并且getUserLocation和reverseGeocode方法的coordType默认是bd09ll。
    并且是不可以修改的!想用amap调试,只能一遍一遍的打包安装!
  3. getCurrentPosition定位实际上是通过GPS定位,缺点是如果在室内使用4G网络,定位非常不准,使用WiFi比较准。
    如果室外4G GPS的精度是最高的。这里要吐槽下,baidu的准确度木有amap高。
  4. 从HTML5 官方文档看,getCurrentPosition通过手机GPS设备或其它信息如IP地址、移动网络信号获取。具体优先级策略不详。
    getUserLocation只有一句:获取用户当前位置信息将打开定位设备。
    getCurrentPosition默认采用amap,是gcj02坐标系,getUserLocation采用baidu的bd09ll坐标系。

通过测试发现:

  • 如果要使用getCurrentPosition,不论sdk是baidu还是amap,一定要注意设置对应的provider和coordsType。
  • 4G网络下,getCurrentPosition一定优先通过GPS定位,如果在室内就误差很大,定位非常不准。
  • 室内使用WiFi相比4G而言要准一些
  • WIFI就是IP地址或基站定位,准确度完全依赖于数据量,即调用得越多越准确。
  • getUserLocation应该是基于GPS定位,没有验证出来会不会使用基站。关键缺点是能获取到的信息量太少。
  • 我最终采用了getCurrentPosition来确定当前位置,毕竟getCurrentPosition可以自由切换定位方式,其次现在wifi覆盖率非常高,基于位置的服务越来越多,用的人越来越多,基站定位可靠度也会越来越高。

补充:

  1. 坐标转换为什么不用convertCoordinates?
    因为只有百度地图支持这个方法,我不希望被绑架。

后续测试有新发现了继续补充。

6 关注 分享
漠 sharper typer 2***@qq.com 2***@qq.com 糖猫猫

要回复文章请先登录注册

skysowe

skysowe

另外还有个坑,就是百度家的坐标跟别人不一样,需要做plus.maps.Map.convertCoordinates,高德不需要
2020-05-30 15:05
skysowe

skysowe

也踩了这个大坑,开发的时候,没注意,使用了默认设置,也就是amap,在开发基座上调试一切ok,然后app配置使用的是baidu的SDK,然后打包出来的位置就不对了,,,然后设置了一个变量 COORDTYPE == 'amap' ? {provider:'amap', coordsType:'gcj02'} : {provider:'baidu', coordsType:'gcj02'},最后调试的时候使用了自定义基座的方法,终于调试好了!
2020-05-30 15:04
DCloud_heavensoft

DCloud_heavensoft

uni-app的默认地图已经改为高德了,统一为gcj02坐标系
2019-04-01 06:01
1***@qq.com

1***@qq.com

真是个大坑啊
2017-11-07 16:16
kika

kika (作者)

回复 雪之梦技术驿站 :
重点就是说明白配置需要注意的点及原因
2017-07-27 11:09
雪之梦技术驿站

雪之梦技术驿站

明明一句话就能说清楚的事情,偏偏说得那么绕.getuser location和getcurrentposition并没有太大的区别 关键在于定位参数配置
2017-07-27 00:37