AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能

来源:互联网 发布:网络消费者服务热线 编辑:程序博客网 时间:2024/06/09 17:29

在AngularJS应用中集成百度地图实现定位功能

注:请点击此处进行充电!

前言

      根据项目需求,需要实现手机定位功能,考虑到百度业务的强大能力,遂决定使用百度地图第三方服务。

      添加第三方模块的步骤与前面介绍的“在AngularJS应用中集成科大讯飞语音输入功能”步骤相同,在此不再赘述。


问题

      1.有些手机无法实现定位功能(以我的手机为例:MX2,刚开始时可以实现定位,后来就出现无法定位的情况,手机定位功能也已经打开)

      一部分原因是有些手机真的没有打开定位功能。(经过检查手机设置,还真是发现自己将手机定位功能给关闭了,打开手机定位功能后,定位正常)截图如下:

            

      经过测试发现了与微信授权类似的问题:在真机测试是没有问题的,打包成APK,然后再在手机上运行则出现无法定位的情况。难道又是因为“真机调试的时候使用的是HBuilder基座的参数”?

      但是在别的手机安装APK之后运行结果正常,截图如下:

 

      2.手机虽然可以实现定位,但是定位速度比较慢。

      跟网络有一定的关系。

优化

百度地理位置功能源码分析

[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1.   
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <!--百度地图-->  
  2. <script src="http://api.map.baidu.com/components?ak=bOwh2i9zIWG7Ucl8xPitV2TM&v=1.0"></script>  
  3. <script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bOwh2i9zIWG7Ucl8xPitV2TM"></script>  
[html] view plain copy print?在CODE上查看代码片派生到我的代码片
  1.     /*  
  2.      * 获取地理位置信息  
  3.      */  
  4.     $rootScope.getAddr = function() {  
  5.         console.log("定位操作ing..............");  
  6.         /*-------------------- 利用百度API定位 ------------------------*/  
  7.         var geolocation = new BMap.Geolocation();  
  8.         geolocation.getCurrentPosition(  
  9.             //获取位置信息成功  
  10.             function(position){  
  11.                 if(this.getStatus() == BMAP_STATUS_SUCCESS){  
  12.     //              alert('您的位置:' + position.point.lng + ',' + position.point.lat);  
  13.                     $rootScope.longitude = position.point.lng;  
  14.                     $rootScope.latitude  = position.point.lat;  
  15.                     // 根据坐标得到地址描述      
  16.                     $rootScope.getGeo();  
  17.                 } else {  
  18.                     alert('无法获取定位信息,可能影响对服务药店的筛选');  
  19.                 }          
  20.             },{  
  21.                 // 指示浏览器获取高精度的位置,默认为false  
  22.                 enableHighAccuracy: true,  
  23.                 // 指定获取地理位置的超时时间,默认不限时,单位为毫秒  
  24.     //          timeout: 5000,  
  25.                 // 最长有效期(30S),在重复获取地理位置时,此参数指定多久再次获取位置  
  26.                 maximumAge: 30*1000  
  27.             });  
  28.     };  

HTML5地理位置功能源码分析

源代码如下所示:

[javascript] view plain copy print?在CODE上查看代码片派生到我的代码片
  1. <!--百度地图-->  
  2. <script src="http://api.map.baidu.com/components?ak=bOwh2i9zIWG7Ucl8xPitV2TM&v=1.0">  
  3. </script>  
  4. /* 
  5.  * 获取地理位置信息 
  6.  */  
  7. $rootScope.getAddr = function() {  
  8. if (navigator.geolocation) {  
  9. navigator.geolocation.getCurrentPosition(  
  10. //获取位置信息成功  
  11. function(position) {  
  12. $rootScope.latitude = position.coords.latitude;  
  13. $rootScope.longitude = position.coords.longitude;  
  14. var myGeo = new BMap.Geocoder();  
  15. //根据坐标得到地址描述      
  16. $rootScope.getGeo();  
  17. },  
  18. //获取位置信息失败  
  19. function(error) {  
  20. switch (error.code) {  
  21. case error.PERMISSION_DENIED:  
  22. $rootScope.showAlert("请打开设备定位功能!");  
  23. break;  
  24. case error.POSITION_UNAVAILABLE:  
  25. $rootScope.showAlert("定位信息不可用!");  
  26. break;  
  27. case error.TIMEOUT:  
  28. $rootScope.showAlert("定位请求超时!");  
  29. break;  
  30. case error.UNKNOWN_ERROR:  
  31. $rootScope.showAlert("未知错误!");  
  32. break;  
  33. }  
  34. },  
  35. {  
  36.         // 指示浏览器获取高精度的位置,默认为false  
  37.         enableHighAccuracy: true,  
  38.         // 指定获取地理位置的超时时间,默认不限时,单位为毫秒  
  39.         timeout: 5000,  
  40.         // 最长有效期,在重复获取地理位置时,此参数指定多久再次获取位置。  
  41.         maximumAge: 3000  
  42.     });  
  43. else {  
  44. $rootScope.showAlert("您的设备不支持GPS定位!");  
  45. }  
  46. };  
  47.    
  48. $rootScope.getAddr();  
  49.    
  50. $rootScope.getGeo = function() {  
  51. var myGeo = new BMap.Geocoder();  
  52. // 根据坐标得到地址描述      
  53. myGeo.getLocation(new BMap.Point($rootScope.longitude, $rootScope.latitude), function(result) {  
  54. if (result) {  
  55. console.log(JSON.stringify(result));  
  56. $rootScope.geoaddress = {  
  57. 'fulladdress': result.addressComponents.city + result.addressComponents.district + result.addressComponents.street,  
  58. 'city': result.addressComponents.city,  
  59. 'area': result.addressComponents.district,  
  60. 'street': result.addressComponents.street,  
  61. };  
  62. console.log(JSON.stringify($rootScope.geoaddress));  
  63. }else {  
  64. $rootScope.showAlert("定位失败,地址解析失败");  
  65. }  
  66. });  
  67. };  

感悟

     通过阅读参考资料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左右。

      3Wi-Fi定位:根据设备获取的Wi-Fi的信息进行定位,Wi-Fi定位精度一般不受使用环境影响,主要和Wi-Fi半径,密度有关。百度的Wi-Fi定位精度目前在20m左右。

疑问

如何判断手机的定位方式?

附加奖励

额外发现一个问题:当手机出现定位失败的情况,如何处理?移动端在软件逻辑设计上还存在缺陷。

参考资料:

1. http://www.html5plus.org/doc/zh_cn/maps.html

2. http://blog.csdn.net/smok56888/article/details/20628161

3. 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

5. http://www.zgxue.com/170/1700801.html

6. http://blog.csdn.net/cyzero/article/details/42584193

7. http://blog.csdn.net/zuowensheng/article/details/7800308

8. http://www.html5plus.org/doc/zh_cn/maps.html#plus.maps.Map.getUserLocation

0 0