写点什么

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

  • 2022-12-04
    江苏
  • 本文字数:2440 字

    阅读完需:约 8 分钟

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

​一、前言

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

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

二、问题描述

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

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

    



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

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

 


      2.手机虽然可以实现定位,但是定位速度比较慢。跟网络有一定的关系。

三、优化方案

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

 
复制代码


	<!--百度地图-->	<script src="http://api.map.baidu.com/components?ak=bOwh2i9zIWG7Ucl8xPitV2TM&v=1.0"></script>	<script type="text/javascript" src="http://api.map.baidu.com/api?v=2.0&ak=bOwh2i9zIWG7Ucl8xPitV2TM"></script>
复制代码


	/*	 * 获取地理位置信息	 */	$rootScope.getAddr = function() {		console.log("定位操作ing..............");		/*-------------------- 利用百度API定位 ------------------------*/		var geolocation = new BMap.Geolocation();		geolocation.getCurrentPosition(			//获取位置信息成功			function(position){				if(this.getStatus() == BMAP_STATUS_SUCCESS){	//				alert('您的位置:' + position.point.lng + ',' + position.point.lat);					$rootScope.longitude = position.point.lng;					$rootScope.latitude  = position.point.lat;					// 根据坐标得到地址描述    					$rootScope.getGeo();				} else {					alert('无法获取定位信息,可能影响对服务药店的筛选');				}        			},{				// 指示浏览器获取高精度的位置,默认为false				enableHighAccuracy: true,				// 指定获取地理位置的超时时间,默认不限时,单位为毫秒	//	        timeout: 5000,				// 最长有效期(30S),在重复获取地理位置时,此参数指定多久再次获取位置		        maximumAge: 30*1000    		});	};
复制代码

HTML5 地理位置功能源码分析

源代码如下所示:


<!--百度地图--><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 定位?

      1、GPS 定位:根据设备 GPS 芯片和 GPS 卫星实现定位,GPS 定位在室内是不可以使用的。GPS 定位精度和芯片本身以及实际使用环境有关,一般情况下,GPS 定位精度在 10m 左右。

      2、基站定位:根据设备获取的基站信息实现定位,基站定位精度一般不受使用环境影响,主要和基站的覆盖半径有关。百度的基站定位服务精度目前在 200m 左右。

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

五、拓展阅读

发布于: 2022-12-04阅读数: 34
用户头像

No Silver Bullet 2021-07-09 加入

岂曰无衣 与子同袍

评论

发布
暂无评论
AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能_定位_No Silver Bullet_InfoQ写作社区