小程序地理定位是指通过小程序开发平台提供的 API 来获取用于的地理位置信息。用户再使用小程序时,可以授权小程序获取自己的地理位置信息

  1. wx.getLocation( ) :获取当前的地理位置
  2. wx.chooseLocation( ):打开地图选择位置
    申请开通:
    暂时支队部分类目的小程序开放,需要先通过类目审核,然后再小程序管理开发后台,【开发】- 【开发管理】- 【接口设置】中自助开通该接口权限。

使用方法

  1. 在 app.json 中配置 “requiredPrivateInfos”: [“getLocation”] 进行声明启用
  2. 在 调用 wx.getLocation() 时需要在 app.json 配置 permission 字段,同时使用 scope.userLocation 声明 收集用户选择的位置信息的目的, wx.chooseLocation() 接口不需要配置该字段,可以直接进行调用
    "permission": { "scope.userLocation": { "desc": "获取地理位置信息用于填写收货地址" } }
  3. 在配置好以后,调用 wx.getLocation() 和 wx.chollseLocation() 接口
示例 :app.json
"requiredPrivateInfos": ["getLocation", "chooseLocation"],
  "permission": {
    "scope.userLocation": {
      "desc": "获取地理位置信息用于填写收货地址"
    }
  }
示例:使用的文件
const res = await wx.getLocation()
const res = await wx.chooseLocation()

注意 wx.getLocation 拒绝授权后的解决方案

在用户拒绝授权以后,如果再次调用 getLocation 不会再弹出授权弹框
在这里插入图片描述

Error: MiniProgramError
{“errMsg”:“getLocation:fail auth deny”}
at Object.errorReport (WAServiceMainContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at Function.thirdErrorReport (WAServiceMainContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at Object.thirdErrorReport (WAServiceMainContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at i (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at Object.cb (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at q._privEmit (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at q.emit (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1
at n (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)
at $e (WASubContext.js?t=wechat&s=1721270018877&v=3.4.10:1)(env: Windows,mp,1.06.2405020; lib: 3.4.10)

解决办法

在这里插入图片描述

  1. 调用 wx.getSetting 获取用户所有的授权信息,查询到用户是否授权了位置信息
  2. authSetting 只包含了小程序向用户请求的所有的权限,同时包含了授权的结果(true、false)
    在这里插入图片描述
  3. 如果小程序没有向用户发起过授权请求,authSettiong 中没有 scope.userLocation 属性
  4. 如果用户点击了允许授权,scope.userLocation 返回值是 true
  5. 如果用户点击了拒绝授权,scope.userLocation 返回值是 false
  6. 如果 scope.userLocation 返回值是 undefined 说明小程序并没有向用户发起授权请求
  // 获取用户所有的授权的信息
    async onLocation1() {
        const { authSetting } = await wx.getSetting()
        console.log(authSetting['scope.userLocation'])
        // 判断用户是否拒绝了授权
        if (authSetting['scope.userLocation'] === false) {
            const modalRes = await wx.modal({
                title: "授权提示",
                content: "需要获取地理位置信息,请确认授权"
            })
            if (!modalRes) return wx.toast({ title: "您拒绝了授权" })
            // 如果用户点击了确定,说明用户同意授权,需要代开微信客户端小程序授权页面
            const { authSetting } = await wx.openSetting()
            if (!authSetting['scope.userLocation']) return wx.toast({ title: '授权失败' })
            // 如果用户更新了授权信息,说明用户同意授权获取位置信息
            try {
                const locationRes = await wx.getLocation()
                console.log(locationRes)
            } catch (error) {
                wx.toast({ title: '您拒绝授权获取位置信息' })
            }
        } else {
            try {
                const locationRes = await wx.getLocation()
                console.log(locationRes)
            } catch (error) {
                wx.toast({ title: '您拒绝授权获取位置信息' })
            }
        }
    },

也可以 在button 按钮添加属性【open-type=“openSetting”】

 <!-- 如果给按钮添加 open-type 属性,属性设置为 openSetting 就会打开授权页面 -->
      <!-- 就会打开微信客户端小程序授权页面 -->
      <button type="primary" open-type="openSetting">打开授权页面</button>

开通腾讯位置服务

使用 wx.chooseLocation() 能够很方便的让用户来选择地理位置,但是 wx.chooseLocation()返回的数据并没有包含省市区、省市区编码数据。而日常接口,需要传递省市区、省市区编码数据。
这时候我们可以使用 腾讯位置服务 将返回的经度、维度 进行逆地址解析,转换成详细地址

腾讯位置服务 专为小程序开发提供了 JavaScript SDK,方便开发者在小程序中可以使用腾讯地图服务。 使用腾讯位置服务
可以很方便的让开发者实现地址解析、逆地址解析等功能
腾讯位置服务官网

打开官方文档,根据文档进行操作
在这里插入图片描述

腾讯位置服务逆地址解析获取

  1. 在 官方文档第三项 下载 JavaScriptSDK v1.2 包下载完成后
  2. 在 miniprogram目录下 把下载好的 zip 包 解压完成后 放到新建的 libs 文件夹下
  3. 然后在使用文件中引入 QQMapWX 核心类 import QQMapWX from '../../../../../libs/qqmap-wx-jssdk'
  4. 对获取的数据进行格式化、组织 然后赋值给 data 中的字段
  5. 打开文档 导航栏 - 开发文档 - WebService API - 开发指南-搜索服务 - 行政区划
  6. 如果是省,前 2 位有值,后面 4 位是 0 adcode.replace(adcode.substring(2, 6), "0000")
  7. 如果是市,前 4 位有值,后面 2 位是 0 adcode.replace(adcode.substring(4, 6), "00"),
  8. 如果是区 adcode
    在这里插入图片描述
  9. 配置接口的调用额度
  10. 点击 导航栏的 控制台 - 额度管理- 账号额度- 找到 逆地址解析
  11. 点击 逆地址解析 的 配额分配
  12. 弹框里 选择 当前自己创建的应用 和 key
  13. 填写 配额分配 和 并发量 点击提交
    在这里插入图片描述
  14. 打开微信小程序项目 清缓存、重新编译、重新打开项目

// 引入 QQMapWX 核心类
import QQMapWX from '../../../../../libs/qqmap-wx-jssdk'
Page({
    data: {
        // 需要将请求参数放到 data对象下,方便再模板中绑定数据
        name: '', // 收货地址
        phone: '', // 手机号码
        provinceName: '', // 省
        provinceCode: '', // 省编码
        cityName: '', // 市
        cityCode: '', // 市编码
        distictName: '', // 区
        distictCode: '', // 区编码
        address: '', // 详细地址
        fullAddress: '', // 完整地址
        isDefault: false, // 是否设置默认地址 0 不设置默认地址
    },

    // 获取用户地理位置信息
    async onLocation() {
        // latitude 维度,longitude 经度,name 搜索的地点,address
        const { latitude, longitude, name, address } = await wx.chooseLocation()

        // 使用实例化方法 reverseGeocoder 方法进行逆解析
        this.qqmapwx.reverseGeocoder({
            location: {
                latitude,
                longitude
            },
            success: (res) => {
                // 获取省市区、省市区编码
                const { adcode, province, city, distict } = res.result.ad_info
                // 获取街道、门牌 (街道、门牌 可能为空)
                const { street, street_number } = res.result.address_component
                // 获取标准地址
                const { standard_address } = res.result.formatted_addresses
                // 对获取的数据进行格式化、组织 然后赋值给 data 中的字段
                this.setData({
                    provinceName: province, // 省
                    // 如果是省,前 2 位有值,后面 4 位是 0
                    provinceCode: adcode.replace(adcode.substring(2, 6), "0000"), // 省编码
                    cityName: city, // 市
                    // 如果是市,前 4 位有值,后面 2 位是 0
                    cityCode: adcode.replace(adcode.substring(4, 6), "00"), // 市编码
                    distictName: distict, // 区
                    distictCode: distict && adcode, // 区编码
                    // 组织详细地址
                    address: street + street_number + name, // 详细地址
                    fullAddress: standard_address + name, // 完整地址
                })
            }
        })
    },


    onLoad() {
        // 对核心类 QQMapWX 进行实例化
        this.qqmapwx = new QQMapWX({
            // key 在进行你解析的时候,如果发现 key 只能使用一次,需要在腾讯位置服务后台配置额度
            key: "HLEBZ-6QJWZ-P5BXN-TQ6D3-WRIAT-RIFGQ"
        })
    }
})
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐