当前位置:   article > 正文

uniApp写小程序获取位置,并获取两经纬度之间的直线距离_uniapp 小程序获取位置信息并显示地图

uniapp 小程序获取位置信息并显示地图

小程序获取位置时,在manifest.json文件中小程序配置打开定位申请,再切换到源码试图在'mp-weixin'中加入

"requiredPrivateInfos": ["getLocation", "chooseLocation"]

我是用的高德地图获取周围建筑物名称,在页面中获取位置

  1. onLoad() {
  2. this.amapPlugin = new amap.AMapWX({
  3. //填写高德地图的key
  4. key: this.$gaodeKey,
  5. });
  6. },
  7. onShow() {
  8. //每次进入页面获取一下当前位置
  9. this.getRegeo()
  10. }

获取位置的方法:在methods中

获取经纬度使用uniAPI,获取周边信息使用高德地图,因为uniAPI获取的经纬度比高德的精准

  1. getRegeo() {
  2. let that = this
  3. //使用uni的方法获取经纬度
  4. uni.authorize({
  5. scope: 'scope.userLocation',
  6. success: res => {
  7. that.permissions = true
  8. uni.getLocation({
  9. type: 'gcj02',
  10. geocode:true,
  11. success: function(res) {
  12. // 保留小数点后6位
  13. that.latitude = res.latitude.toFixed(6)
  14. that.longitude = res.longitude.toFixed(6)
  15. let la1 = res.latitude.toFixed(6)
  16. let lo1 = res.longitude.toFixed(6)
  17. let isDistanceList = that.rulesDataInfo.locationList.map((item,index) => {
  18. let la2 = Number(item.latitude)
  19. let lo2 = Number(item.longitude)
  20. return that.distance(la1, lo1, la2, lo2) <= item.locationScope
  21. })
  22. //isRange 是声明的变量,用来确定当前位置是否在规定的范围中
  23. that.isRange = !!isDistanceList.find((item) => {
  24. // 如果没有在范围内返回undefined
  25. return item == true
  26. })
  27. },
  28. fail:function(err){
  29. console.log('定位出差错了' + JSON.stringify(err))
  30. }
  31. });
  32. //这个是高德地图的方法获取周围建筑物的名称
  33. this.amapPlugin.getRegeo({
  34. success: (data) => {
  35. this.locationName = data[0].desc;
  36. },
  37. });
  38. },
  39. fail: error => {
  40. // console.log('没同意权限', error)
  41. if(!this.permissions){
  42. this.openConfirm()
  43. }
  44. }
  45. })
  46. },

这里使用uni.getLocation方法获取经纬度,并使用gcj02定位,因为在使用过程中发现高德地图的定位经纬度存在偏差,所以换成了uni的方法,其中la1,lo1是当前用户的经纬度,la2,lo2是我后台返回的经纬度,方法distance()是我判断两个经纬度之间直线距离的方法,传入四个参数

fail中返回失败的原因,判断permissions的值来判断是不是因为没有位置权限

distance方法:

  1. distance(la1, lo1, la2, lo2) {
  2. // la1·lo1是用户位置 la2·lo2是规则定的位置
  3. var La1 = la1 * Math.PI / 180.0;
  4. var La2 = la2 * Math.PI / 180.0;
  5. var La3 = La1 - La2;
  6. var Lb3 = lo1 * Math.PI / 180.0 - lo2 * Math.PI / 180.0;
  7. var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(La3 / 2), 2) + Math.cos(La1) * Math.cos(La2) * Math.pow(
  8. Math.sin(Lb3 / 2), 2)));
  9. s = s * 6378.137; //地球半径
  10. s = Math.round(s * 10000) / 10000 * 1000;
  11. // console.log("两点直线距离m:",s);
  12. return s;
  13. },

因为获取用户位置需要授权,当用户没有授权时就需要提示用户获取权限

  1. openConfirm() {
  2. return new Promise((resolve, reject) => {
  3. uni.showModal({
  4. title: '请求授权当前位置',
  5. content: '打卡功能需要获取地理位置信息',
  6. success: res => {
  7. if (res.confirm) {
  8. uni.openSetting().then(res => {
  9. if (res[1].authSetting['scope.userLocation'] === true) {
  10. // console.log('同意了权限:', res)
  11. //使用一个变量来保存获取到权限的状态
  12. this.permissions = true
  13. this.getRegeo()
  14. }
  15. })
  16. } else if (res.cancel) {
  17. // console.log('用户点击了取消')
  18. }
  19. },
  20. })
  21. })
  22. },

效果如图:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/215781
推荐阅读
相关标签
  

闽ICP备14008679号