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

news2024/11/29 10:34:57

前言

该篇文章是关键词搜索法获取高德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;
    }

}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mirror功能

实现方式 mirror逻辑的工作阶段&#xff1a; ngx在log phase之后&#xff08;在ngx_http_free_request处调用&#xff09;已完成向client端返回response&#xff0c;在log phase之后完成close connection&#xff08;短链接&#xff09;&#xff0c;在该阶段处理mirror逻辑不…

【Redis】高级篇: 一篇文章讲清楚Redis的单线程和多线程

目录 面试题 Redis到底是多线程还是单线程&#xff1f; 简单回答 详解 Redis的“单线程” Redis为什么选择单线程&#xff1f; 后来Redis为什么又逐渐加入了多线程特性&#xff1f; Redis为什么快&#xff1f; 回答 IO多路复用 Unix网络编程的5种IO模型 主线程和IO…

温湿度传感器的工作原理及应用领域你了解多少呢?

传感器是一种将物理量转换为电信号的装置&#xff0c;用于检测温度、湿度、压力、光强、震动等物理量。它能够将检测到的物理量转换为电信号&#xff0c;并输送到计算机、单片机等设备进行分析和处理。生产生活中&#xff0c;不同的场所和环境对温湿度有着特殊要求&#xff0c;…

看完即会,抓取微信小程序数据包教程

在给VIP学员答疑的时候&#xff0c;有很多小伙伴问到能不能抓取到微信小程序数据呢&#xff1f;答案当然是肯定的&#xff0c;通过Fiddler或者Charles这些主流的抓包工具都可以抓得到&#xff0c;在IOS平台抓取微信小程序和https请求都是一样的设置&#xff0c;接下来给大家通过…

【代码随想录day20】验证二叉搜索树

题目 给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。 节点的右子树只包含 大于 当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 思路 最开始想简单…

Linux 学习记录58(ARM篇)

Linux 学习记录58(ARM篇) 本文目录 Linux 学习记录58(ARM篇)一、GIC相关寄存器1. 系统框图2. 中断号对应关系 二、GICD寄存器1. GICD_CTLR2. GICD_ISENABLERx3. GICD_IPRIORITYRx4. GICD_ITARGETSRx5. GICD_ICPENDRx 三、GICC寄存器1. GICC_PMR2. GICC_CTLR3. GICC_IAR4. GICC_…

JAVA面试总结-Redis篇章(五)——持久化

Java面试总结-Redis篇章&#xff08;五&#xff09;——持久化 1.RDBRDB全称Redis Database Backup file (Redis数据备份文件)&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故障重启后&#xff0c;从磁盘读取快照文件&#x…

持续贡献开源力量,棱镜七彩加入openKylin

近日&#xff0c;棱镜七彩签署 openKylin 社区 CLA&#xff08;Contributor License Agreement 贡献者许可协议&#xff09;&#xff0c;正式加入openKylin 开源社区。 棱镜七彩成立于2016年&#xff0c;是一家专注于开源安全、软件供应链安全的创新型科技企业。自成立以来&…

短视频账号矩阵系统源码开发部署路径

一、短视频批量剪辑的开发逻辑算法 1.视频剪辑之开发算法 自己研发视频剪辑是指通过对视频素材进行剪切、调整、合并等操作&#xff0c;利用后台计算机算法&#xff0c;进行抽帧抽组抽序进行排列以达到对视频内容进行修改和优化的目的。自己研发的视频剪辑工具可以通过后台码…

系统集成项目管理工程师挣值分析笔记大全

系统集成项目管理工程师挣值分析笔记大全 挣值分析是一种项目管理技术&#xff0c;用于量化和监控项目绩效。它通过比较计划值&#xff08;PV&#xff09;、实际成本&#xff08;AC&#xff09;和挣值&#xff08;EV&#xff09;三个参数来评估项目的进展情况和成本绩效。 挣值…

系统架构设计师-软件架构设计(3)

目录 一、软件架构风格&#xff08;其它分类&#xff09; 1、闭环控制结构&#xff08;过程控制&#xff09; 2、C2风格 3、MDA&#xff08;模型驱动架构 Model Driven Architecture&#xff09; 4、特定领域软件架构&#xff08;DSSA&#xff09; 4.1 DSSA基本活动及产出物…

《CUDA C++ Programming Guide》第一章 CUDA介绍

第一章 CUDA介绍 1.1 使用GPUs的好处 在相同的价格和功耗范围内&#xff0c;图形处理器 GPU 比 CPU 提供了更高的指令吞吐量和内存带宽, 许多应用程序利用这些更高的功能在 GPU 上比在 CPU 上运行得更快。相比较其他计算设备&#xff0c;如 FPGA&#xff0c;也是非常节能的&a…

协议和模型

1 规则 1.1 通信基础知识 不同网络的规模、形状和功能都存在很大差异。它们可以复杂到通过互联网来连接设备&#xff0c;也可以简单到直接将两台计算机用一根电缆连接&#xff0c;或者是介于这两种之间。然而&#xff0c;只是完成终端设备之间的有线或无线物理连接并不足以实…

MATLAB基础知识回顾

目录 1.帮助命令 2.数据类型 3.元胞数组和结构体 4.矩阵操作 4.1 矩阵的定义与构造 4.2 矩阵的四则运算 4.3 矩阵的下标 5.程序结构 5.1 for循环结构 5.2 分支结构 7.基本绘图操作 7.1.二维平面绘图 6.2 三维立体绘图 7.图形的保存与导出 8.补充 语句后⾯加;的作…

Kaggle图表内容识别大赛TOP方案汇总

赛题名称&#xff1a;Benetech - Making Graphs Accessible 赛题链接&#xff1a;https://www.kaggle.com/competitions/benetech-making-graphs-accessible 赛题背景 数以百万计的学生有学习、身体或视力障碍&#xff0c;导致人们无法阅读传统印刷品。这些学生无法访问科学…

人机合一Linux

未来云系统成为主流&#xff0c;维护电脑这种充满时代特性的技术&#xff0c;完全不重要了。 无论是学习还是工作&#xff0c;电脑都是IT人必不可少的重要武器&#xff0c;一台好电脑除了自身配置要经得起考验&#xff0c;后期主人对它的维护也是决定它寿命的重要因素&#xff…

【01trie】CF1851F

Problem - F - Codeforces 题意&#xff1a; 思路&#xff1a; 首先最大异或对可以用01trie解决 trie树入门_lamentropetion的博客-CSDN博客 ai xor x 和 aj xor x 都必须为1 因此可以转换为 ai 和 aj 最小异或对问题 改一下01trie的板子即可 主要修改部分在query上 p…

如何把视频中的背景删掉,AI抠像,瞬间换背景!

不用绿幕也能快速抠除视频背景。一个可以去除视频背景的AI智能抠像工具&#xff0c;上传视频后会自动去除背景&#xff0c;支持单人、多人等各类场景&#xff0c;智能扫描识别&#xff0c;发丝级细节处理&#xff0c;快捷高效。 随着AI 抠像技术的不断成熟和普及&#xff0c;我…

5-7月大更新!EasyOps®全平台34+新特性齐上线~

为了提供更好的产品使用体验&#xff0c;优维从未停止更新升级的脚步。在5-7月份&#xff0c;EasyOps全平台更新上线34新功能&#xff0c;涉及Hyperlnsight超融合监控、CMDB、DevOps、AutoOps、ITSM、公共服务&#xff0c;在不断的技术创新过程中&#xff0c;进一步加速IT运维效…

存算一体化(Processing in Memory, PIM)入门

一、 存算一体化 概念&#xff1a; 简单来说就是将存储资源中嵌入计算能力&#xff0c;以新的运算架构进行二维和三维矩阵乘法/加法运算。这样减少了数据频繁移动带来的延迟和能耗方面的开销。 背景&#xff1a; 虽然多核&#xff08;例如CPU&#xff09;/众核&#xff08;例…