基于 Java 和高德开放平台 WebAPI 的 POI 搜索集成实践
在 Java 项目中集成高德开放平台 WebAPI 的方法,重点演示 POI 搜索功能的实现。内容包括获取 API Key、使用 Uniapi 定义接口、发送 HTTP 请求及解析返回数据。通过关键字搜索和多边形搜索示例,展示了完整的调用流程、参数配置及结果处理,并讨论了常见问题如频率限制和安全性优化。

在 Java 项目中集成高德开放平台 WebAPI 的方法,重点演示 POI 搜索功能的实现。内容包括获取 API Key、使用 Uniapi 定义接口、发送 HTTP 请求及解析返回数据。通过关键字搜索和多边形搜索示例,展示了完整的调用流程、参数配置及结果处理,并讨论了常见问题如频率限制和安全性优化。

地理信息系统(GIS)和位置服务(LBS)已成为许多应用程序的核心组成部分。高德开放平台作为国内领先的地理信息服务提供商,提供了丰富的 WebAPI 接口,帮助开发者快速集成地图、导航、搜索等功能。其中,POI(Point of Interest)搜索是许多应用场景中的关键功能。
Java 因其跨平台性、稳定性和丰富的生态系统,成为企业级应用的首选开发语言。将 Java 与高德开放平台的 WebAPI 进行集成,可以充分利用 Java 的强大功能,实现复杂的地理信息服务。本文将以搜索 POI2.0 为例,详细介绍如何在 Java 项目中集成高德开放平台的 WebAPI,并实现高效的 POI 搜索功能。
高德开放平台提供地图、定位、导航等 API 服务。为了获取更精准的数据,建议从高德平台获取数据。进入开放平台首页后,可查看产品介绍及具体专题介绍页面。
平台的 POI 搜索 API 提供了多种搜索方式,包括关键字搜索、周边搜索、多边形搜索等。
POI 搜索 2.0 版本在原有功能的基础上,进一步优化了搜索算法,提升了搜索结果的准确性和响应速度。同时,API 支持 JSON 等数据格式返回。
以按关键字搜索为例,请求参数及响应参数如下。
关键字搜索 API 服务地址
请求参数
| 参数名 | 含义 | 规则说明 | 是否必须 | 缺省值 |
|---|---|---|---|---|
| key | 高德 Key | 用户在高德地图官网申请 Web 服务 API 类型 Key | 必填 | 无 |
| keywords | 地点关键字 | 需要被检索的地点文本信息,只支持一个关键字,文本总长度不可超过 80 字符 | 必填 | 无 |
| types | 指定地点类型 | 限定地点搜索结果,多个 poi typecode 用' | '分隔 | 可选 |
| region | 搜索区划 | 增加指定区域内数据召回权重 | 可选 | 无 |
| city_limit | 指定城市数据召回限制 | true/false,为 true 时仅召回 region 对应区域内数据 | 可选 | false |
| show_fields | 返回结果控制 | 筛选 response 结果中可选字段 | 可选 | 空 |
| page_size | 当前分页展示的数据条数 | 取值 1-25 | 可选 | 10 |
| page_num | 请求第几分页 | 请求第几分页 | 可选 | 1 |
| sig | 数字签名 | 请参考官方文档 | 可选 | 无 |
| output | 返回结果格式类型 | 默认 json | 可选 | json |
| callback | 回调函数 | 只在 output 参数设置为 JSON 时有效 | 可选 | 无 |
返回结果
名称 | 类型 | 说明 | ||
status | string | 本次 API 访问状态,如果成功返回 1,如果失败返回 0。 | ||
info | string | 访问状态值的说明,如果成功返回"ok",失败返回错误原因。 | ||
infocode | string | 返回状态说明,10000 代表正确。 | ||
count | string | 单次请求返回的实际 poi 点的个数 | ||
pois | object | 返回的 poi 完整集合 | ||
本节详细介绍如何在 Java 中使用 Uniapi 来集成高德 API 实现相关的检索服务。
在 Java 项目中集成高德开放平台的 WebAPI,通常需要以下几个步骤:
在 Uniapi 中创建访问 api,用来跟开放平台进行交互,示例代码如下:
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);
}
上述接口中的参数说明已在第一节中进行讲解。
在 Java 当中调用 Uniapi 定义的接口,根据传入的参数查询目标 POI。例如查询湖南省长沙市岳麓区的餐饮服务数据,每页返回 20 条数据。集成的访问代码如下:
package com.yelang.project.unihttp;
import org.junit.Test;
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.AmapSearchService;
@SpringBootTest
@RunWith(SpringRunner.class)
public class AmaPOISearchCase {
private static final String AMAP_CLIENT_AK = "申请的访问 key";
@Autowired
private AmapSearchService amapSearchService;
/**
* - 关键字搜索 API 服务地址
*/
@Test
public void searchByKeyWordOrTypes() throws InterruptedException {
String keywords = "餐饮";
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 Key 泄露。
本文详细介绍了如何在 Java 项目中集成高德开放平台的 WebAPI,并实现高效的 POI 搜索功能。示例涵盖了从 API 密钥的获取、HTTP 请求的发送、数据的解析到最终结果的展示等完整流程。开发者可根据实际需求,灵活应用这些技术解决实际问题。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online
JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online
使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online
Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online