【愚公系列】2022年04月 微信小程序-项目篇(公交查询)-02周边站点-获取位置和城市信息

举报
愚公搬代码 发表于 2022/04/29 10:17:17 2022/04/29
【摘要】 前言 1.相关API逆地址解析:提供由经纬度到文字地址及相关位置信息的转换能力,广泛应用于物流、出行、O2O、社交等场景。服务响应速度快、稳定,支撑亿级调用。可以满足以下相关业务场景:满足传统对省市区、乡镇村、门牌号、道路及交叉口、河流、湖泊、桥、poi列表的需求。提供通过知名地点、地标组合形成的易于理解的地址,如:北京市海淀区中钢国际广场(欧美汇购物中心北)。提供精准的商圈、知名的大型区...

前言

1.相关API

逆地址解析:提供由经纬度到文字地址及相关位置信息的转换能力,广泛应用于物流、出行、O2O、社交等场景。服务响应速度快、稳定,支撑亿级调用。

可以满足以下相关业务场景:

  • 满足传统对省市区、乡镇村、门牌号、道路及交叉口、河流、湖泊、桥、poi列表的需求。
  • 提供通过知名地点、地标组合形成的易于理解的地址,如:北京市海淀区中钢国际广场(欧美汇购物中心北)。
  • 提供精准的商圈、知名的大型区域、附近知名的一级地标、代表当前位置的二级地标等。

请求地址:https://apis.map.qq.com/ws/geocoder/v1/?location=

请求参数:

参数 必填 说明 示例
location 经纬度(GCJ02坐标系),格式:location=lat<纬度>,lng<经度> location= 39.984154,116.307490
get_poi 是否返回周边地点(POI)列表,可选值:0 不返回(默认),1 返回 get_poi=1
poi_options 周边POI列表控制参数:1 poi_options=address_format=short返回短地址,缺省时返回长地址2 poi_options=radius=5000半径,取值范围1-5000(米)3 poi_options=policy=1/2/3/4/5控制返回场景,policy=1[默认] 以地标+主要的路+近距离POI为主,着力描述当前位置;policy=2 到家场景:筛选合适收货的POI,并会细化收货地址,精确到楼栋;policy=3 出行场景:过滤掉车辆不易到达的POI(如一些景区内POI),增加道路出入口、交叉口、大区域出入口类POI,排序会根据真实API大用户的用户点击自动优化。policy=4 社交签到场景,针对用户签到的热门 地点进行优先排序。policy=5 位置共享场景,用户经常用于发送位置、位置分享等场景的热门地点优先排序4 注:policy=1/2/3最多返回10条周边POI,policy=4/5最多返回20条,如需更多请参见地点搜索-周边推荐 【单个参数写法示例】:poi_options=address_format=short【多个参数英文分号间隔,写法示例】:poi_options=address_format=short;radius=5000;policy=2
key 开发密钥(Key) key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77
output 返回格式:支持JSON/JSONP,默认JSON output=json
callback JSONP方式回调函数 callback=function1

详情请看相关接口网址:https://lbs.qq.com/service/webService/webServiceGuide/webServiceGcoder

一、获取位置和城市信息

获取位置方法:getLocationInfo

getLocationInfo() {
    var _this = this
    app.showLoading("拉取路线列表")
    wx.getLocation({
      type: 'gcj02',
      success: function (res) {
        var locationInfo = _this.data.locationInfo
        locationInfo.latitude = res.latitude
        locationInfo.longitude = res.longitude
        // 调用接口
        qqmap.reverseGeocoder({
          location: {
            latitude: locationInfo.latitude,
            longitude: locationInfo.longitude
          },
          success: function (res) {
            locationInfo.city = res.result.address_component.city
            locationInfo.address = res.result.formatted_addresses.recommend
            _this.setData({
              locationInfo: locationInfo
            })
            _this.getStationList()
          },
          fail: function (res) {
            console.log(res);
            app.hideLoading(locationInfo)
          },
          complete: function (res) {
            // complete
            // console.log(_this.data.locationInfo)
          }
        })
      }
    })
  },

逆地址解析方法:reverseGeocoder

reverseGeocoder(options) {
   var that = this;
   options = options || {};
   Utils.polyfillParam(options);
   var requestParam = {
       coord_type: options.coord_type || 5,
       get_poi: options.get_poi || 0,
       output: 'json',
       key: that.key
   };
   if (options.poi_options) {
       requestParam.poi_options = options.poi_options
   }

   var locationsuccess = function (result) {
       requestParam.location = result.latitude + ',' + result.longitude;
       wx.request(Utils.buildWxRequestConfig(options, {
           url: URL_GET_GEOCODER,
           data: requestParam
       }));
   };
   Utils.locationProcess(options, locationsuccess);
}

Utils相关工具类:

/**
 * 回调函数默认处理
 */
polyfillParam(param) {
    param.success = param.success || function () { };
    param.fail = param.fail || function () { };
    param.complete = param.complete || function () { };
},

/**
 * 构造微信请求参数,公共属性处理
 * 
 * @param {Object} param 接口参数
 * @param {Object} param 配置项
 */
buildWxRequestConfig(param, options) {
    var that = this;
    options.header = { "content-type": "application/json" };
    options.method = 'GET';
    options.success = function (res) {
        var data = res.data;
        if (data.status === 0) {
            param.success(data);
        } else {
            param.fail(data);
        }
    };
    options.fail = function (res) {
        res.statusCode = ERROR_CONF.WX_ERR_CODE;
        param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, result.errMsg));
    };
    options.complete = function (res) {
        var statusCode = +res.statusCode;
        switch(statusCode) {
            case ERROR_CONF.WX_ERR_CODE: {
                param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
                break;
            }
            case ERROR_CONF.WX_OK_CODE: {
                var data = res.data;
                if (data.status === 0) {
                    param.complete(data);
                } else {
                    param.complete(that.buildErrorConfig(data.status, data.message));
                }
                break;
            }
            default:{
                param.complete(that.buildErrorConfig(ERROR_CONF.SYSTEM_ERR, ERROR_CONF.SYSTEM_ERR_MSG));
            }

        }
    }
    return options;
},

/**
 * 处理用户参数是否传入坐标进行不同的处理
 */
locationProcess(param, locationsuccess, locationfail, locationcomplete) {
    var that = this;
    locationfail = locationfail || function (res) {
        res.statusCode = ERROR_CONF.WX_ERR_CODE;
        param.fail(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
    };
    locationcomplete = locationcomplete || function (res) {
        if (res.statusCode == ERROR_CONF.WX_ERR_CODE) {
            param.complete(that.buildErrorConfig(ERROR_CONF.WX_ERR_CODE, res.errMsg));
        }
    };
    if (!param.location) {
        that.getWXLocation(locationsuccess, locationfail, locationcomplete);
    } else if (that.checkLocation(param)) {
        var location = Utils.getLocationParam(param.location);
        locationsuccess(location);
    }
}
/**
 * 构造错误数据结构
 * @param {Number} errCode 错误码
 * @param {Number} errMsg 错误描述
 */
buildErrorConfig(errCode, errMsg) {
    return {
        status: errCode,
        message: errMsg
    };
},
/**
 * 获取location参数
 */
getLocationParam(location) {
    if (typeof location == 'string') {
        var locationArr = location.split(',');
        if (locationArr.length === 2) {
            location = {
                latitude: location.split(',')[0],
                longitude: location.split(',')[1]
            };
        } else {
            location = {};
        }
    }
    return location;
},
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。