微信小程序中获取用户所在城市信息笔记

1,552 阅读2分钟

微信小程序中获取用户所在城市信息

最近在做一个小程序,进入同城页面自动获取用户所在城市信息,然后显示当前城市的数据列表

原理

微信小程序中,我们可以通过调用 wx.getLocation() 获取到设备当前的地理位置信息,这个信息是当前位置的经纬度。如果我们想获取当前位置是处于哪个国家,哪个城市等信息,该如何实现呢?

微信小程序中并没有提供这样的 API,但是没关系,有 wx.getLocation() 得到的经纬度作为基础就够了,其他的,我们可以使用其他第三方地图服务可以来实现,比如腾讯地图或百度地图的 API。

所以可以分为两个步骤:

  1. 在小程序中获取当前的地理位置,涉及小程序 API 为 wx.getLocation
  2. 把第 1 步中获得的经纬度信息通过腾讯地图的接口逆地址解析,涉及腾讯地图接口为 reverseGeocoder(options:Object)

小程序获取当前的地理位置

在小程序中,调用 wx.getLocation,使用前需要用户授权 scope.userLocation,代码如下:

checkAuth(callback) {
  wx.getSetting({
    success(res) {
      if (!res.authSetting['scope.userLocation']) {
        wx.authorize({
          scope: 'scope.userLocation',
          success() {
            wx.getLocation({
              type: 'wgs84',
              success(res) {
                callback(res.latitude, res.longitude)
              }
            })
          }
        })
      }
    }
  })
}

运行后会提示如下信息,还需要在 app.json 中配置 permission 字段

app.json 中添加配置:

"permission": {
    "scope.userLocation": {
      "desc": "你的位置信息将用于小程序城市显示"
    }
}

允许后即可获取接口返回的信息:

{
  accuracy: 65;
  errMsg: "getLocation:ok";
  horizontalAccuracy: 65;
  latitude: 30.25961; // 纬度,范围为 -90~90,负数表示南纬
  longitude: 116.13026; // 经度,范围为 -180~180,负数表示西经
  speed: -1;
  verticalAccuracy: 65;
}

latitudelongitude 即是我们需要的两个字段

腾讯地图接口逆地址解析

我们可以在腾讯地图创建一个应用,并添加密钥 key ,以及进行 key 设置,按照 微信小程序 JavaScript SDK 入门及使用限制文档

KEY 设置的启用产品中,勾选 WebServiceAPI,选择签名校验方式

这部分代码逻辑如下:

qqmapsdk = new QQMapWX({
    key: 'IZ6BZ-M4K6W-EG5RE-RVHVF-655PE-N6FCK'
});
wx.getLocation({
    success(res) {
        var latitude = res.latitude
        var longitude = res.longitude
        qqmapsdk.reverseGeocoder({
            sig: 'OoBrEnhmm0t3jkdBINR1luDSMLoyrhD',
            location: {
                latitude,
                longitude
            },
            success(res) {
                console.log(res)
                var regVal = []
                regVal.push(res.result.ad_info.province)
                regVal.push(res.result.ad_info.city)
                regVal.push(res.result.ad_info.district)
                that.setData({
                    region: regVal
                })
                wx.setStorageSync('loca_city', regVal)
            },
            fail(err) {
                console.log(err)
            },
            complete() {
                that.loadCityInfo();
            }
        })
    }
})

reverseGeocoder 接口返回的结果,这里面的字段比较多,详细可以看接口文档,里面好几个字段可以取到城市相关信息,其中 ad_info 是行政区划信息,我就取这里面取相关信息。

参考文章:developers.weixin.qq.com/community/d…