微信小程序之逆地址解析

这是我参与更文挑战的第6天,活动详情查看: 更文挑战

1. 需求背景

小程序端获取到用户的地理位置信息, 然后将经纬度信息转换成具体的地址信息。

2. 实现方案

2.1 唤醒位置服务授权、获取经纬度.

A. 在app.json中开启位置服务权限

 "permission": {
    "scope.userLocation": {
      "desc": "您的位置信息将用户小程序位置接口的效果展示"
    }
  }
复制代码

B. 编写代码触发唤醒授权面板-点击允许.
这里不考虑用户取消后、如何引导再次唤醒的场景.(此种场景在另外一篇文章有详细方案,感兴趣可戳:小程序用户拒绝授权弹窗后, 如何引导再次开启?

// wxml
<view bindtap="getLocation">获取经纬度</view>

// js
  getLocation: function() {
    const _this = this
    wx.getLocation({
      type: 'gcj02',
      success(res){
        // 大概会返回这么些信息
        // const res = {
        //   accuracy: 65,
        //   errMsg: "getLocation:ok",
        //   horizontalAccuracy: 65,
        //   latitude: 23.08331,
        //   longitude: 113.3172,
        //   speed: -1,
        //   verticalAccuracy: 65
        // }
      },
      fail(err){
        // 大概会返回这么些信息
        // const err = {errMsg: "getLocation:fail auth deny"}
      }
    })
  }
复制代码

这里可优化、最好改成是先获取用户当前的授权状态, 再去判定是否要调用wx.getLocation()API[用户关闭了位置、就算调用了接口、也会告诉你’getLocation:fail auth deny, 故考虑前置场景].
最终的代码如下:

  getLocation: function() {
    const _this = this
    wx.getSetting({
      success(res){
        const permissonName = 'scope.userLocation'
        if(res.authSetting[permissonName] === false){
          // 表示用户拒绝了授权、要引导再次开启可在这里搞动作

        }else{
          wx.getLocation({
            type: 'gcj02',
            success(res){
              this.getLocationName(res)
            },
            fail(err){
              // 这里调用接口失败了、要引导再次开启可在这里搞动作
            }
          })
        }
      }
    })
  },
  getLocationName: function(res = {}){
    const { latitude, longitude } = res
    // 逆地址解析
  }
复制代码

上面的getLocationName()就是要做逆地址解析业务逻辑的地方, 请接着往下看.

2.2 逆地址解析

2.2.1 开通腾讯位置服务

腾讯位置服务官网地址: lbs.qq.com/service/web…
A.登录微信公众平台-> 开发 -> 开发工具 -> 开发能力 -> 找到腾讯位置服务-> 点击开通.
image.png
image.png
B.点击后会跳转至腾讯位置服务官网、然后按照指引进行登录、授权即可。
image.png
image.png
能看到控制台、意味着小程序已成功开通腾讯位置服务sdk.

2.2.2 申请开发者密钥key

控制台-> 我的应用-创建应用-添加key。
如下是我已经创建好的key:
image.png
让看看编辑的界面:选择启用产品选项很重要.

  • WebServiceAPI
  • 地图SDK(Android/IOS)
  • 微信小程序-这里需要选择授权的APP ID

image.png

2.2.3 开通webserviceAPI服务

A. 控制台-> 应用管理 -> 我的应用 -> 添加key -> 勾选webserviceAPI -> 保存.
小程序SDK需要用到webserviceAPI的部分服务、所以使用该功能的key需要具备相应的权限.

2.2.4 下载微信小程序的JavaScriptSDK

sdk下载路径:
mapapi.qq.com/web/minipro…
mapapi.qq.com/web/minipro…
将下载好的文件解压至我们的项目目录中(假设放在我们根目录/libs目录下)

2.2.5 设置安全域名

这一步很重要、若跳过该步骤会直接报如下错误:”apis.map.qq.com不在以下request合法域名列表中“.
image.png
开通步骤: 微信公众平台管理后台 -> 开发 -> 开发管理 -> 开发设置 -> 服务器域名 设置https的合法域名 -> 添加”apis.map.qq.com
如下图:
image.png

至此, 逆地址解析的基础步骤已搭建完毕,请看demo演示.

3. Demo演示

<view bindtap="getLocation">获取经纬度</view>

// 引入SDK核心类
var QQMapWX = require('../../libs/qqmap-wx-jssdk.js')

const app = getApp()
let qqmapsdk

Page({
  onLoad: function() {
    // 实例化API核心类
    qqmapsdk = new QQMapWX({
      key: '开发者密钥(KEY, 必填) -> 记得修改'  // 开发者密钥(KEY, 必填)
    });
  },
  getLocation: function() {
    const _this = this
    wx.getSetting({
      success(res){
        const permissonName = 'scope.userLocation'
        if(res.authSetting[permissonName] === false){
          // 表示用户拒绝了授权、要引导再次开启可在这里搞动作
        }else{
          wx.getLocation({
            type: 'gcj02',
            success(res){
              _this.getLocationName(res)
            },
            fail(err){
              // 这里调用接口失败了、要引导再次开启可在这里搞动作
            }
          })
        }
      }
    })
  },
  getLocationName: function(res) {
    const { latitude ,  longitude }  = res
    // 字符串类型
    const location = `${latitude},${longitude}`
    qqmapsdk.reverseGeocoder({
      location: location,
      get_poi: 1, //是否返回周边POI列表:1.返回;0不返回(默认),非必须参数
      success: function(res) {//成功后的回调
        console.log('逆地址解析', res);
      },
      fail: function(error) {
        console.error(error);
      },
      complete: function(res) {
        console.log(res);
      }
    })
  }
})
复制代码

运行上面的代码, 你会发现: network处有发送https请求:
image.png

我们看下返回的数据大概是什么样子的: 在这里你就可以找到经纬度对应的地址位置信息。
image.png

4. 写在最后

若有错误之处, 恳请留言, 定会及时更正!
若觉着对您有帮助的话恳请点个赞或着收藏吧!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享