基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例

基于Java和高德开放平台的WebAPI集成实践-以搜索POI2.0为例

目录

前言

一、高德搜索API简介

1、高德开放平台

2、搜索功能介绍 

3、部分API介绍

二、Uniapi集成高德API

1、API集成流程

2、访问接口的定义

3、业务调用集成

三、常见问题与优化

四、总结


前言

        在当今数字化时代,地理信息系统(GIS)和位置服务(LBS)已成为许多应用程序的核心组成部分。无论是导航、物流、社交网络还是电子商务,位置数据的获取和处理都显得尤为重要。高德开放平台作为国内领先的地理信息服务提供商,提供了丰富的WebAPI接口,帮助开发者快速集成地图、导航、搜索等功能。其中,POI(Point of Interest)搜索是许多应用场景中的关键功能,它能够帮助用户快速找到附近的兴趣点,如餐馆、酒店、加油站等。

        Java作为一种广泛使用的编程语言,因其跨平台性、稳定性和丰富的生态系统,成为许多企业级应用的首选开发语言。将Java与高德开放平台的WebAPI进行集成,不仅可以充分利用Java的强大功能,还能快速实现复杂的地理信息服务。本文将以搜索POI2.0为例,详细介绍如何在Java项目中集成高德开放平台的WebAPI,并实现高效的POI搜索功能。示例将涵盖从API密钥的获取、HTTP请求的发送、数据的解析到最终结果的展示等完整流程。通过本文的学习,开发者将能够掌握Java与高德开放平台WebAPI集成的基本方法,并能够根据实际需求,灵活应用这些技术解决实际问题。

        总之,Java与高德开放平台的WebAPI集成,为开发者提供了强大的工具,帮助他们快速构建高效、稳定的地理信息服务应用。通过本文的实践,开发者将能够更好地理解和使用高德开放平台的API,为未来的项目开发打下坚实的基础。

一、高德搜索API简介

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

1、高德开放平台

        在之前的系列博客中,我们介绍了天地图的相关WebAPI,基于天地图的WebAPI我们可以做一些应用。由于一些客观存在的原因,比如天地图的一些POI数据,与百度和高德等平台还是有一定差距,下次可以针对某一个具体的检索场景,对同一个区域进行检索,来对比一下三个平台的数据情况,本文暂且不表。因此为了能有更精准的数据参与分析,这里我们来说说如何从高德平台获取数据。进入到开放平台的首页后可以看到以下界面,这里有很多介绍的文字,大家可以到官网看一下,不再赘述。

        点击界面中的产品介绍,进入详细的产品介绍页面,操作界面如下:

         这里点击搜索进入到具体的搜索专题介绍页面,地图搜索与产品构建息息相关,基于地理空间的搜索结果,可以灵活、直观地呈现在地图图面上,为用户带来全新价值。目前我们的搜索服务包括:POI搜索、地理/逆地理编码、输入提示、天气及行政区域查询。

2、搜索功能介绍 

        平台的POI搜索API提供了多种搜索方式,包括关键字搜索、周边搜索、多边形搜索等。

关键字搜索:开发者可通过文本关键字搜索地点信息,文本可以是结构化地址,例如:北京市朝阳区望京阜荣街10号;也可以是 POI 名称,例如:首开广场;周边搜索:开发者可设置圆心和半径,搜索圆形区域内的地点信息;多边形区域搜索:开发者可设置首尾连接的几何点组成多边形区域,搜索坐标对应多边形内的地点信息;ID搜索:开发者可通过已知的地点 ID(POI ID)搜索对应地点信息,建议结合输入提示接口使用。

        通过这些API,开发者可以根据用户的需求,灵活地获取所需的POI信息。POI搜索2.0版本在原有功能的基础上,进一步优化了搜索算法,提升了搜索结果的准确性和响应速度。同时,API还支持多种数据格式的返回,如JSON、XML等,方便开发者根据项目需求进行数据解析和处理。

3、部分API介绍

        关于开放平台接口的API介绍,官方有详细的说明,这里我们以按关键字搜索为例子,详细介绍它的请求参数以及响应参数信息。

        关键字搜索 API 服务地址

URL

请求方式

https://restapi.amap.com/v5/place/text?parameters

GET

        parameters 代表的参数包括必填参数和可选参数。所有参数均使用和号字符(&)进行分隔。下面的列表枚举了这些参数及其使用规则。 

        请求参数

参数名

含义

规则说明

是否必须

缺省值

key

高德Key

用户在高德地图官网 申请 Web 服务 API 类型Key

必填

keywords

地点关键字

需要被检索的地点文本信息。

只支持一个关键字 ,文本总长度不可超过80字符

必填(keyword 或者 types 二选一必填)

types

指定地点类型

地点文本搜索接口支持按照设定的 POI 类型限定地点搜索结果;地点类型与 poi typecode 是同类内容,可以传入多个 poi typecode,相互之间用“|”分隔,内容可以参考 POI 分类码表;地点(POI)列表的排序会按照高德搜索能力进行综合权重排序;

可选(keyword 或者 types 二选一必填)

120000(商务住宅)

150000(交通设施服务)

region

搜索区划

增加指定区域内数据召回权重,如需严格限制召回数据在区域内,请搭配使用 city_limit 参数,可输入 citycode,adcode,cityname;cityname 仅支持城市级别和中文,如“北京市”。

可选

无,默认全国范围内搜索

city_limit

指定城市数据召回限制

可选值:true/false

为 true 时,仅召回 region 对应区域内数据。

可选

false

show_fields

返回结果控制

show_fields 用来筛选 response 结果中可选字段。show_fields 的使用需要遵循如下规则:

1、具体可指定返回的字段类请见下方返回结果说明中的“show_fields”内字段类型;

2、多个字段间采用“,”进行分割;

3、show_fields 未设置时,只返回基础信息类内字段。

可选

page_size

当前分页展示的数据条数

page_size 的取值1-25

可选

page_size 默认为10

page_num

请求第几分页

请求第几分页

可选

page_num 默认为1

sig

数字签名

请参考 数字签名获取和使用方法

可选

output

返回结果格式类型

默认格式为 json,目前只支持 json 格式;

可选

json

callback

回调函数

callback 值是用户定义的函数名称,此参数只在 output 参数设置为 JSON 时有效。

可选

        返回结果

名称

类型

说明

status

string

本次 API 访问状态,如果成功返回1,如果失败返回0。

info

string

访问状态值的说明,如果成功返回"ok",失败返回错误原因,具体见 错误码说明

infocode

string

返回状态说明,10000代表正确,详情参阅info状态表

count

string

单次请求返回的实际 poi 点的个数

pois

object

返回的 poi 完整集合

poi

单个 poi 内包含的完整返回数据

name

string

poi 名称

id

string

poi 唯一标识

location

string

poi 经纬度

type

string

poi 所属类型

typecode

string

poi 分类编码

pname

string

poi 所属省份

cityname

string

poi 所属城市

adname

string

poi 所属区县

address

string

poi 详细地址

pcode

string

poi 所属省份编码

adcode

string

poi 所属区域编码

citycode

string

poi 所属城市编码

注意以下字段如需返回需要通过“show_fields”进行参数类设置。

children

object

设置后返回子 POI 信息

id

string

子 poi 唯一标识

name

string

子 poi 名称

location

string

子 poi 经纬度

address

string

子 poi 详细地址

subtype

string

子 poi 所属类型

typecode

string

子 poi 分类编码

sname

string

子 poi 分类信息

subtype

string

再次确认子 poi 分类信息

business

object

设置后返回 poi 商业信息

business_area

string

poi 所属商圈

opentime_today

string

poi 今日营业时间,如 08:30-17:30 08:30-09:00 12:00-13:30 09:00-13:00

opentime_week

string

poi 营业时间描述,如 周一至周五:08:30-17:30(延时服务时间:08:30-09:00;12:00-13:30);周六延时服务时间:09:00-13:00(法定节假日除外)

tel

string

poi 的联系电话

tag

string

poi 特色内容,目前仅在美食poi下返回

rating

string

poi 评分,目前仅在餐饮、酒店、景点、影院类 POI 下返回

cost

string

poi 人均消费,目前仅在餐饮、酒店、景点、影院类 POI 下返回

parking_type

string

停车场类型(地下、地面、路边),目前仅在停车场类 POI 下返回

alias

string

poi 的别名,无别名时不返回

keytag

string

poi 标识,用于确认poi信息类型 

rectag

string

用于再次确认信息类型 

indoor

object

设置后返回室内相关信息

indoor_map

string

是否有室内地图标志,1为有,0为没有

cpid

string

如果当前 POI 为建筑物类 POI,则 cpid 为自身 POI ID;如果当前 POI 为商铺类 POI,则 cpid 为其所在建筑物的 POI ID。

indoor_map 为0时不返回

floor

string

楼层索引,一般会用数字表示,例如8;indoor_map 为0时不返回

truefloor

string

所在楼层,一般会带有字母,例如F8;indoor_map 为0时不返回

navi

object

设置后返回导航位置相关信息

navi_poiid

string

poi 对应的导航引导点坐标。大型面状 POI 的导航引导点,一般为各类出入口,方便结合导航、路线规划等服务使用

entr_location

string

poi 的入口经纬度坐标

exit_location

string

poi 的出口经纬度坐标

gridcode

string

poi 的地理格 id

photos

object

设置后返回 poi 图片相关信息

title

string

poi 的图片介绍

url

string

poi 图片的下载链接

二、Uniapi集成高德API

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

1、API集成流程

        在Java项目中集成高德开放平台的WebAPI,通常需要以下几个步骤:首先,开发者需要在高德开放平台注册账号,并创建应用以获取API密钥(Key)。API密钥是调用高德API的凭证,每个应用都有唯一的密钥。其次,开发者需要在Java项目中引入HTTP客户端库,用于发送HTTP请求并接收API的响应。常用的HTTP客户端库包括Apache HttpClient、OkHttp、Uniapi等,本文将以Uniapi为例重点介绍。接下来,开发者需要根据高德API的文档,构建符合要求的请求URL,并处理API返回的数据。最后,开发者可以根据业务需求,对获取的POI数据进行进一步的处理和展示。关于如何在高德开放平台中申请账号并获取APIkey,大家可以在官方文档中查找,不再做详细的介绍。

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://restapi.amap.com/v5") public interface AmapSearchService { @GetHttpInterface("/place/text") public HttpResponse<String> getSearch(@QueryPar("keywords") String keywords,@QueryPar("types") String types,@QueryPar("region") String region,@QueryPar("page_size") String page_size,@QueryPar("page_num") String page_num ,@QueryPar("show_fields")String show_fields, @QueryPar("key") String key); @GetHttpInterface("/place/polygon") public HttpResponse<String> searchByPolygon(@QueryPar("polygon") String polygon,@QueryPar("keywords") String keywords,@QueryPar("types") String types,@QueryPar("page_size") String page_size,@QueryPar("page_num") String page_num ,@QueryPar("show_fields")String show_fields, @QueryPar("key") String key); } 

        在上面的例子中,创建了两个访问接口。第一个方法是根据关键字来调用检索,第二个 方法是根据一个polygon范围来进行检索。上述接口中的参数说明已经在第一节中进行讲解,可以往前搜索以下。

3、业务调用集成

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

package com.yelang.project.unihttp; import org.geotools.geometry.jts.JTSFactoryFinder; import org.junit.Test; import org.junit.runner.RunWith; import org.locationtech.jts.geom.Coordinate; import org.locationtech.jts.geom.GeometryFactory; import org.locationtech.jts.geom.LinearRing; import org.locationtech.jts.geom.Polygon; 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.google.gson.Gson; import com.yelang.common.utils.StringUtils; import com.yelang.common.utils.geo.CoordinateTransformUtil; import com.yelang.project.education.domain.amap.AmapSearchVO; import com.yelang.project.thridinterface.AmapSearchService; @SpringBootTest @RunWith(SpringRunner.class) public class AmaPOISearchCase { private static final String AMAP_CLIENT_AK = "申请的访问key"; @Autowired private AmapSearchService amapSearchService; /** * - 关键字搜索 API 服务地址 * @throws InterruptedException */ @Test public void searchByKeyWordOrTypies() throws InterruptedException { String; String types = "050000"; String page_size = "20"; String region = "430104"; String show_fields = "children,business,indoor,navi,photos"; HttpResponse<String> result = null; for(int i = 1;i<= 1;i++) { result = amapSearchService.getSearch(keywords, types,region, page_size,String.valueOf(i),show_fields,AMAP_CLIENT_AK); System.out.println(result.getBodyResult()); Thread.sleep(3000L);//休眠3秒 } } }

        接下来我们运行上面的程序,可以在控制台中看到以下的输出:

        看到以下的信息说明返回成功,接口成功调用,下面我们将返回结果进行格式化。

三、常见问题与优化

        在实际开发过程中,开发者可能会遇到一些常见问题,如API调用频率限制、数据解析错误、网络请求超时等。针对这些问题,开发者可以通过合理的代码设计和异常处理机制,确保系统的稳定性和可靠性。此外,高德开放平台还提供了详细的开发文档和技术支持,帮助开发者快速解决遇到的问题。

         在实际项目开发过程中,需要注意相关key的保护问题。这里使用的明文保存的方式,在使用高德API时需要注意的安全性问题,如API Key的保护、数据传输的加密等。可以采用加密的方式对明文进行保存,在访问时进行解密即可。

四、总结

        以上就是本文的主要内容,本文将以搜索POI2.0为例,详细介绍如何在Java项目中集成高德开放平台的WebAPI,并实现高效的POI搜索功能。示例将涵盖从API密钥的获取、HTTP请求的发送、数据的解析到最终结果的展示等完整流程。通过本文的学习,开发者将能够掌握Java与高德开放平台WebAPI集成的基本方法,并能够根据实际需求,灵活应用这些技术解决实际问题。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。

Read more

【完整源码+数据集+部署教程】美食图像分割系统源码&数据集分享 [yolov8-seg-FocalModulation&yolov8-seg-GFPN等50+全套改进创新点发刊_一键训练教程_Web

【完整源码+数据集+部署教程】美食图像分割系统源码&数据集分享 [yolov8-seg-FocalModulation&yolov8-seg-GFPN等50+全套改进创新点发刊_一键训练教程_Web

背景意义 随着信息技术的迅猛发展,计算机视觉领域的研究逐渐深入,尤其是在图像分割和物体检测方面的应用越来越广泛。美食图像分割作为计算机视觉中的一个重要研究方向,不仅在餐饮行业、食品安全监测、营养分析等领域具有重要的实际应用价值,还为美食文化的传播和推广提供了新的技术手段。YOLO(You Only Look Once)系列模型以其高效的实时检测能力和较高的准确性,成为了图像分割领域的热门选择。特别是YOLOv8的推出,进一步提升了模型在复杂场景下的表现,使其在美食图像分割任务中展现出更为优越的性能。 本研究旨在基于改进的YOLOv8模型,构建一个高效的美食图像分割系统。我们使用的数据集包含3800张图像,涵盖136种不同类别的美食,包括各类主菜、配菜、调料等。这一丰富的类别设置为模型的训练和测试提供了良好的基础,能够有效提升模型对不同美食的识别能力。通过对美食图像的精确分割,不仅可以实现对美食的自动识别,还能够为后续的营养分析、热量计算和个性化推荐等应用提供数据支持。 在当今社会,健康饮食和营养均衡已成为人们日益关注的话题。通过美食图像分割技术,可以帮助用户更好地了解所摄取食物的

爬虫对抗:ZLibrary反爬机制实战分析——前端混淆、请求签名与频率限制的逆向工程与绕过思路

摘要 ZLibrary作为全球最大的数字图书馆之一,其反爬虫机制的演进堪称现代Web防御技术的缩影。从早期的简单IP封禁,到如今融合网络层限速、应用层指纹识别、前端JS混淆、动态签名校验、行为分析及混合验证码的多维防御体系,ZLibrary构建了一套全链路的反爬闭环。本文基于实战抓包(Charles/Wireshark)、浏览器调试(Chrome DevTools)及代码逆向(Frida/AST还原)等技术手段,对ZLibrary的反爬机制进行深度拆解。核心聚焦三大技术难点:IP频率限制的分层阈值与画像机制、前端JS混淆下的动态令牌生成逻辑(token/sign)、以及请求签名与TLS指纹的协同校验。文章不仅揭示各机制的底层技术原理,更输出一套可工程化复用的绕过思路,包括代理池的精细调度、浏览器指纹的模拟、无头浏览器的优化及验证码的降级预防策略。全文约2万字,旨在为爬虫技术与Web安全研究者提供深度的实战参考。 关键词: ZLibrary;反爬虫;JS混淆;请求签名;频率限制;指纹识别;验证码;逆向工程 第一章 技术背景与研究目标 1.1 爬虫与反爬虫的“军备竞赛”现状

前端组件库:别再重复造轮子了

前端组件库:别再重复造轮子了 毒舌时刻 这组件写得跟拼凑似的,一点都不统一。 各位前端同行,咱们今天聊聊前端组件库。别告诉我你还在手动编写所有组件,那感觉就像在没有工具的情况下盖房子——能盖,但效率低得可怜。 为什么你需要组件库 最近看到一个项目,每个组件都要手动编写,样式不统一,维护困难。我就想问:你是在做组件还是在做重复劳动? 反面教材 // 反面教材:手动编写组件 // Button.jsx import React from 'react'; function Button({ children, onClick }) { return ( <button onClick={onClick} style={{ padding: '10px 20px', backgroundColor: '#007bff', color: '

【前端高频面试题】 - TypeScript 篇

【前端高频面试题】—— TypeScript 篇(2025-2026 最新趋势版) 以下是目前大厂和中高级前端岗位最常问的 TypeScript 面试题,按出现频率和难度从高到低排序,涵盖基础、进阶、工程化、类型体操等多个维度。 基础 & 核心概念(几乎必问) 1. TypeScript 和 JavaScript 的主要区别是什么?TypeScript 的优势和劣势分别有哪些? 2. type 和 interface 有什么区别?什么场景下应该用哪个? 3. 什么是类型推断(Type Inference)?举几个常见的类型推断场景。 4. const 和 readonly 的区别?什么时候用 readonly? 5. 什么是类型兼容性(Type Compatibility)?结构类型系统和标称类型系统有什么区别? 6. any、unknown、