多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# 在AngularJS应用中集成百度地图实现定位功能 **[注:请点击此处进行充电!](http://blog.csdn.net/sunhuaqiang1/article/details/50193301#t2)** ### 前言 根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务。 添加第三方模块的步骤与前面介绍的“[在AngularJS应用中集成科大讯飞语音输入功能](http://blog.csdn.net/sunhuaqiang1/article/details/50193301#t2)”步骤相同,在此不再赘述。 ### 问题 1.有些手机无法实现定位功能(以我的手机为例:MX2,刚开始时可以实现定位,后来就出现无法定位的情况,手机定位功能也已经打开)。 一部分原因是有些手机真的没有打开定位功能。(经过检查手机设置,还真是发现自己将手机定位功能给关闭了,打开手机定位功能后,定位正常)截图如下:     ![](https://box.kancloud.cn/2016-03-02_56d6ad92c6c51.jpg)         ![](https://box.kancloud.cn/2016-03-02_56d6ad92d880d.jpg) 经过测试发现了与微信授权类似的问题:在真机测试是没有问题的,打包成APK,然后再在手机上运行则出现无法定位的情况。难道又是因为“真机调试的时候使用的是HBuilder基座的参数”? 但是在别的手机安装APK之后运行结果正常,截图如下:  ![](https://box.kancloud.cn/2016-03-02_56d6ad92eadd7.jpg) 2.手机虽然可以实现定位,但是定位速度比较慢。 跟网络有一定的关系。 ### 优化 ### 源码分析 源代码如下所示: ~~~ <!--百度地图--> <script src="http://api.map.baidu.com/components?ak=bOwh2i9zIWG7Ucl8xPitV2TM&v=1.0"> </script> /* * 获取地理位置信息 */ $rootScope.getAddr = function() { if (navigator.geolocation) { navigator.geolocation.getCurrentPosition( //获取位置信息成功 function(position) { $rootScope.latitude = position.coords.latitude; $rootScope.longitude = position.coords.longitude; var myGeo = new BMap.Geocoder(); //根据坐标得到地址描述 $rootScope.getGeo(); }, //获取位置信息失败 function(error) { switch (error.code) { case error.PERMISSION_DENIED: $rootScope.showAlert("请打开设备定位功能!"); break; case error.POSITION_UNAVAILABLE: $rootScope.showAlert("定位信息不可用!"); break; case error.TIMEOUT: $rootScope.showAlert("定位请求超时!"); break; case error.UNKNOWN_ERROR: $rootScope.showAlert("未知错误!"); break; } }, { // 指示浏览器获取高精度的位置,默认为false enableHighAccuracy: true, // 指定获取地理位置的超时时间,默认不限时,单位为毫秒 timeout: 5000, // 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。 maximumAge: 3000 }); } else { $rootScope.showAlert("您的设备不支持GPS定位!"); } }; $rootScope.getAddr(); $rootScope.getGeo = function() { var myGeo = new BMap.Geocoder(); // 根据坐标得到地址描述 myGeo.getLocation(new BMap.Point($rootScope.longitude, $rootScope.latitude), function(result) { if (result) { console.log(JSON.stringify(result)); $rootScope.geoaddress = { 'fulladdress': result.addressComponents.city + result.addressComponents.district + result.addressComponents.street, 'city': result.addressComponents.city, 'area': result.addressComponents.district, 'street': result.addressComponents.street, }; console.log(JSON.stringify($rootScope.geoaddress)); }else { $rootScope.showAlert("定位失败,地址解析失败"); } }); }; ~~~ ### 感悟 通过阅读参考资料3,得知上面使用的定位方式是采用的 HTML5 的地理位置功能。 ### 注: 总的来说,在PC的浏览器中 HTML5 的地理位置功能获取的位置精度不够高,如果借助这个 HTML5 特性做一个城市天气预报是绰绰有余,但如果是做一个地图应用,那误差还是太大了。不过,如果是移动设备上的 HTML5 应用,可以通过设置 enableHighAcuracy 参数为 true,调用设备的 GPS 定位来获取高精度的地理位置信息。 ### 附: ### 手机定位方式汇总 GPS,基站,Wi-Fi等多种定位方式 ### 什么是GPS定位、基站定位和Wi-Fi定位? 1、GPS定位:根据设备GPS芯片和GPS卫星实现定位,GPS定位在室内是不可以使用的。GPS定位精度和芯片本身以及实际使用环境有关,一般情况下,GPS定位精度在10m左右。 2、基站定位:根据设备获取的基站信息实现定位,基站定位精度一般不受使用环境影响,主要和基站的覆盖半径有关。百度的基站定位服务精度目前在200m左右。 3、Wi-Fi定位:根据设备获取的Wi-Fi的信息进行定位,Wi-Fi定位精度一般不受使用环境影响,主要和Wi-Fi半径,密度有关。百度的Wi-Fi定位精度目前在20m左右。 ### 疑问 如何判断手机的定位方式? ### 附加奖励 额外发现一个问题:当手机出现定位失败的情况,如何处理?移动端在软件逻辑设计上还存在缺陷。 ### 参考资料: 1. [http://www.html5plus.org/doc/zh_cn/maps.html](http://www.html5plus.org/doc/zh_cn/maps.html) 2. [http://blog.csdn.net/smok56888/article/details/20628161](http://blog.csdn.net/smok56888/article/details/20628161) 3. [http://www.cnblogs.com/lhb25/archive/2012/07/10/html5-geolocation-api-demo.html](http://www.cnblogs.com/lhb25/archive/2012/07/10/html5-geolocation-api-demo.html) 4. [http://www.cnblogs.com/lhb25/archive/2012/07/06/html5-geolocation-api-demo.html](http://www.cnblogs.com/lhb25/archive/2012/07/06/html5-geolocation-api-demo.html) 5. [http://www.zgxue.com/170/1700801.html](http://www.zgxue.com/170/1700801.html) 6. [http://blog.csdn.net/cyzero/article/details/42584193](http://blog.csdn.net/cyzero/article/details/42584193) 7. [http://blog.csdn.net/zuowensheng/article/details/7800308](http://blog.csdn.net/zuowensheng/article/details/7800308) 8. [http://www.html5plus.org/doc/zh_cn/maps.html#plus.maps.Map.getUserLocation](http://www.html5plus.org/doc/zh_cn/maps.html#plus.maps.Map.getUserLocation)