一:获取地理位置:

1、Geolocation接口

Geolocation 接口是一个用来获取设备地理位置的可编程的对象,它可以让Web内容访问到设备的地理位置,这将允许Web应用基于用户的地理位置提供定制的信息。就是用来获取到当前设备的经纬度(位置)

A: 事件:

window.navigator.geolocation.getCurrentPosition(success, error, options)

success: 成功的回调函数,获取位置成功则调用该回调

error: 获取位置失败时调用该回调函数

options: 获取当前位置的配置项参数 :{

1、enableHighAccuracy:表明应用是否使用最高精度;默认(false);

2、timeout: 表明的是设备必须在多长时间(单位毫秒)内返回一个位置; 默认(等待运行结果;意思是获取到一个位置之后, getCurrentPosition() 才会返回一个值。)

3、maximumAge:

在多少秒内可以获得缓存的位置; 如果设置为 0, 说明设备不能使用一个缓存位置,而且必须去获取一个真实的当前位置; 默认为0

}

  1. var options = {
  2. enableHighAccuracy: true,
  3. timeout: 5000,
  4. maximumAge: 0
  5. };
  6. function success(pos) {
  7. // pos.timestamp 表示获取到当前位置的事件戳
  8. var crd = pos.coords; // 返回一个定义了当前位置的Coordinates(坐标) 对象.
  9. console.log('Your current position is:');
  10. console.log('Latitude : ' + crd.latitude);
  11. console.log('Longitude: ' + crd.longitude);
  12. console.log('More or less ' + crd.accuracy + ' meters.');
  13. };
  14. function error(err) {
  15. console.warn('ERROR(' + err.code + '): ' + err.message);
  16. };
  17. navigator.geolocation.getCurrentPosition(success, error, options);

image.png

  1. function getPosition (timeout, enableHighAccuracy, maximumAge) {
  2. var timeout = timeout || 10000,
  3. enableHighAccuracy = enableHighAccuracy || false,
  4. maximumAge = maximumAge || 60000;
  5. return new Promise ((resolve, reject) => {
  6. // 不存在导航对象
  7. if( !navigator || !window.navigator ) {
  8. return reject('The browser is not suport navigator');
  9. }
  10. let options = {
  11. timeout, // 获取位置的事件,
  12. enableHighAccuracy, // 是否定位的精确度
  13. maximumAge, // 重复获取地理位置时隔多长时间再次获取
  14. };
  15. let success = function (pos) {
  16. console.log(11);
  17. let crd = pos.coords,
  18. posInfo = {
  19. latitude: crd.latitude, // 纬度
  20. longitude: crd.longitude, //经度
  21. accuracy: crd.accuracy, // latitude longitude 维度 经度
  22. }
  23. resolve(posInfo);
  24. }
  25. let error = function (err) {
  26. console.log(err);
  27. reject('ERROR(' + err.code + '): ' + err.message);
  28. }
  29. window.navigator.geolocation.getCurrentPosition(success, error, options)
  30. })
  31. }
  32. // 使用示例
  33. getPosition()
  34. .then((pos) => pos)
  35. .catch((err) => console.log(err));

B:geolocation对象中的方法

1、通过 geolocation.watchPosition() 设置一个位置改变监听器; 每当设备位置改变时,返回一个 long 类型的该监听器的ID值。

2、通过geolocation.clearPosition(ID) 来清除位置改变监听器

  1. // target 目标位置的经纬度 options 监听器的配置项
  2. function toDestination(target, options) {
  3. if(!target) throw new Error('Must to be set destination!');
  4. var id = null,
  5. options = options || {
  6. enableHighAccuracy: false, // 提高精度
  7. timeout: 10000, // 获取时间
  8. maximumAge: 0, // 在多少秒内可以获得缓存的位置
  9. };
  10. function success(pos) {
  11. let crd = pos.coords; // 位置坐标对象
  12. if (crd.latitude === target.latitude && crd.longitude === target.longitude) {
  13. // 到达目标位置后处理程序
  14. console.log('Your have arrvied!');
  15. // 清除位置监听器
  16. navigator.clearPosition(id);
  17. id = null;
  18. }
  19. }
  20. // 错误事件对象e中包含错误码和错误信息
  21. function error(err) {
  22. console.log(`err(${err.code}): ${err.message}`);
  23. }
  24. id = window.navigator.geolocation.watchPosition(success, error, options);
  25. }

2、通过devicemotion事件来判断手机摇晃的位置

方法:

属性:

1、场景:摇一摇;

image.png

3、deviceorientation事件:

属性:

e.alpha; 表示手机按z轴旋转的方向 (0 - 360)
e.beta; 表示手机在x轴上旋转的方向 (-180 - 180)
e.gamma 表示手机在y轴上旋转的方向 (-90 - 90)

场景:(指南针)

el.alopha: 范围在0左右的话,指向正北; 需进一步判断image.png