• 14.微信小程序之地理定位功能


    目录

    1.地理定位介绍

     1.1 申请开通

    1.2 使用方法

    2.拒绝授权后的解决方案  

    3.开通腾讯位置服务

    4.LBS 逆地址解析


    1.地理定位介绍

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

    1. wx.getLocation() :获取当前的地理位置

    2. wx.chooseLocation():打开地图选择位置  

     1.1 申请开通

    暂时只对部分类目的小程序开放,需要先通过类目审核,然后在小程序管理后台,「开发」-「开发管理」-「接口设置」中自助开通该接口权限。

    1.2 使用方法
    1. 在 app.json 中配置 requiredPrivateInfos 进行声明启用

    2. 在调用 wx.getLocation() 时需要在 app.json 配置 permission字段,同时使用 scope.userLocation 声明收集用户选择的位置信息的目的,wx.chooseLocation() 接口不需要配置该字段,可以直接进行调用

    3. 在配置好以后,调用 wx.getLocation()wx.chooseLocation() 接口

    app.json 中进行配置

    1. {
    2. "requiredPrivateInfos": [
    3. "getLocation",
    4. "chooseLocation"
    5. ],
    6. "permission": {
    7. "scope.userLocation": {
    8. "desc": "获取用户位置信息用于填写收货地址"
    9. }
    10. }
    11. }

    参考文档:

    1. 地理位置接口新增与相关流程调整

    2. permission 字段说明

    getLocation 使用 :

    1. // 地理定位
    2. async onLocation() {
    3. // 获取 纬度 、精度
    4. const { latitude, longitude } = await wx.getLocation()
    5. console.log(location)
    6. }

    chooseLocation 使用:

    1. // 地理定位
    2. async onLocation() {
    3. // 打开地图选择位置,获取 纬度 、精度
    4. const { latitude, longitude } = await wx.chooseLocation()
    5. console.log(res)
    6. }



    2.拒绝授权后的解决方案  

    在调用 wx.getLocation() 获取用地理位置时,如果用户选择拒绝授权,代码会直接抛出错误。

    在拒绝授权以后,再次调用 wx.getLocation() 时,就不会在弹窗询问用户是否允许授权。

    接下来,就需要优化授权的流程:

     代码如下:

    方法里面的提示框,比如:wx.modal,wx.toast是自己在原生的基础上进一步封装的,自己用的时候可以用原生的即可,以自身项目业务为准,以下代码仅做参考:

    1. // 获取用户地理位置信息
    2. async onLocation() {
    3. // 调用 getSetting 方法获取用户所有的授权信息
    4. // 返回的 authSetting 包含小程序已向小程序申请过的权限已经授权结果(truefalse)
    5. const { authSetting } = await wx.getSetting()
    6. console.log(authSetting)
    7. // scope.userLocation 是否已经授权获取地理位置的信息
    8. // 如果之前没有申请过返回 undefined,需要调用 getLocation
    9. // 如果之前同意了授权,返回 true,需要调用 getLocation
    10. // 如果之前拒绝了授权,返回 false,需要用户手动进行授权
    11. // 等于 true,或者不等于 undefined,说明需要进行授权
    12. // const isAuth =
    13. // authSetting['scope.userLocation'] ||
    14. // authSetting['scope.userLocation'] === undefined
    15. // 为了避免冗余的条件判断,使用 !! 把代码进行优化
    16. const isAuth = !!authSetting['scope.userLocation']
    17. if (!isAuth) {
    18. // 弹窗询问用户是否进行授权
    19. const modalRes = await wx.modal({
    20. title: '授权提示',
    21. content: '需要需要您的地理位置信息,请确认授权'
    22. })
    23. // 如果用户点击了取消,说明用户拒绝了授权,给用户提示
    24. if (!modalRes) return wx.toast({ title: '您拒绝了授权' })
    25. // 如果用户点击了确定,调用 wx.openSetting 打开微信客户端小程序授权页面
    26. // 并返回授权以后的结果
    27. const { authSetting } = await wx.openSetting()
    28. // 如果用户没有更新授权信息,提示没有更新授权
    29. if (!authSetting['scope.userLocation'])
    30. return wx.toast({ title: '授权失败!' })
    31. try {
    32. // 如果用户更新授权信息,则调用 getLocation 获取用户地理位置信息
    33. const locationRes = await wx.getLocation()
    34. // 打印地理位置信息
    35. console.log(locationRes)
    36. } catch (err) {
    37. console.log(err)
    38. }
    39. } else {
    40. try {
    41. // 如果是第一次调用 getLocation 或者之前授权过
    42. // 直接调用 getLocation 获取用户信息即可
    43. const locationRes = await wx.getLocation()
    44. console.log(locationRes)
    45. } catch (error) {
    46. wx.toast({ title: '您拒绝授权获取地址位置' })
    47. }
    48. }
    49. }

    3.开通腾讯位置服务

    使用wx.chooseLocation()能够很方便的让用户来选择地理位置,但是wx.chooseLocation()返回的数据并没有包含省市区、省市区编码数据。

     这时候我们可以使用 腾讯位置服务 将返回的经度、纬度进行逆地址解析,转换成详细地址。

    腾讯位置服务专为小程序开发提供了 JavaScript SDK,方便开发者在小程序中可以使用腾讯地图服务。

    使用腾讯位置服务可以很方便的让开发者实现地址解析、逆地址解析等功能。

    使用步骤:

    1. 申请开发者密钥(key):申请密钥

    2. 开通 webserviceAPI 服务:控制台 → 应用管理→我的应用 → 添加 key →勾选 WebServiceAPI →保存

    3. 下载微信小程序 JavaScriptSDK,微信小程序JavaScriptSDK v1.1 JavaScriptSDK v1.2

    4. 安全域名设置


    详细步骤:

    1.申请密钥:密钥申请,微信扫码进行登录,选择绑定已有账号、或者注册新账号 (需要绑定手机、验证邮箱)

    2. 开通webserviceAPI服务:控制台 ->应用管理 -> 我的应用 ->添加key-> 勾选WebServiceAPI -> 保存→ 创建完成

     3.下载微信小程序 JavaScriptSDK v1.2,下载将 .js 文件放到小程序的 libs 目录下  

    4.安全域名设置,在小程序管理后台 -> 开发 -> 开发管理 -> 开发设置 -> “服务器域名” 中设置request合法域名,添加https://apis.map.qq.com,或者点击微信开发者工具中的暂时不校验域名


    4.LBS 逆地址解析

    LBS 逆地址解析是指通过地理坐标查找对应位置的详细地址信息。LBS 是 Location-Based Services 的缩写,翻译为中文就是基于地理位置的服务。

    对于 LBS 逆地址解析,通常是输入地理坐标(经度和纬度),系统会返回地理位置的具体地址,如国家、省份、城市、街道、建筑等信息。

    比如说,你有一个经纬度为(114.21892734521,29.575429778924)的坐标,通过 LBS 逆地址解析,你可以得到这个坐标对应的实际地址,可能是 "中国湖北省武汉市XXX区XXX路XXX号"。

    使用步骤:

    1. 在项目中引入 SDK 核心类(上面已经下载的微信小程序JavaScriptSDK)

    1. // var QQMapWX = require('../../libs/qqmap-wx-jssdk.js');
    2. //这个地址看自己项目,一般是在工作目录的根目录下建libs文件夹,哪里需要在哪引入即可
    3. import QQMapWX from '../../../../../libs/qqmap-wx-jssdk.min'
    1. onLoad 中实例化 API 核心类,同时配置创建的 key

    1. // 引入SDK核心类,js文件根据自己业务,位置可自行放置
    2. import QQMapWX from '../../../../../libs/qqmap-wx-jssdk.min'
    3. Page({
    4. onLoad: function () {
    5. // 实例化API核心类,把实例挂载到this上,方便其他方法中使用
    6. this.qqmapsdk = new QQMapWX({
    7. key: '申请的key'
    8. })
    9. }
    10. // coding...
    11. }
    1. 使用实例方法 reverseGeocoder 方法进行逆地址解析,将提供的坐标转换为详细的地址位置信息 

    1. // LBS 地址逆解析
    2. // 地理定位
    3. async onLocation() {
    4. // 获取 纬度 、精度
    5. // const { latitude, longitude } = await wx.getLocation()
    6. // console.log(location)
    7. // 获取经、纬度、name用户搜索的地点名称
    8. let { latitude, longitude, name } = await wx.chooseLocation()
    9. // 使用 reverseGeocoder 方法进行逆地址解析
    10. this.qqmapsdk.reverseGeocoder({
    11. // 传入经、纬度
    12. location: {
    13. latitude,
    14. longitude
    15. },
    16. // 逆地址解析成功后执行
    17. success: (res) => {
    18. // 获取选择的
    19. const { street_number } = res.result.address_component
    20. // province 省 city 市 district 区
    21. const {
    22. province, //
    23. city, //
    24. district, //
    25. adcode, // 行政区划代码
    26. city_code, // 城市代码,由国家码+行政区划代码(提出城市级别)组合而来,总共为9
    27. nation_code // 国家代码
    28. } = res.result.ad_info
    29. this.setData({
    30. // 省级: 前两位有值,后4位置0,如,河北省: 130000
    31. provinceCode: adcode.replace(adcode.substring(2, 6), '0000'),
    32. provinceName: province,
    33. // 市前面多个国家代码,需要进行截取
    34. cityCode: city_code.slice(nation_code.length),
    35. cityName: city,
    36. // 东莞市、中山市、修州市、嘉关市 因其下无区县级,
    37. districtCode: district && adcode,
    38. districtName: district,
    39. // 详细地址
    40. address: name,
    41. fullAddress: [province, city, district, address].join('')
    42. })
    43. }
    44. })
    45. }

    注意事项:

    逆地址解析解析初始用的时候发现解析不成功,需要配置接口的调用额度:

    官方文档-基础示例:Hello World

    官方文档-逆地址解析:reverseGeocoder

  • 相关阅读:
    现代 CSS 之高阶图片渐隐消失术
    情人节程序员用HTML网页表白【春娇-志明结婚邀请函】 HTML5七夕情人节表白网页源码 HTML+CSS+JavaScript
    快速看懂(找到)VUE框架的管理系统代码
    [SDR] GNU Radio 系列教程(二) —— 绘制第一个信号分析流程图
    pip install open-interpreter报错,无法安装
    关于Windows11的优化内容 - 进阶者系列 - 学习者系列文章
    84-MongoDB高级介绍
    CISSP学习笔记:事件预防和响应
    选择适合自身业务的HTTP代理有哪些因素决定?
    S7-200系列西门子plc简介
  • 原文地址:https://blog.csdn.net/weixin_41993336/article/details/139268433