项目中一开始混用了
getUserLocation
和
getCurrentPosition
###############
官方文档写的很不透彻,我在开发的过程中也是用的模棱两可。
写这篇文章是自己开发过程的一个记录,也是功能迭代优化的不断尝试。
希望最终能把他两说清楚。
###############
前提是配置好地图SDK需要的appkey;
混用的原因是:
- 不但需要准确的地理坐标,还需要具体省市区街道信息
- getUserLocation得到的坐标经过reverseGeocode反向地理编码拿到的address是String,信息量很少
- getCurrentPosition得到的address直接就是Object:country、province、city、district、street、poiName、cityCode。
这种数据用起来更方便。
同时还有String格式的addresses属性,基本可以理解为address对象中地址属性串联,但也不是机械的串联,中间存在有语意的形容词。
- 真机调试时getCurrentPosition取到的地理坐标偏差非常大,2km的级别。而getUserLocation相对比较准确。
这里有个大坑
getCurrentPosition优先使用的定位模块:amap>baidu>system,来自HTML5 官方文档
真机调试默认baidu地图,baidu地图默认bd09ll坐标系,而getCurrentPosition不设置参数的话默认amap是gcj02坐标系!!!
偏差不大就见鬼了!没有偏差gcj02岂不是搞了个国际笑话!
有偏差才正常!
HBuilder这个默认不一致的坑把我坑坏了
最后做性能和代码优化的时候,觉得这种做法有问题,不够优雅!就仔细研究了他两的区别。
总结如下:
- 真机调试虽然是通过手机启动服务,但是实际上使用的是HBuilder默认的配置
- 默认使用的地图provider是baidu,并且getUserLocation和reverseGeocode方法的coordType默认是bd09ll。
并且是不可以修改的!想用amap调试,只能一遍一遍的打包安装! - getCurrentPosition定位实际上是通过GPS定位,缺点是如果在室内使用4G网络,定位非常不准,使用WiFi比较准。
如果室外4G GPS的精度是最高的。这里要吐槽下,baidu的准确度木有amap高。 - 从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覆盖率非常高,基于位置的服务越来越多,用的人越来越多,基站定位可靠度也会越来越高。
补充:
- 坐标转换为什么不用convertCoordinates?
因为只有百度地图支持这个方法,我不希望被绑架。
后续测试有新发现了继续补充。
6 个评论
要回复文章请先登录或注册
skysowe
skysowe
DCloud_heavensoft
1***@qq.com
kika (作者)
雪之梦技术驿站