【WEB开发】Java获取高德POI(关键词搜索法)实现数据展示

前言

该篇文章是关键词搜索法获取高德poi,但鉴于无法突破200条记录的上限,所以采用了本方法进行区/县循环检索。开始之前我们首先需要明白一些常识

  1. poi是兴趣点,它本身除了经纬度,还记录了一些信息,如名称、地址、联系方式、所属行政区
  2. 高德poi是指从高德地图上获取poi,所以我们借助的平台是高德地图
  3. 高德地图知道有很多人需要用到poi,因此它十分良心地推出了若干个接口(API),借助这些API我们就可以各取所需。

API的理解
我们把整个poi的获取理解成以下几个步骤:
(1)找“高德地图”这个人申请要数据
(2)高德地图他说你申请数据需要先填一下这张数据需求表
(3)你拿到这张表(API),开始填写表(API)里的信息,包括POI的类别,POI的区域,需要数据的格式
(4)高德地图看了你填写的需求表,就从它的数据库里找到并且交回给你
(5)你拿到数据之后,筛选出关心的信息,之后就找各种方式把数据保存起来,例如存成一份excel表,或者一份txt文件,抑或是csv表格等等
所以通俗地讲,API就是一份表,通过这个表可以让对方返回你需要的东西,只不过实际上,这个表是用链接的形式发给你,在链接里填入信息就相当于填表的行为了。

使用说明

了解了相关信息后我们就可以进行开发测试,首先我们需要进入控制台获取key,这个操作很简单,如果不放心可以搜索一下到处都是教程。

第一步,申请”Web服务API”密钥(Key);
第二步,拼接HTTP请求URL,第一步申请的Key需作为必填参数一同发送;
第三步,接收HTTP请求返回的数据(JSON格式),解析数据。
如无特殊声明,接口的输入参数和输出数据编码全部统一为UTF-8。

适用场景

然后呢,我们从适用场景那里得知,这个搜索poi有四种方法可以获取poi,分别是关键字搜索、周边搜索、多边形搜索和ID查询,我们这里使用最简单的关键字搜索。
在这里插入图片描述

在这里仅仅对一部分URL和请求参数作出截图展示并介绍,详情请看https://lbs.amap.com/api/webservice/guide/api/search,高德地图在接口的使用上给出了详细的解释

在这里插入图片描述

1.key,就是我们上面申请的密钥
2.keywords或者types,注意是两者至少填一个,我示例里选择的是types
3.city,这个如果不填的话默认是帮你搜索全国的,但我们一般都会指定一个区域
4.page,你可以想象成一页页的纸,高德地图默认每页20条信息,默认返回一页给你,也就是20条。那么为了获取全部的poi,我们需要高德地图返回尽可能多页给我们,直到搜不到poi为止,因此这个参数在控制循环的时候尤为重要
5.output,返回的数据格式类型,我们一般都返回JSON格式,方便我们处理

在这里插入图片描述

不难发现,这个API里面有一些参数是我们熟悉的,例如keywords、city、key,并且这些关键词都是通过“&”符号进行连接,因此我们只要能够替换掉它的这些信息,就可以完成API的构建啦。
例如我需要获取东莞市的,就把 city=beijing改成city = 宜春市需要获取加油站类型的poi,就把keywords换成types,然后types = 加油站即可。

实现思路

我们现在已经学会怎么通过修改链接里的关键词来构建我们所需的API,那么下一步其实只需要向高德地图发出申请即可

但仔细思考,我们可以把整个过程划分成以下三个部分:

  1. 发出一次申请,高德地图返回一页数据给我,我们可以将这一次的申请想象成举手向老师拿东西(但注意,老师不会一次性把所有东西都给你)
  2. 我们通过某个指标,保证区域内的poi都获取完,这个过程理解为如果老师没有把东西全都给我,那我就一直举手,直到给完为止。
  3. 获取完之后我们需要将数据返回到前端展示,因此这个过程需要我们想方设法地存成某种文件。通过上面过程的划分,我们可以抽象成三个函数,一个举手函数,一个反复举手函数,一个返回展示函数(因为不复杂合二为一)。

实现代码

/**
 * 高德地图OPI搜索加油站信息返回页面展示
 *
 * @author zhuoooo
 * @data 2023/7/17 15:47
 */
@Controller
@RequestMapping("/map")
public class MapPOIController {

    @Autowired
    private RestTemplate restTemplate;

    private final String key = "a0a72610dfc8e6eb2910734c4c30e9f4";
    private final String url = "https://restapi.amap.com/v3/place/text";
    //    private final String city = "宜春市";//查询宜春市返回的数据显示不完整
    private final String keywords = "加油站";


    /**
     * MVC实现点位数据的获取和页面展示
     * @param model model
     * @return 页面名称
     */
    @RequestMapping("/poi")
    public String index(Model model) {
        //得到总共多少条数据(简单方法直接带入391)
        //分页进行请求api
        JSONArray pois = null;
        int size = 0;
        //分区/县循环进行查询数据并保存
        String cities[] = {"袁州区", "万载县", "铜鼓县", "宜丰县", "上高县", "靖安县", "奉新县", "高安市", "樟树市", "丰城市"};
        List<MapInfo> mapInfos = new ArrayList<>();
        //每个城市进行循环查找数据
        for (int k = 0; k < 10; k++) {
            //每个城市查找两页(每页50,没有超过100的县城)
            for (int j = 1; j <= 2; j++) {
                pois = getPois(j, cities[k]);
                size += pois.length();
                if (pois.length() != 0) {
                    System.out.println(cities[k]+"第" + j + "躺的数据:" + pois);


                    //定义list存储加油站名称和位置信息
                    for (int i = 0; i < pois.length(); i++) {
                        //获取每一条数据的名称和位置信息
                        JSONObject poiJson = pois.getJSONObject(i);
                        String location = poiJson.get("location").toString();
                        String[] split = location.split(",");
                        String longitude = split[0];
                        String latitude = split[1];

                        String name = poiJson.get("name").toString();

                        //定义mapInfo将数据添加进去
                        MapInfo mapInfo = new MapInfo();
                        mapInfo.setLocation(location);
                        mapInfo.setLongitude(longitude);
                        mapInfo.setLatitude(latitude);
                        mapInfo.setName(name);

                        mapInfos.add(mapInfo);
                    }
                }
            }
        }
        model.addAttribute("size", size);
        model.addAttribute("mapInfos", mapInfos);

        return "gaode_map";
    }

    /**
     * 调用高德API获取加油站点位数据
     * @param page 页码
     * @param city 城市
     * @return 返回API调用的点位数据
     */
    private JSONArray getPois(int page, String city) {
        //API请求获取加油站json数据
        String api = url + "?key=" + this.key + "&keywords=" + this.keywords + "&offset=50&city=" + city + "&page=" + page;
        ResponseEntity<String> responseEntity = restTemplate.exchange(api, HttpMethod.GET, null, String.class);
        String body = responseEntity.getBody();

        //将Json数据转换成Java对象
        JSONObject jsonObject = new JSONObject(body);
        //获取pois属性list对象
        JSONArray pois = jsonObject.getJSONArray("pois");
        return pois;
    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/45765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

opencv-19 图像色彩空间转换函数cv2.cvtColor()

cv2.cvtColor() 函数是 OpenCV 中用于图像颜色空间转换的函数。它允许你将图像从一个色彩空间转换为另一个色彩空间。在 Python 中&#xff0c;你可以使用这个函数来实现不同色彩空间之间的转换。 函数的基本语法为&#xff1a; cv2.cvtColor(src, code[, dst[, dstCn]])参数…

消息队列(一)-- RabbitMQ入门(4)

RabbitMQ 其他知识点 幂等性 消息重复消费 消费者在消费MQ 中的消息时&#xff0c;MQ 已经把消息发送给消费者&#xff0c;消费者在给 MQ 返回 ack 时网络中断&#xff0c;故MQ 未收到确认消息&#xff0c;该消息会重新发给其他消费者&#xff0c;或网络重新连接后再次发给该消…

计算机科学cs/电子信息ei面试准备——数学基础/线性代数复习

1. 中值定理 中值定理是反映函数与导数之间联系的重要定理&#xff0c;也是微积分学的理论基础&#xff0c;在许多方面它都有重要的作用&#xff0c;在进行一些公式推导与定理证明中都有很多应用。中值定理是由众多定理共同构建的&#xff0c;其中拉格朗日中值定理是核心&…

登录和注册页面 - 验证码功能的实现

目录 1. 生成验证码 2. 将本地验证码发布成 URL 3. 后端返回验证码的 URL 给前端 4. 前端将用户输入的验证码传给后端 5. 后端验证验证码 1. 生成验证码 使用hutool 工具生成验证码. 1.1 添加 hutool 验证码依赖 <!-- 验证码 --> <dependency><groupId…

Android Studio Flamingo Logcat使用方式

旧版Android Studio突然打不开了&#xff0c;安装了新的Flamingo。习惯用Log.e看日志&#xff0c;突然发现logcat没有筛选下拉了。o(╥﹏╥)o 还是需要查看官方文档&#xff1a;https://developer.android.google.cn/studio/debug/logcat?hlzh-cn &#xff08;不知道为啥&…

jdk,jre和jvm三者的关系和区别

目录 一、三者的关系 二、JDK的概念 三、JRE的概念 四、JVM的概念 五、三者区别 一、三者的关系 从图中可以清楚地看到&#xff0c;他们之间的关系是JDK包含JRE, JRE又包含JVM。 因此&#xff0c;JDK包含JRE和JVM。 JDK JRE Java 开发工具包 [Java,Javac,Javadoc,Javap…

VS下c++解析pcap文件

一、pcap文件格式 https://www.cnblogs.com/Chary/articles/15716063.html 接口协议&#xff08;四&#xff09;&#xff1a;以太网&#xff08;Ethernet&#xff09;学习&#xff08;一&#xff09;&#xff1a;协议_以太网协议_QNee的博客-CSDN博客 二、代码 pcapParser.h #…

自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下自然语言处理实战项目13-基于GRU模型与NER的关键词抽取模型训练全流程。本文主要介绍关键词抽取样例数据、GRU模型模型构建与训练、命名实体识别(NER)、模型评估与应用&#xff0c;项目的目标是通过训练一个GRU模型…

npm i babel-plugin-import -D之后报错

替换modules/.bin/XX文件 1.vue-cli-service #!/bin/sh basedir$(dirname "$(echo "$0" | sed -e s,\\,/,g)")case uname in*CYGWIN*) basedircygpath -w "$basedir";; esacif [ -x "$basedir/node" ]; then"$basedir/node"…

Audio Clip

Unity支持的音频格式&#xff1a; aiff/wav&#xff1a;适用于较短声音片段 mp3/OGG:适用于较长的音乐片段 多声道强制转为单声道&#xff0c;减小所占内存。 勾选后会对声音有优化 在后台加载声音 Load Type&#xff1a; 第一个&#xff0c;以不压缩的形式存在内存&#…

深度学习(二)

目录 一、神经网络 整体架构: 架构细节: 神经元个数的影响: 神经网络过拟合解决: 卷积网络 整体架构: 卷积层 边缘填充 特征尺寸计算 池化层 特征图变化 递归神经网络 一、神经网络 整体架构: 图中分别为输入层、隐层1、隐层2、输出层 通过输入层输入某数值&#xf…

Java版本企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外部…

FAQ文档的重点注意事项!别踩坑了

在很多优秀的大企业中&#xff0c;FAQ文档是企业运营管理中不可或缺的重要部分。但是也仅限大企业&#xff0c;很多企业目前还是没有这个意识的。一方面原因是因为缺乏这个客户服务的意识&#xff0c;另一方面也和技术水平不足有关。但是其实现在有不少的第三方搭建平台可以帮助…

【Element-ui】学习与使用

网站快速成型工具Element&#xff0c;一套为开发者、设计师和产品经理准备的基于vue2.0的桌面端组件库 安装 npm i element-ui -S 在项目中安装element-ui&#xff0c;安装了以后查看package.json中的依赖中有没有element-ui的版本&#xff0c;如果有&#xff0c;则说明安装成功…

react 在build读取env 数据

默认会读取.env 文件 npm install dotenv --save npm install dotenv-cli --save-dev例如读取.env.test "build:test": "dotenv -e .env.test react-app-rewired build",.env.test REACT_APP_CURRENTMODE devREACT_APP_Public_Path "https://baid…

如何利用JMeter测试带有Token参数的POST接口

JMeter有一个很强大的功能就是可以用来做接口测试。 接口测试是测试系统组件间接口的一种测试。接口测试主要用于检测外部系统与系统之间以及内部各个子系统之间的交互点。测试的重点是要检查数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及系统间的相互逻辑依赖关系…

TikTok广告数据不好?收下这份常见问题自查手册!

你是一位跨境卖家吗&#xff1f;你是否在TikTok上投放过广告&#xff1f; 如果你的答案是肯定的&#xff0c;那么你可能遇到过一些困扰。比如&#xff0c;你的广告为什么不起量&#xff1f;为什么突然掉量了&#xff1f;为什么成本上升了&#xff1f;到底是哪里出了问题&#…

基于linux下的高并发服务器开发(第二章)- 2.22 setitimer 定时器函数

#include <sys/time.h> int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value); - 功能&#xff1a;设置定时器&#xff08;闹钟&#xff09;。可以替代alarm函数。精度微妙us&#xff0c;可以实现周期性定时 - 参数&#xff1a; -…

网络安全(黑客)就业分析指导

一、针对网络安全市场分析 市场需求量高&#xff1b;则是发展相对成熟入门比较容易。所需要的技术水平国家政策环境 对于国家与企业的地位愈发重要&#xff0c;没有网络安全就没有国家安全 更有为国效力的正义黑客—红客联盟 可见其重视程度。 需要掌握的知识点偏多 外围打点…

RocketMQ教程-(5)-功能特性-事务消息

事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。 事务消息为 Apache RocketMQ 中的高级特性消息&#xff0c;本文为您介绍事务消息的应用场景、功能原理、使用限制、使用方法和使用建议。…