微信小程序中使用 wx.getLocation获取当前详细位置并计算距离

前言

wx.getLocation只能够获取经纬度,不能够拿到详细地址;如果你的项目刚好也使用腾讯地图的api,那么可以通过腾讯地图的逆解析就能拿到详细地址了;

1,wx.getLocation()

先介绍一下wx.getLocation()方法的使用; 此方法可以获取当前的经纬度和速度、高度;官网链接

想要使用这个方法,先需要在小程序后台 《开发管理-接口设置》中开通接口权限,需要审核通过才能使用:

在这里插入图片描述

注意:自 2022 年 7 月 14 日后发布的小程序,若使用该接口,需要在 app.json 中进行声明,否则将无法正常使用该接口;如下:
app.json

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

开始使用:

wx.getLocation({
    type: 'gcj02', // 比较精确
    success: (res) => {
     console.log(res);
    }
  })

那么此接口只能获取到当前的经纬度 并不是当前的省市区街道等地址;下面我们会配合使用腾讯地图的api进行地址的逆解析获取详细地址;

2,获取详细地址

第一步:在腾讯位置服务注册获取key或公司里面已经获取过key: 腾讯地图官方链接

第二步:就是在小程序的《开发管理-域名服务器》中的request合法域名中添加一行:https://apis.map.qq.com

在这里插入图片描述
第三步:在app.json中添加:

  "permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序位置接口的效果展示"
    }
  }

第四步:我是在onLoad生命周期加载的代码,你可以根据具体情况把下面代码复制到其他相应位置;

先下载jssdk文件解压后放到相应位置

// 引入SDK核心类
let QQMap = require("../../utils/qqmap-wx-jssdk.min"); 
let QQMapSdk;
Page({
    
/**
 * 页面的初始数据
 */
data: {
  currentLat:"",
  currentLon:"",
},
})
  	/**
   * 生命周期函数--监听页面加载
   */
  	onLoad(query){
   		this.getLoaction()
	}
	// 获取位置的方法
	 getLoaction() {
        // 1.先开始定位
        wx.getLocation({
          type: 'gcj02', // 比较精确
          success: (res) => {
            // 2,地址逆解析  根据经纬度获取实际地址
            QQMapSdk.reverseGeocoder({
              location: {
                latitude: res.latitude,
                longitude: res.longitude
              },
              success: (data) => {
                console.log("当前地址信息:", data);
                // 存储 详细地址 和当前获取的经纬度
                let address = data.result.address + data.result.formatted_addresses.recommend;
                this.setData({
                  currentLoaction: address,
                  currentLat: data.result.location.lat,
                  currentLon: data.result.location.lng
                })
            
              },
              fail: (error) => {
                console.error("err:", error)
              },
            })
          }
        })
      }

3,计算距离

可以使用 calculateDistance 方法计算两地经纬度之间的距离;

   // 计算两个经纬度的直线距离 https://lbs.qq.com/miniProgram/jsSdk/jsSdkGuide/methodCalculatedistance
     calculateDistanceFun(){
        QQMapSdk.calculateDistance({
            mode: 'straight',//直线距离
            // 起点坐标
            from: {
              latitude: this.data.latlon.lat,
              longitude: this.data.latlon.lon
            },
            // 终点坐标 to是当前位置 注意是一个数组
            to: [{
              latitude: data.result.location.lat,
              longitude: data.result.location.lng
            }],
            success: (calc) => {
              // 计算结果输出为米
              let distance = calc.result.elements[0].distance;
              console.log("计算距离为:", distance + '米');
            },
            // 失败的情况
            fail: (error) => {
              console.error('error:', error);
            },
          })
     }

4,报错信息: getLocation:fail 频繁调用会增加电量损耗

如果出现以下报错信息说明:

在这里插入图片描述

我们在调用wx.getLocation()方法的回调里面又直接调用了腾讯地图的reverseGeocoder方法(腾讯地图api也可能也调用了wx.getLocation()方法 导致间隔不够30秒报频繁调用)

解决方法:调用 reverseGeocoder方法时 传入经纬度即可,什么都不传就会报这个错误;

 		qqmapsdk.reverseGeocoder({
 			//传入当前的经纬度
              location: {
                latitude: res.latitude,
                longitude: res.longitude
              },
              success: (data) => {
              },
              fail: (error) => {
                console.error("err:", error)
              },
            })

5,报错信息: 请求源未被授权

出现这个报错说明 你引用的key值 没有授权你当前电脑的ip地址;

在这里插入图片描述


解决方法:

需要在腾讯地图的后台配置一下你的ip;并把允许在小程序中使用勾选上;
在这里插入图片描述
WebServiceAPI Key配置中的授权IP

### 实现 UniApp 页面左上角返回按钮功能 在 UniApp 中实现页面左上角的返回按钮功能主要涉及两个方面:一是确保返回按钮正常显示可点击;二是处理返回操作的具体逻辑。 #### 方法一:通过 `pages.json` 配置文件控制 对于希望自定义或调整返回按钮的行为,可以在项目的 `pages.json` 文件中进行相应配置。具体来说,在目标页面路径下添加或修改 `"navigationStyle"` 和其他相关属性来满足需求: ```json { "path": "pages/examplePage/index", "style": { "navigationBarTitleText": "示例页面", "navigationStyle": "custom" } } ``` 当设置 `"navigationStyle": "custom"` 后,默认顶部栏会被移除,此时开发者可以根据实际需要自行构建导航条,加入返回图标及其事件绑定[^1]。 #### 方法二:利用生命周期钩子与 JavaScript API 处理返回动作 除了静态配置外,还可以借助 Vue 组件内的生命周期方法(如 `mounted()`),以及调用框架提供的 API 来动态管理返回行为。例如,在某些情况下可能需要阻止默认的物理按键回退或是执行特定条件下的跳转: ```javascript export default { mounted() { // 监听硬件返回键 (仅限 Android 设备) plus.key.addEventListener('backbutton', function () { uni.showModal({ title: '提示', content: '您确定要退出吗?', success(res) { if (res.confirm) { uni.navigateBack(); } }, }); }); // 或者简单地重定向至指定页面而不弹窗确认 // uni.redirectTo({ url: '/otherPath' }); }, onUnload() { // 移除监听器防止内存泄漏 plus.key.removeEventListener('backbutton'); } }; ``` 需要注意的是上述代码片段适用于 HBuilderX 编译环境下的 App 构建项目。如果是针对微信小程序,则应考虑使用其特有的接口来进行类似的操作[^3]。 另外,如果遇到即使按照文档说明设置了 `autoBackButton:false` 却仍然无法生效的情况,可能是由于不同平台渲染机制差异所致。这时可以通过 DOM 操作的方式强行隐藏该元素作为临时解决方案,但这不是推荐的做法,因为这可能会带来兼容性和用户体验上的问题[^2]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值