当前位置: 首页 > news >正文

使用UniApi调用百度地图API的需要注意的地方

目录

前言

一、百度开放平台

1、功能简介

2、地点搜索服务

3、按行政区划检索API

二、Uniapi集成百度API

1、API集成流程

2、访问接口的定义

3、业务调用集成

三、可能遇到的问题

1、指定输出格式无效

2、返回数据的总数

四、总结


前言

        在之前的系列博客中,关于地图在线API我们介绍了天地图、高德开放平台API,当然除了这两个平台还有其它的平台。有朋友发私信留言,希望可以在Uniapi中调用百度开放平台的API的方法和实践方法介绍一下,因为他在亲自动手实践的时候出现了一些状况,然后来交流想看一下是否是哪里的设置有问题。在此之前,对百度地图的API使用的也不多,而且想着都是开放平台,调用方式应该差不多。但是在亲自动手联调的时候,却发现了几个地方不符合预期。

        本文是一篇实践型内容,主要讲解如何在Java中使用uniapi来集成百度地图的开放接口实现POI数据的获取,重点讲解在集成过程中的遇到的几个问题,围绕面向问题来寻找解决方案,叙述如何来解决这些问题,让大家在使用同样的方式进行集成时遇到问题有一些参考。为了让大家对百度地图开放平台API有更深入的了解,博文首先将依然对使用到的百度API接口进行简单的介绍,然后介绍在Uniapi来调用百度地图的API接口,最后针对问题来逐一讲解解决方案。示例将涵盖从API密钥的获取、HTTP请求的发送、数据的解析到最终结果的展示等完整流程。通过本文的学习,开发者将能够掌握Java与百度开放平台WebAPI集成的基本方法,并能够根据实际需求,灵活应用这些技术解决实际问题。通过本文的实践,开发者将能够更好地理解和使用百度开放平台的API,为未来的项目开发打下坚实的基础。

一、百度开放平台

        本节介绍百度开放平台的功能和主要服务,包括地图、定位、导航等API的概述。其次介绍如何在百度平台中申请个人的账号,以及简要介绍对接方法。

1、功能简介

        在之前的系列博客中,我们介绍了天地图的相关WebAPI和高德的开放平台API,基于这两个WebAPI我们可以做一些应用。高德地图和百度地图都是很优秀的地图类产品,这里我们来说说如何从百度平台获取数据。进入到开放平台的首页后可以看到以下界面,这里有很多介绍的文字,大家可以到官网看一下,不再赘述。

         关于百度地图提供的服务接口有很多,这里有一个总的入口可以粗略的看一下:

        与高德地图提供的接口类似,基本的导航服务、规划服务、地图服务都是应有尽有,大家可以尽情的发挥自己的聪明才智来进行功能使用和探索。 

2、地点搜索服务

        地点检索服务(又名Place API)是一类Web API接口服务;服务提供多种场景的地点(POI)检索功能,包括城市检索、圆形区域检索、多边形区域检索。开发者可通过接口获取地点(POI)基础或详细地理信息。注意:地点检索服务适用于【XX大厦】、【XX小区】等POI地点名称的检索;若需要检索结构化地址,如【北京市海淀区上地十街十号】,则推荐使用地理编码服务。

        以地点搜索API为例,地点搜索包含以下几种地点规则,分别市行政区划区域检索,圆形区域检索,多边形检索,地点详情检索,地点输入提示,POI图片获取以及获取POI的营业状态。

3、按行政区划检索API

         为了让大家对百度的开放平台API有更深入的了解,这里将把官网的按行政区划检索POI数据的接口进行重点讲解,希望对大家理解API有所帮助。开发者可通过该功能,检索某一行政区划内(目前最细到城市级别)的地点信息。

        API的服务地址:

https://api.map.baidu.com/place/v2/search?query=ATM机&tag=银行&region=北京&output=json&ak=您的ak
//GET请求

        请求参数

参数名称参数含义示例字段类型必选
query

检索关键字。行政区划区域检索不支持多关键字检索。
如果需要按POI分类进行检索,请将分类通过query参数进行设置,如query=美食

天安门、美食string(45)
region

检索行政区划区域(增加区域内数据召回权重,如需严格限制召回数据在区域内,请搭配使用city_limit参数),可输入行政区划名或对应cityCode

北京、131(北京的code)、全国,等string(50)
ak

开发者的访问密钥,必填项。v2之前该属性为key。申请密钥

string(50)
tag

检索分类偏好,与query组合进行检索,多个分类以","分隔 (POI分类),如果需要严格按分类检索,请通过query参数设置

美食string(50)
city_limit区域数据召回限制,为true时,仅召回region对应区域内数据。true、falsestring(50)
extensions_adcode是否召回国标行政区划编码,true(召回)、false(不召回)true、falsestring(50)
output输出格式为json或者xmljson或xmlstring(50)
scope检索结果详细程度。取值为1 或空,则返回基本信息;取值为2,返回检索POI详细信息1、2string(50)
center

传入poi坐标,辅助检索结果按照距离排序返回。
注意:需要结合filter字段一起使用并结合coord_type字段说明该字段的坐标类型

38.76623,116.43213
lat<纬度>,lng<经度>

string(50)
filter检索过滤条件。当scope取值为2时,可以设置filter进行排序。industry_type:行业类型,注意:设置该字段可提高检索速度和过滤精度,取值有: hotel(宾馆);cater(餐饮);life(生活娱乐) sort_name:排序字段,根据industry_type字段的值而定。 1、industry_type为hotel时,sort_name取值有: default(默认);price(价格);total_score(好评);level(星级);health_score(卫生);distance(距离排序,需结合center字段一起使用) 2、industry_type为cater时,sort_name取值有: default(默认);taste_rating(口味);price(价格);overall_rating(好评);service_rating(服务);distance(距离排序,需结合center字段一起使用) 3、industry_type为life时,sort_name取值有: default(默认);price(价格);overall_rating(好评);comment_num(服务);distance(距离排序,需结合center字段一起使用)sort_rule:排序规则:0(从高到低),1(从低到高)price_section:价格区间groupon:是否有团购:1(有),0(无)discount:是否有打折:1(有),0(无)sort_name:distance|sort_rule:1string(50)
coord_type

传入的坐标类型,1(wgs84ll即GPS经纬度),2(gcj02ll即国测局经纬度坐标),3(bd09ll即百度经纬度坐标),4(bd09mc即百度米制坐标)注:"ll为小写LL"坐标详细说明

1、2、3(默认)、4int
ret_coordtype

返回的坐标类型,可选参数,添加后POI返回国测局经纬度坐标坐标详细说明

gcj02llstring(50)
page_size单次召回POI数量,默认为10条记录,最大返回20条。多关键字检索时,返回的记录数为关键字个数*page_size。10int
page_num分页页码,默认为0,0代表第一页,1代表第二页,以此类推。常与page_size搭配使用,仅当返回结果为poi时可以翻页。0、1、2int
sn

开发者的权限签名。sn校验说明

string(50)可选,若开发者所用AK的校验方式为SN校验时该参数必须。
timestamp设置sn后该值必填。string(50)设置sn后该值必填。
photo_show是否输出图片信息:true(输出) 、false(不输出)true、falsebool
address_result

query传入结构化地址(如:上地十街10号),检索结果返回数据的类型。
若不传入该字段,默认召回门址数据,仅当address_result=false时,召回相应的POI数据

falsestring(50)
extenstions_town

当取值为true时,召回POI的乡镇街道信息
注意:该功能为高级付费功能,您可提交工单咨询

false、true
默认值:false

string(50)
language

指定输入参数和召回参数的语言类型,可支持的语言类型为英文
注意:该功能为高级付费功能,您可提交工单咨询

en

string(50)

        返回参数

返回参数类型备注
statusInt本次API访问状态,如果成功返回0,如果失败返回其他数字。(见服务状态码)
messagestring对API访问状态值的英文说明,如果成功返回ok,并返回结果字段,如果失败返回错误说明。
totalintPOI检索总数,开发者请求中设置了page_num字段才会出现total字段。出于数据保护目的,单次请求total最多为150。
result_typestringregion_type 行政区划类型;address_type 结构化地址类型;poi_type poi类型;city_type 城市类型
results返回的结果
namestringpoi名称
locationobjectpoi经纬度坐标
latfloat纬度值
lngfloat经度值
addressstringpoi地址信息
provincestring所属省份
citystring所属城市
areastring所属区县
townstring所属乡镇街道信息
注意:该功能为高级付费功能,您可提交工单咨询
adcodeint行政区划代码
telephonestringpoi电话信息
uidstringpoi的唯一标识,可用于详情检索
statusstringPOI的状态:
空(代表正常营业)
推算位置(代表开放/营业/办公状态可能有变化)
暂停营业
可能已关闭
已关闭
注意:该功能为高级付费功能,您可提交工单咨询
street_idstring街景图id
detailstring是否有详情页:1有,0没有
detail_infoobjectpoi的扩展信息,仅当scope=2时,显示该字段,不同的poi类型,显示的detail_info字段不同。
classified_poi_tagstringPOI展示分类(细致分类)
distanceint32距离中心点的距离,圆形区域检索时返回
typestring所属分类,如hotel、cater。
tagstring标签
labelstring标签细分解释,比如停车场标签(地上停车场/地下停车场),知名景区标签(几A级景区),酒店标签(什么类型酒店)等
navi_locationobjectPOI对应的导航引导点坐标。大型面状POI的导航引导点,一般为各类出入口,方便结合导航、路线规划等服务使用
lngfloat导航引导点经度
latfloat导航引导点纬度
aliasarraypoi别名
detail_urlstringpoi的详情页
childrenpoi子点数据,若某poi无子点,该字段为空
uidstringpoi子点的唯一标示,可用于详情检索
namestringpoi子点名称
show_namestringpoi子点简要名称
tagstringpoi子点类别
locationobjectpoi子点坐标 {"lat":39.911318,"lng":116.402284}, // lat poi子点纬度 , lng poi子点经度
addressstringpoi子点地址
pricestringpoi商户的价格
shop_hoursstring营业时间
overall_ratingstring总体评分
taste_ratingstring口味评分
service_ratingstring服务评分
environment_ratingstring环境评分
facility_ratingstring星级(设备)评分
hygiene_ratingstring卫生评分
technology_ratingstring技术评分
image_numstring图片数
groupon_numint团购数
discount_numint优惠数
comment_numstring评论数
favorite_numstring收藏数
checkin_numstring签到数
brandstringpoi对应的品牌(如加油站中的『中石油』、『中石化』)
content_tagstringpoi标签信息
photosarraypoi图片的下载链接。注意:该功能为高级付费功能,您可提交工单咨询。

二、Uniapi集成百度API

        本节详细介绍如何在Java中使用Uniapi来集成百度api实现相关的检索服务。主要从以下三个部分进行介绍,第一是介绍API的集成流程;第二是介绍如何在Uniapi中定义接口;第三是介绍如何在业务中进行集成。

1、API集成流程

        在官网中已经详细的说明了如何进行API的注册和集成,按照以下的步骤进行集成即可。

        与所有的开放平台一样,要想在外面调用这些接口来进行token的申请,在下面的应用中可以创建访问token。

2、访问接口的定义

          这里介绍如何在Uniapi中创建访问api,用来跟开放平台进行交互,uniapi的操作比较简单,下面是示例代码:

package com.yelang.project.thridinterface;
import com.burukeyou.uniapi.http.annotation.HttpApi;
import com.burukeyou.uniapi.http.annotation.param.QueryPar;
import com.burukeyou.uniapi.http.annotation.request.GetHttpInterface;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
@HttpApi(url = "https://api.map.baidu.com/place/v2")
public interface BaiduGeoSearchService {@GetHttpInterface("/search?")public HttpResponse<String> getSearch(@QueryPar("query") String query,@QueryPar("region") String region,@QueryPar("output") String output,@QueryPar("ak") String ak,@QueryPar("page_size") int pageSize,@QueryPar("page_num") int pageNum,@QueryPar("scope") String scope);
}

        请注意,这里的参数跟之前的请求参数有一定的差异,因为我们按照需要传入相应的请求参数即可,不需要传入所有的参数。在上面的例子中,创建了两个一个访问接口。第一个方法是根据关键字和行政区划来调用检索一些感兴趣的空间地理信息。 

3、业务调用集成

         接下来讲解如何在Java当中调用Uniapi定义的接口,根据我们传入的参数来查询目标POI。比如我们需要查询湖南省长沙市的医院(query:医院)的数据,每页数据返回的大小为20条数据。集成的访问代码如下:

package com.yelang.project.unihttp;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import com.burukeyou.uniapi.http.core.response.HttpResponse;
import com.yelang.project.thridinterface.BaiduGeoSearchService;
@SpringBootTest
@RunWith(SpringRunner.class)
public class BaiduGeoUnihttpCase {private static final String BAIDU_CLIENT_AK = "百度AK";@Autowiredprivate BaiduGeoSearchService bdsearchService;@Testpublic void testSearch() {String query = "医院";String region = "长沙市";String output = "json";HttpResponse<String> result = bdsearchService.getSearch(query, region, output, BAIDU_CLIENT_AK,20,0,"2");System.out.println("第一页的数据如下:");System.out.println(result.getBodyResult());}
}

        完成以上的定义之后,我们就可以来调用相关的接口实现关键字的指定行政区划检索,执行结果如如下图所示:

        细心的朋友一定发了上面红框中的问题 。在代码中我们指定了响应数据的格式为json,但后台返回前端的却不是,那么问题出在哪里呢?下节将进行讲解。

三、可能遇到的问题

        在实际开发过程中,开发者可能会遇到一些常见问题,如API调用频率限制、数据解析错误、网络请求超时等。这里我们讲解两个很容易碰到的问题,第一个就是上面提到过的指定输出格式后,输出依然是Xml格式的问题,另外就是如何获取数据总数,从而进行分页获取数据的问题。

1、指定输出格式无效

        请注意,在前面的代码中我们已经正确的设置了请求接口中的值output,String output = "json";表示输出响应数据格式为json,而不要是xml。如果不是用uniapi的朋友,大家可以去看一下官方提供的实例,也是可以直接运行跑的。官方实例如下:

        请注意在官方提供的示例里,需要访问的接口search后是跟了一个问号的。如果您使用的不是uniapi那么应该是没有问题的。如果使用了uniapi后,一定不要有这个问号,问否输出的值就一直是xml,这个问题曾经让我很迷惑,以为是哪里的值没传过去。 经过事件,在定义时一定不要在search后加?。将问号去掉以后再来看最后的输出,如下所示:

        是不是惊奇的发现output参数生效了,是我们需要的json了,那么将output修改成xml来看看有没有作用?可以直观的看到,这里的响应输出已经改为xml了,说明output参数可以进行精确的控制。

2、返回数据的总数

        在上面的数据中,我们要查询整个长沙市的医院,省会城市的医院数量肯定是超过20条,因为我们设置了默认的参数是20。在返回的响应报文中,包含了数据的总数是130,如下:

"status":0,
"message":"ok",
"total":130,
"result_type":"poi_type",

        如果你的接口返回的数据中没有包含total字段,请先检查在请求接口中是否传入了page_num即当前第几页的参数。没有这个参数,则接口中不会返回total。POI检索总数,开发者请求中设置了page_num字段才会出现total字段。 

四、总结

        以上就是本文的主要内容,本文是一篇实践型内容,主要讲解如何在Java中使用uniapi来集成百度地图的开放接口实现POI数据的获取,重点讲解在集成过程中的遇到的几个问题,围绕面向问题来寻找解决方案,叙述如何来解决这些问题,让大家在使用同样的方式进行集成时遇到问题有一些参考。为了让大家对百度地图开放平台API有更深入的了解,博文首先将依然对使用到的百度API接口进行简单的介绍,然后介绍在Uniapi来调用百度地图的API接口,最后针对问题来逐一讲解解决方案。通过文本,大家不仅掌握了百度地图API接口的相关功能、如何集成百度地图以及使用UniApi的实践过程,希望对大家有所帮助。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

相关文章:

  • asp.net core api RESTful 风格控制器
  • STM32之蜂鸣器和按键
  • 支持同步观看的媒体服务器GhostHub
  • SpringCloud微服务开发与实战
  • 初识计算机网络。计算机网络基本概念,分类,性能指标
  • 代码随想录60期day38
  • “分布形态“
  • Java 常用的Arrays函数
  • 初识仓颉编程语言:高效、简洁与创新的编程选择
  • C++:字符串操作函数
  • uniapp-商城-60-后台 新增商品(属性的选中和页面显示,数组join 的使用)
  • NexBot AI 1.9.3 | 专业AI写作助手,高自由度定制内容,支持中文设置
  • foxmail - foxmail 启用超大附件提示密码与帐号不匹配
  • ESP32 PWM开发对比:底层驱动 VS Arduino封装,谁更适合你?
  • 4.3/Q1,Charls最新文章解读
  • XML介绍及常用c及c++库
  • Transformer 模型与注意力机制
  • LlamaIndex 第九篇 Indexing索引
  • 2025第三届盘古石杯初赛(计算机部分)
  • 系统线程nt!CcPfBootWorker里面的nt!MmPrefetchPages函数分析
  • 新闻1+1丨强对流天气频繁组团来袭,该如何更好应对?
  • 湖南慈利一村干部用AI生成通知并擅自发布,乡纪委立案
  • 媒体:中国女排前队长朱婷妹妹被保送浙大受质疑,多方回应
  • 媒体:“重病老人银行取款身亡”涉事家属称已和解,银行将支付十万
  • 严打金融黑灰产,今年来上海警方破获各类经济犯罪案件690余起
  • 美叙领导人25年来首次会面探索关系正常化,特朗普下令解除对叙经济制裁