评论

小程序如何定位所在城市,如何发起周边搜索

app上常见的自动切换本地城市,还有见到有些小程序中个人账号可以获取位置服务,整理了一些封装方法

app上常见的自动切换本地城市,还有见到有些小程序中个人账号可以获取位置服务,整理了一些封装方法

先封装request

为小程序get/post的promise封装

rq.js

/*
 * url {String} 请求地址接口  
 * data {Object} 请求参数  
 * param {Object} request参数
 * method {String} 指定使用post或者是get方法
*/
export function request(url, data={}, param={}, method='POST') {
  return new Promise((resolve, reject)=>{
    let postParam = {
      url, 
      method,
      data,
      // timeout
      // dataType
      // responseType
      header: {
        'content-type': 'application/json' // 默认值
      },
      success(res) {
        resolve(res)
      },
      error: function (e) {
        reject(e)
      }
    }
    postParam = Object.assign(postParam, param)
    postParam.fail = postParam.error
    if (postParam.url) wx.request(postParam)
  })
}

module.exports = {
  get(url, data, param){
    return request(url, data={}, param={}, method='GET')
  },
  
  post(){
    return request.apply(null, arguments)
  }
}

位置服务方法

需要开通小程序的位置服务功能,在小程序控制台

简单的封装了三个位置服务的方法

  1. 所在地城市
  2. 地区搜索
  3. 范围搜索
// request的promise封装
const iKit = request('./rq.js')  

// key为开通位置服务所获取的查询值
// 下面这个key是随便写的
let key = 'JKDBZ-XZVLW-IAQR8-OROZ1-XR3G9-UYBD5'

/*
 * 搜索地区...  
 * 搜索地区的商圈, 如搜索 kfc 广州市
 * key {String} 搜索内容  
 * region {String} 搜索区域  
*/
export function searchRegion(kw, region) {
  let opts = {
    keyword: encodeURI(kw),
    boundary: region ? `region(${encodeURI(region)}, 0)` : '',  // 0 为限定范围搜搜索,1为开放范围搜素偶
    page_size: 10,  // 搜索结果分页最大条数
    page_index: 1,  // 指定分页
    key
  }

  return new Promise((resolve, rej)=>{
    iKit.get('https://apis.map.qq.com/ws/place/v1/search', opts).then(res=>{
      resolve(res.data.data)
    })
  })
}

/*
 * 搜索附近的...  
 * 以当前位置的经纬度搜索附近商圈,如附近的酒店,快餐等等
 * key {String} 搜索内容  
 * params {Object} 搜索参数 包含三个参数 lat纬度,lng经度,distance范围(单位米)  
*/
export function searchCircle(kw, params={}) {
  let {lat, lng, distance} = params
  if (!lat && !lng) return 
  if (!distance) distance = 1000  // 搜索范围默认1000米
  let opts = {
    keyword: encodeURI(kw),
    boundary: `nearby(${lat},${lng},${distance})`,
    orderby: '_distance', // 范围搜索支持排序,由近及远  
    page_size: 20,  // 搜索结果分页最大条数  
    page_index: 1, // 指定分页  
    key
  }

  return new Promise((resolve, rej)=>{
    iKit.get('https://apis.map.qq.com/ws/place/v1/search', opts).then(res=>{
      resolve(res.data.data)
    })
  })
}

// 所在地的城市,省份等区域信息
/*
 * 所在地的城市,省份等区域信息  
 * 如当前地址所在省份、城市  
 * lat {Number} 纬度
 * lng {Number} 经度  
*/
export function myCity(lat, lng) {
  return new Promise((resolve, rej)=>{
    let opts = {
      location: `${lat},${lng}`,
      key
    }
    
    iKit.get(`https://apis.map.qq.com/ws/geocoder/v1/`, opts).then(res => {
      resolve(res.data.result)
    })
  })
}

调用

wx.getLocation({
    type: 'wgs84',
    success(location) {
      locationPosition = location
      
      // 所在地信息
      myCity(location.latitude, location.longitude).then(res => {
        let myCityInfo = res.ad_info
        let {city, nation, province, city_code, adcode} = myCityInfo
        console.log({title: `国家: ${nation},省份: ${province},城市: ${city}`})
      })
      
      // 附近搜索
      searchCircle('快餐', {
        lat: location.latitude,
        lng: location.longitude,
        distance: 500
      }).then(res=>{
        console.log(res)
      })
      
      // 地区搜索
      searchRegion('酒店', '广州').then(res=>{
        console.log(res)
      })
    }
})

关注小程序

最后一次编辑于  2020-02-10  
点赞 3
收藏
评论

3 个评论

  • 胡琦
    胡琦
    2020-08-19

    感谢分享

    2020-08-19
    赞同
    回复
  • 旺维科技
    旺维科技
    2020-02-11
    能否有简单易懂好上手的小程序
    2020-02-11
    赞同
    回复 1
    • 天天修改
      天天修改
      2020-02-13
      官网的文档简单上手,都不错
      2020-02-13
      回复
  • Admin ²º²³
    Admin ²º²³
    2020-02-10

    收藏,感谢分享

    2020-02-10
    赞同
    回复
登录 后发表内容