在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等多种定位方式

什么是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

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

AngularJS进阶(十九)在AngularJS应用中集成百度地图实现定位功能的更多相关文章

  1. Android Studio 项目中集成百度地图SDK报Native method not found: com.baidu.platform.comjni.map.commonmemcache.JNICommonMemCache.Create:()I错误

    Android Studio 项目中集成百度地图SDK报以下错误: java.lang.UnsatisfiedLinkError: Native method not found: com.baidu ...

  2. 在Fragment中实现百度地图,定位到当前位置(基于SDKv2.1.0)

    使用最新版本的百度地图需要注意的几个地方: 1.libs文件夹下要有android-support-v4.jar.baidumapapi_v2_1_0.jar.locSDK_3.1.jar三个jar包 ...

  3. AngularJS进阶(十八)在AngularJS应用中集成科大讯飞语音输入功能

    在AngularJS应用中集成科大讯飞语音输入功能 注:请点击此处进行充电! 前言 根据项目需求,需要在首页搜索框中添加语音输入功能,考虑到科大讯飞语音业务的强大能力,遂决定使用科大讯飞语音输入第三方 ...

  4. Android应用中使用百度地图API定位自己的位置(二)

    官方文档:http://developer.baidu.com/map/sdkandev-6.htm#.E7.AE.80.E4.BB.8B3 百度地图SDK为开发人员们提供了例如以下类型的地图覆盖物: ...

  5. J2EE进阶(十九)FileNotFoundException: http://hibernate.org/dtd/hibernate-mapping-3.0.dtd

    J2EE进阶(十九)Nested exception: java.io.FileNotFoundException: http://hibernate.org/dtd/hibernate-mappin ...

  6. Android进阶(十九)AndroidAPP开发问题汇总(三)

    Android进阶(十九)AndroidAPP开发问题汇总(三) Java解析XML的几种方式: http://inotgaoshou.iteye.com/blog/1012188 从线程返回数据的两 ...

  7. “全栈2019”Java第八十九章:接口中能定义内部类吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  8. “全栈2019”Java第七十九章:类中可以嵌套接口吗?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  9. Egret入门学习日记 --- 第十九篇(书中 8.8~8.10 节 内容)

    第十九篇(书中 8.8~8.10 节 内容) 开始 8.8节. 重点: 1.类型推断. 2.类型强制转换,使其拥有代码提示功能. 3.除了TS自带的类型判断,Egret官方也提供了类型判断的方法. 操 ...

随机推荐

  1. EBS业务学习之应付INVOICE类型

    INVOICE类型 类      型 描           述 标准INVOICE 是指由于采购货物或接受劳务,从供应商处取得的INVOICE (标准INVOICE,既可以和订单匹配,也可以不匹配) ...

  2. java的断言(assert)

    概述 在C和C++语言中都有assert关键,表示断言.在Java中,同样也有assert关键字,表示断言,用法和含义都差不多.在Java中,assert关键字是从JAVA SE 1.4 引入的,为了 ...

  3. 求链表倒数第n个元素

    提示:设置一前一后两个指针,一个指针步长为1,另一个指针步长为n,当一个指针走到链表尾端时, 另一指针指向的元素即为链表倒数第n个元素. #include <stdio.h> #inclu ...

  4. Afianl加载网络图片(续)

    上一篇已经讲了如何利用Afianl加载网络图片和下载文件,这篇文章将继续讲解使用Afinal加载网络图片的使用,主要结合listview的使用: 看效果图: listview在滑动过程中没用明显卡顿, ...

  5. SQL Server 索引维护(1)——如何获取索引使用情况

    前言: 在前面一文中,已经提到了三类常见的索引问题,那么问题来了,当系统出现这些问题时,该如何应对? 简单而言,需要分析现有系统的行为,然后针对性地对索引进行处理: 对于索引不足的情况:检查缺少索引的 ...

  6. Java基本语法-----java关键字

    1.1关键字的概述 Java的关键字对java的编译器有特殊的意义,他们用来表示一种数据类型,或者表示程序的结构等,关键字不能用作变量名.方法名.类名.包名. 1.2常见的关键字 备注: 不必死记硬背 ...

  7. java虚拟机 jvm 栈数据区

    java栈帧还是需要一些数据支持常量池的解析.正常方法的返回和异常的处理.大部分的java字节码指令需要进行常量池的访问,在栈帧数据区中保存着访问常量池的指针,方便程序访问java常量池.如下图所示: ...

  8. iOS 10 推送全解析,注意事项

    本文旨在对 iOS 推送进行一个完整的剖析,如果你之前对推送一无所知,那么在你认真地阅读了全文后必将变成一个推送老手,你将会对其中的各种细节和原理有充分的理解.以下是 pikacode 使用 iOS ...

  9. TortoiseSVN服务器ip地址修改后如何使用

    TortoiseSVN是很多人特别是程序员经常使用的工作追述工具,在长期使用过程中难免会遇到服务器迁移ip地址变更的问题.那么在服务器ip地址变化之后,我们要如何继续使用呢?步骤其实非常简单,下面我们 ...

  10. Android面试题目总结

    1.java 基础题,输入结果是什么? public static void main(String[] args) { String str = new String("abc" ...