TypechoJoeTheme

香草物语

统计
登录
用户名
密码
/
注册
用户名
邮箱
输入密码
确认密码

油耗笔记OilNote周边搜索能力由百度地图切换成腾讯地图

Laughing博主
2022-11-18
/
0 评论
/
780 阅读
/
2965 个字
/
百度已收录
11/18
本文最后更新于2024年03月14日,已超过45天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!

油耗笔记OilNote其实对地图搜索能力,其实就是查询周边加油站的功能进行过一次升级,上次升级是将地图搜索能力由高德地图切换成了百度地图,切换原因也非常简单,高德地图无耻的将每日额度改成了100,根本没法用了。

具体切换过程,感兴趣的可以看看。油耗笔记OilNote周边搜索能力由高德地图切换成百度地图 - 香草物语 (xiangcaowuyu.net)

一、为什么又不用百度地图了

1.1、对搜索结果不满意

其实,从高德地图切换到百度地图也不过一天的时间。之所以不使用百度地图,最根本的原因,是百度地图所谓的圆形搜索能力真的太差劲了。好多东西根本就搜不到。而且作为记录油耗的一个小程序,搜索周边加油站其实是最基础最基本的一个功能,但是百度地图的圆形搜索能力简直就弱爆了。明明旁边就有加油站,死活就是搜索不到。但是百度地图自己却能搜索到。

比如这个地图是当时使用百度地图的搜索加油站的结果

下面这个是切换到腾讯地图在相同位置的搜索加油站的结果

但是,百度地图搜索的充电站数量好像也不少,跟腾讯地图也有差不多。

1.2、坐标转换比较麻烦

使用uni.getLocation()方法虽然获取到的坐标是gcj02,但是在百度地图下,得使用百度的坐标,必须转换一次,不然坐标误差是非常大的。

1.3、官方文档写的太乱

百度地图的官方文档写的,真的是一言难尽。

1.4、资料很少

貌似很多人都用高德的地图API,网上一搜很多,但是百度地图的相对就比较少了。虽然腾讯地图网上资料比较少,但是官网的开发文档还是很清晰明了的,这在一定程度上弥补了网上资料少的缺点。

二、腾讯地图额度信息

腾讯地图也是比较良心的,每日额度是三家里面最多的10000次/天,是高德地图的100倍,百度地图的2倍。缺点就是并发比较少,只有5次/秒。对于我们现阶段也是很充足的了。

三、微信公众平台配置

如果使用腾讯地图,必须提前把腾讯地图Api放到域名白名单里面。

微信小程序后台,依次定位到开发管理→开发设置→服务器域名,在request合法域名里面加上百度地图的网址

https://apis.map.qq.com/

如果微信开发者工具提示域名不合法,记得刷新一下开发者工具的域名信息。

刷新后记得重新编译项目。

三、获取附近加油站功能改造

其实三家地图的API都是类似的,我这里主要用了两个API,逆地址解析geocoder还有地点搜索search

3.1、逆地址解析

用于将uniapp获取到的经纬度解析成实际位置。

let getLocation = function(radius = 1000, successFn) {
    var latitude = '' //纬度
    var longitude = '' //经度
    if (uni.getStorageSync('position') == '') {
        uni.getLocation({
            geocode: true,
            type: 'gcj02',
            altitude: true,
            accuracy: 'best',
            isHighAccuracy: true,
            success: (res) => {
                console.log('位置是', res)
                latitude = res.latitude
                longitude = res.longitude
                uni.setStorageSync('latitude', latitude)
                uni.setStorageSync('longitude', longitude)
                uni.request({
                    url: 'https://apis.map.qq.com/ws/geocoder/v1/?key=' + TENCENT_MAP_KEY +
                        '&location=' + latitude + ',' + longitude +
                        '&get_poi=1&output=json',
                    success: function(res) {
                        let result = res.data.result
                        let province = result.address_component.province
                        let city = result.address_component.city
                        // 省份名称
                        uni.setStorageSync('province', province)
                        // 城市名称
                        uni.setStorageSync('city', city)
                        // 城市编号
                        uni.setStorageSync('citycode', result.ad_info.city_code)
                        successFn(result, province, city)
                    },
                    fail(err) {
                        console.log('获取位置信息失败:' + JSON.stringify(err))
                    }
                })
            },
            fail: (err) => {
                console.log('获取位置信息失败:' + JSON.stringify(err))
            }
        })
    }
}

接口示例

https://apis.map.qq.com/ws/geocoder/v1/?location=39.984154,116.307490&key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-WPB77&get_poi=1

请求参数

参数必填说明示例
key开发密钥(Key)key=OB4BZ-D4W3U-B7VVO-4PJWW-6TKDJ-*
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
output返回格式:支持JSON/JSONP,默认JSONoutput=json
callbackJSONP方式回调函数callback=function1

响应结果

名称类型必填说明
statusnumber状态码,0为正常,其它为异常,详细请参阅状态码说明
messagestring状态说明
request_idstring本次请求的唯一标识
resultobject逆地址解析结果
addressstring以行政区划+道路+门牌号等信息组成的标准格式化地址
formatted_addressesobject结合知名地点形成的描述性地址,更具人性化特点
recommendstring推荐使用的地址描述,描述精确性较高
roughstring粗略位置描述
address_componentobject地址部件,address不满足需求时可自行拼接
nationstring国家
provincestring
citystring市,如果当前城市为省直辖县级区划,city与district字段均会返回此城市 注:省直辖县级区划adcode第3和第4位分别为9、0,如济源市adcode为419001
districtstring区,可能为空字串
streetstring街道,可能为空字串
street_numberstring门牌,可能为空字串
ad_infoobject行政区划信息
nation_codestring国家代码(ISO3166标准3位数字码)
adcodestring行政区划代码,规则详见:行政区划代码说明
city_codestring城市代码,由国家码+行政区划代码(提出城市级别)组合而来,总共为9位
namestring行政区划名称
locationobject行政区划中心点坐标
latnumber纬度
lngnumber经度
nationstring国家
provincestring省 / 直辖市
citystring市 / 地级区 及同级行政区划,如果当前城市为省直辖县级区划,city与district字段均会返回此城市 注:省直辖县级区划adcode第3和第4位分别为9、0,如济源市adcode为419001
districtstring区 / 县级市 及同级行政区划
address_referenceobject坐标相对位置参考
famous_areaobject知名区域,如商圈或人们普遍认为有较高知名度的区域
idstring地点唯一标识
titlestring名称/标题
locationobject坐标
latnumber纬度
lngnumber经度
_distancenumber此参考位置到输入坐标的直线距离
_dir_descstring此参考位置到输入坐标的方位关系,如:北、南、内
business_areaobject商圈,目前与famous_area一致
townobject乡镇街道
idstring地点唯一标识
titlestring名称/标题
locationobject坐标
latnumber纬度
lngnumber经度
_distancenumber此参考位置到输入坐标的直线距离
_dir_descstring此参考位置到输入坐标的方位关系,如:北、南、内
landmark_l1object一级地标,可识别性较强、规模较大的地点、小区等 【注】对象结构同 famous_area
landmark_l2object二级地标,较一级地标更为精确,规模更小 【注】:对象结构同 famous_area
streetobject街道 【注】:对象结构同 famous_area
street_numberobject门牌 【注】:对象结构同 famous_area
crossroadobject交叉路口 【注】:对象结构同 famous_area
waterobject水系 【注】:对象结构同 famous_area
poi_countnumber 查询的周边poi的总数,仅在传入参数get_poi=1时返回
poisarray周边地点(POI)数组,数组中每个子项为一个POI对象
idstring地点(POI)唯一标识
titlestring名称
addressstring地址
categorystring地点分类信息
locationobject提示所述位置坐标
latnumber纬度
lngnumber经度
ad_infoobject行政区划信息
adcodenumber行政区划代码
provincestring省,如果当前城市为直辖市,返回空
citystring市,如果当前城市为省直辖县级区划,city与district字段均会返回此城市 注:省直辖县级区划adcode第3和第4位分别为9、0,如济源市adcode为419001
districtstring
_distancenumber该POI到逆地址解析传入的坐标的直线距离

3.2、获取附近加油站

let getOilStation = function(stationType = '加油站', radius = 1000, successFn) {
    let latitude = uni.getStorageSync('latitude') //纬度
    let longitude = uni.getStorageSync('longitude') //经度
    uni.request({
        url: 'https://apis.map.qq.com/ws/place/v1/search?key=' + TENCENT_MAP_KEY +
            '&boundary=nearby(' + latitude + ',' + longitude + ',' + radius + ',0)' +
            '&keyword=' + encodeURI(stationType) +
            '&page_size=20&page_index=1' +
            '&orderby=_distance&output=json',
        success: function(res) {
            successFn(res)
        }
    })
}

请求URL

https://apis.map.qq.com/ws/place/v1/search

请求参数

请求方式(Method): GET

参数必填说明示例
key开发密钥(Key)key=OB4BZ-D4W3U-*
keyword搜索关键字,长度最大96个字节,:keyword仅支持检索一个。 (API采用UTF-8字符编码,1个英文字符占用1个字节, 1个中文字符占3个字节,具体请参阅相关技术资料)keyword=酒店,注意键值要进行URL编码(推荐encodeURI),如 keyword=%e9%85%92%e5%ba%97
boundary格式: boundary=nearby(lat,lng,radius[, auto_extend]) 子参数: lat,lng:搜索中心点的经纬度,格式顺序为纬度在前,经度在后 radius:搜索半径,单位:米,取值范围:10到1000 auto_extend:[可选] 当前范围无结果时,是否自动扩大范围,取值: 0 不扩大 1 [默认] 自动扩大范围(依次按照按1公里、2公里、5公里, 最大到全城市范围搜索)boundary=nearby(28.681114,115.918377,1000,1)
get_subpois是否返回子地点,如大厦停车场、出入口等取值: 0 [默认]不返回 1 返回get_subpois=1
filter筛选条件 1. 指定分类筛选,语句格式为: category=分类名1,分类名2 最多支持5个分类词(支持的分类请参考:POI分类表) 2. 排除指定分类,语句格式为: category<>分类名1,分类名2 最多支持5个分类词(支持的分类请参考:POI分类表) 3. 筛选有电话的地点:tel<>null搜索指定分类 filter=category=公交站 搜索多个分类 filter=category=大学,中学 排除指定分类 filter=category<>商务楼宇 (注意参数值要进行url编码)
orderby排序,支持按距离由近到远排序,取值:_distance 说明: 1. 周边搜索默认排序会综合考虑距离、权重等多方面因素 2. 设置按距离排序后则仅考虑距离远近,一些低权重的地点可能因距离近排在前面,导致体验下降orderby=_distance
page_size每页条目数,最大限制为20条,默认为10条page_size=10
page_index第x页,默认第1页page_index=2
output返回格式: 支持JSON/JSONP,默认JSONoutput=json
callbackJSONP方式回调函数callback=function1

响应结果

名称类型必填说明
statusnumber状态码,0为正常,其它为异常,详细请参阅状态码说明
messagestring状态说明
countnumber本次搜索结果总数,另外本服务限制最多返回200条数据(data), 翻页(page_index)超过搜索结果总数 或 最大200条限制时,将返回最后一页数据。
request_idstring本次请求的唯一标识,由系统自动生成,用于追查结果有异常时使用
dataarray搜索结果POI(地点)数组,每项为一个POI(地点)对象
idstringPOI(地点)唯一标识
titlestringPOI(地点)名称
addressstring地址
telstring电话
categorystringPOI(地点)分类
typenumberPOI类型,值说明:0:普通POI / 1:公交车站 / 2:地铁站 / 3:公交线路 / 4:行政区划
locationobject坐标
latnumber纬度
lngnumber经度
_distancenumber距离,单位: 米,在周边搜索、城市范围搜索传入定位点时返回
ad_infoobject行政区划信息
adcodenumber行政区划代码,详见:行政区划代码说明
provincestring
citystring市,如果当前城市为省直辖县级区划,此字段会返回为空,由district字段返回。 注:省直辖县级区划adcode第3和第4位分别为9、0,如济源市adcode为419001
districtstring
sub_poisarray子地点列表,仅在输入参数get_subpois=1时返回
parent_idstring主地点ID,对应data中的地点ID
idstring地点唯一标识
titlestring地点名称
telstring电话
categorystringPOI(地点)分类
typenumberPOI类型,值说明:0:普通POI / 1:公交车站 / 2:地铁站 / 3:公交线路 / 4:行政区划
addressstring地址
locationobject坐标
latnumber纬度
lngnumber经度
ad_infoobject行政区划信息
adcodenumber行政区划代码,详见:行政区划代码说明
provincestring
citystring市,如果当前城市为省直辖县级区划,此字段会返回为空,由district字段返回。 注:省直辖县级区划adcode第3和第4位分别为9、0,如济源市adcode为419001
districtstring

四、使用腾讯地图一些问题

目前切换到腾讯地图之后遇到的一些问题

  1. 不能显示加油站或充电站图片,百度地图是有个参数photo_show,如果photo_show开启,会提示授权失败。具体原因不清楚,没搜到,但是腾讯地图是直接就没有这个参数。
  2. 并发确实少点。
微信小程序小程序高德地图百度地图腾讯地图油耗笔记油耗笔记OilNote
朗读
赞(23)
赞赏
感谢您的支持,我会继续努力哒!
版权属于:

香草物语

评论 (0)