基于ApachePOI实现百度POI分类快速导入PostgreSQL数据库实战

目录

前言

一、百度POI分类简介

1、数据表格

 2、分类结构

二、从Excel导入到PG数据库

1、Excel解析流程

2、数据入库

3、入库成果及检索

三、总结


前言

        在上一篇博文中,我们对高德POI分类进行了深入剖析 并对Excel 中 POI 分类数据的存储结构特点进行了详细介绍,针对美食、电影院等不同分类数据字段特性,还将着重探索如何优化导入流程,基于ApachePOI实现高德POI分类快速导入PostgreSQL数据库实战。除了高德地图之外,还有百度开放地图也同样提供POI的检索服务,与之配套的也还有POI分类的管理。但是两个POI的分类存在非常大的差异,层次结构也是不一样的。如下图:

        百度地图的POI分类从大类来说就跟高德POI不一样,单从一级大类的数量来说,百度拥有 32个,而高德只区分了25个,不仅如何,从层级上来说,高德通常只区分了3即分类,而百度竟然有5级分类。那么本文即来重点讲讲百度POI分类与高德POI分类存在什么不一样的地方,同时深入讲解开百度 POI 分类如何进行数据导入,也为各类基于 POI 分类数据的地理信息系统开发、商业智能分析以及城市规划应用等,铺设一条从数据获取到存储利用的高效路径,助力行业在空间数据赋能下实现精准决策与创新发展。

一、百度POI分类简介

        本节将首先重点介绍百度地图的POI分类信息,在之前的博客中我们设计了用于POI管理的物理表,希望可以用来存储对应的POI分类信息。然后使用数据库脚本的方法对POI分类信息进行录入管理。而对于百度地图而言,其POI的分类是非常详细的,因此这一节我们来详细的解读一下百度的POI分类,让大家对分类信息有进一步的了解,为下一步数据的批量解析入库打下牢固的基础。

1、数据表格

        与之前介绍的内容一样,大家可以从百度的地图开放平台中获取其最新的POI分类的Excel表格,这里我将从官网下载的类型截取一部分给大家参考,这里不进行赘述,需要原始Excel表格的,可以去网站上下载。

        从上面这张图可以看出,百度地图的POI分类确实分的比较细,比较符合一些细粒度的区分,比如如果有一个场景需要区分历史博物馆和海洋博物馆等,如果使用的是百度的API来进行检索,那么是比较容易进行行业细分的。 同时也能看到一个比较明显的区别,在百度的POI分类中,在它的五级分类管理体系中,其分类没有编码的概念,也没有对应的英文,当然,编码只是一个逻辑编码,并不代表严格的含义,最主要的还是分类的名称,这才是最重要的。

        同样的,基于百度地图的POI检索可以从返回接口中看到其对应的POI分类值为:

{"name":"千佛洞景区","location":{"lat":28.220183,"lng":112.148422},"address":"长沙市宁乡市104县道(近天紫漂流)","province":"湖南省","city":"长沙市","area":"宁乡市","street_id":"","telephone":"(0731)87550989","detail":1,"uid":"5b25f44687acb9ea1029352c","detail_info":{"classified_poi_tag":"旅游景点;自然景观;风景区","new_alias":"宁乡千佛洞","tag":"旅游景点;风景区","navi_location":{"lng":112.14478762174,"lat":28.220406186348},"type":"scope","detail_url":"http://api.map.baidu.com/place/detail?uid=5b25f44687acb9ea1029352c&output=html&source=placeapi_v2","overall_rating":"4.4","comment_num":"56","shop_hours":"08:00-18:00","label":"AAAA景区,洞穴"}
}

          其中classified_poi_tag对应poi分类的类别。

 2、分类结构

        在了解了百度地图的POI分类之后,下面我们基于之前设计的数据库物理表和分类信息构建树形的信息。因此需要对其分类采取细致的分类管理。在进行树形层次构建时,我们根据分类名称来进行统一管理:

        这个结构是百度POI分类管理的基础,也是后面的数据程序解析的基础。我们将使用编码来进行五级分类的解析及入库。 在Excel中,很大的大类和种类都是重复的,因此需要在入库时将类别进行去重分类,最终构建一棵完整的POI分类树。 与高德POI分类不一样的是,百度的POI分类在层次上不是不一样的,不仅在层级上比高德多两极。同时存在为空的情况,并不是所有的POI分类都可以分成5级。

二、从Excel导入到PG数据库

        本节将详细介绍在Java中使用ApachePOI实现从Excel中解析到存储至PostgreSQL中,主要包含两个方面,第一个是如何结合POI分类的规则进行分类解析。第二个方面是如何基于Mybatis实现程序的批量入库。完整的数据处理流程与高德POI入库的流程一致,基本分为三个步骤:第一步是批量读取Excel,第二步是将Excel解析出POI分类数据,最后将分类好的数据导入到PG数据库中。由于百度地图和高德地图的层级存在很大的差距,因此这里着重介绍如何动态构建百度的层级树。

1、Excel解析流程

        首先还是对百度Excel的POI分类进行解析,在进行POI的分类进行构建时尤其重要,为了防止各层级在构建时出现重复的情况,这里采用LinkedHashMap集合来进行重复判断,在存储集合对象时,将分类编码作为map的key,而具体分类对象作为value。在后续的对象去重判断时,key就是重复的标记。为了实现Excel数据的导入,需要定义一个JavaBean来读取数据,其关键代码如下:        

package com.yelang.project.poisubject.poi.domain;
import java.io.Serializable;
import com.yelang.framework.aspectj.lang.annotation.Excel;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
/*** - 百度POI分类Excel视图对象* @author 夜郎king*/
@Data
@AllArgsConstructor
@NoArgsConstructor
public class BaiduPoiCategoryExcelVO implements Serializable{private static final long serialVersionUID = -4167642920886200649L;@Excel(name = "一级")private String levelFirst;//一级@Excel(name = "二级")private String levelSecond;//二级@Excel(name = "三级")private String levelThird;//三级@Excel(name = "四级")private String levelFourth;//四级@Excel(name = "五级")private String levelFifth;//五级
}

        与高德POI分类的Excel解析对象类似的是,这里的属性定义与Excel表格中的单元格需要逐一对应方可解析。 接下来读取Excel的数据,按照分类对百度POI分类进行层级重建,与高德的三级分类不同的是,百度地图有五级分类,需要进行五级分类的检验,核心代码如下:

File file = new File(BAIDU_POI_FILE);
FileInputStream fis = new FileInputStream(file);
ExcelUtil<BaiduPoiCategoryExcelVO> util = new ExcelUtil<BaiduPoiCategoryExcelVO>(BaiduPoiCategoryExcelVO.class);
List<BaiduPoiCategoryExcelVO> dataList = util.importExcel(fis);
LinkedHashMap<String,PoiCategory> amapPoiTypeMap = new LinkedHashMap<String, PoiCategory>();
for(BaiduPoiCategoryExcelVO poiCategory : dataList) {String levelFirst = poiCategory.getLevelFirst();//处理一级,添加到集合中if(!amapPoiTypeMap.containsKey(levelFirst)) {PoiCategory category = new PoiCategory(IdWorker.getId(),102L,"0,100,102",levelFirst,StringUtils.EMPTY,StringUtils.EMPTY);amapPoiTypeMap.put(levelFirst, category);}//处理二级,添加到集合中String levelSecond = poiCategory.getLevelSecond();if(com.yelang.common.utils.StringUtils.isEmpty(levelSecond)) {continue;}String keySecond = levelFirst + "-" + levelSecond;if(!amapPoiTypeMap.containsKey(keySecond)) {PoiCategory parentCategory = amapPoiTypeMap.get(levelFirst);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,levelSecond,StringUtils.EMPTY,StringUtils.EMPTY);amapPoiTypeMap.put(keySecond, category);}         //处理三级String levelThird = poiCategory.getLevelThird();if(com.yelang.common.utils.StringUtils.isEmpty(levelThird)) {continue;}String keyThird = keySecond + "-" + levelThird;if(!amapPoiTypeMap.containsKey(keyThird)) {PoiCategory parentCategory = amapPoiTypeMap.get(keySecond);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,levelThird,StringUtils.EMPTY,StringUtils.EMPTY);amapPoiTypeMap.put(keyThird, category);}    //处理四级String levelFourth = poiCategory.getLevelFourth();if(com.yelang.common.utils.StringUtils.isEmpty(levelFourth)) {continue;}String keyFourth = keyThird + "-" + levelFourth;if(!amapPoiTypeMap.containsKey(keyFourth)) {PoiCategory parentCategory = amapPoiTypeMap.get(keyThird);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,levelFourth,StringUtils.EMPTY,StringUtils.EMPTY);amapPoiTypeMap.put(keyFourth, category);}        //处理五级String levelFifth = poiCategory.getLevelFifth();if(com.yelang.common.utils.StringUtils.isEmpty(levelFifth)) {continue;}String keylevelFifth = keyFourth + "-" + levelFifth;if(!amapPoiTypeMap.containsKey(keylevelFifth)) {PoiCategory parentCategory = amapPoiTypeMap.get(keyFourth);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,levelFifth,StringUtils.EMPTY,StringUtils.EMPTY);amapPoiTypeMap.put(keylevelFifth, category);}
}

        在树形结构的构造过程当中,需要注意map中key的构建,与高德不一样的是,百度地图没有分类编码的设置,因此我们直接使用分类名称,在父子层级中将分类按照“-”进行连接作为组装,以此来构建一棵完整的分类层级树。

2、数据入库

        对于Mybatis的批量入库方法与高德POI入库的方法一致,均是采用Mybatis的批量入库方法。再次不进行重复叙述。在设置POI分类数据源的时候,需要区分所属平台,比如百度或者高德,这里需要进行一个设置。调用批量入库和统一属性的设置方法如下:

List<PoiCategory> categoryData = new ArrayList<PoiCategory>();
for (PoiCategory value : amapPoiTypeMap.values()) {value.setPlatform("baidu");value.setDelFlag(0);value.setStatus(0);value.setOrderNum(1);value.setCreateTime(DateUtils.getNowDate());categoryData.add(value);
}
poiCateGoryService.batchInsertPoiCategory(categoryData);
//数据入库 
System.out.println("finished...");

3、入库成果及检索

        完成以上的操作后就完成了百度POI分类数据的Postgresql数据库导入操作,程序执行完成后,可以在控制台看到以下输出:

        说明Excel成功被解析,并将数据持久化到了数据库之中。为了验证是否在数据库中是否也保存了这些数据,可以使用以下SQL语句进行查询:


select * from biz_poi_category where parent_id = 102;

        在客户端软件中执行以上SQL后可以看到以下结果:

三、总结

        以上就是本文的主要内容,支持对于高德地图和百度地图的POI分类的Excel入库及检索就基本完成,后续我们将深入使用两者的POI信息以及如何进行相应数据的采集。那么本文即来重点讲讲百度POI分类与高德POI分类存在什么不一样的地方,同时深入讲解开百度 POI 分类如何进行数据导入,也为各类基于 POI 分类数据的地理信息系统开发、商业智能分析以及城市规划应用等,铺设一条从数据获取到存储利用的高效路径,助力行业在空间数据赋能下实现精准决策与创新发展。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

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

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

相关文章

学习经验分享【41】YOLOv13:基于超图增强自适应视觉感知的实时目标检测

YOLO算法更新速度很快&#xff0c;已经出到V13版本&#xff0c;后续大家有想发论文或者搞项目可更新自己的baseline了。 摘要&#xff1a;YOLO 系列模型凭借其卓越的精度和计算效率&#xff0c;在实时目标检测领域占据主导地位。然而&#xff0c;YOLOv11 及早期版本的卷积架构&…

Handling outliers in non-blind image deconvolution论文阅读

Handling outliers in non-blind image deconvolution 1. 研究目标与实际意义2. 创新方法:基于EM的异常值建模2.1 新模糊模型2.1.1 目标函数2.2 EM框架:迭代优化二元掩码2.2.1 E步:计算后验权重 E [ m x ] E[m_x] E[mx​]2.2.2 M步:加权正则化反卷积2.3 优化加速技术2.3.1…

Redis 功能扩展:Lua 脚本对 Redis 的扩展

Redis 是一个高性能的内存数据库&#xff0c;支持多种数据结构&#xff0c;如字符串、哈希、列表、集合和有序集合。为了增强其功能&#xff0c;Redis 引入了 Lua 脚本支持&#xff0c;使开发者可以编写自定义的脚本&#xff0c;确保操作的原子性并提高复杂操作的性能。本文将详…

七天学完十大机器学习经典算法-06.支持向量机(SVM):分类边界的艺术——深入浅出指南

接上一篇《七天学完十大机器学习经典算法-05.从投票到分类&#xff1a;K近邻(KNN)算法完全指南》 想象你要在操场上为两个班级划活动区域&#xff0c;如何画出一条最公平的分界线&#xff1f;这条线不仅要分开两班学生&#xff0c;还要让两个班都离分界线尽可能远——这就是支持…

python如何安装PyQt6-stubs依赖包

PyQt6-stubs 是为 PyQt6 提供类型提示&#xff08;Type Hints&#xff09;和 IDE 智能补全支持的第三方补丁包&#xff0c;特别适用于 PyCharm、VS Code 等现代 IDE。它对开发者在编码时帮助极大。 一、安装方法 需要提前安装好git&#xff0c;然后克隆PyQt6-stubs源码&#xf…

创宇智脑 MCP 赋能 AiPy,IP 风险调查效率实现 10 倍飞跃,威胁分析一键生成

还记得上个月那个焦头烂额的凌晨三点吗&#xff1f;监控大屏突然疯狂闪烁&#xff0c;500 多个 IP 地址同时出现异常访问&#xff0c;密密麻麻的数据流在屏幕上跳动&#xff0c;像极了一张让人窒息的大网。我和团队成员瞪着布满血丝的眼睛&#xff0c;手动排查每一个 IP&#x…

使用SRS+ffmpeg实现https推流flv

1修改SRS的live.conf配置如下&#xff1a; # Live streaming config for SRS. # see full.conf for detail config.listen 1935; max_connections 1000; srs_log_tank console; daemon off;http_api {enabled on;listen …

力扣网编程题:合并两个有序数组(双指针解法)

一. 简介 上一篇文章对"合并两个有序数组"题目&#xff0c;使用了暴力解法&#xff0c;算法时间复杂度比较高。文章如下&#xff1a; 力扣网编程题&#xff1a;合并两个有序数组&#xff08;直接解法&#xff09;-CSDN博客 本文满足进阶要求&#xff0c;算法时间复…

数据结构之 【树的简介】(树的(相关)概念、二叉树的概念、部分性质、满二叉树、完全二叉树)

目录 1.树的概念及结构 1.1树的概念 1.2树的相关概念 1.3树的表示 1.4树在实际中的应用 2.二叉树概念及结构 2.1二叉树的概念 2.2特殊的二叉树 2.3二叉树的性质 2.4应用题 1.树的概念及结构 1.1树的概念 树是一种非线性的数据结构&#xff0c;由 n&#xff08;n…

Redis-7.4.3-Windows-x64下载安装使用

Redis软件包下载地址链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 检查或者修改配置文件redis.conf&#xff1a; #如果允许外部其他主机访问本机redis&#xff0c;设置成&#xff1a;bind 0.0.0.0 bind 127.0.0.1 protected-mode yes #设置端口…

Educational Codeforces Round 180 (Rated for Div. 2)

AB 略 C 对于axayaz>max(2*az,an)&#xff0c;枚举y z 二分x D 首先&#xff0c;长度为1的边的已经有n-1条&#xff0c;那么构造的图中只能存在一条长度为2的好边。我们先构造出一个图只存在n-1条好边&#xff0c;我们发现对于一个点所有连接它的边要不均指向它要不均背…

CAD文件处理控件Aspose.CAD教程:在 Python 中将 DGN 文件转换为 PDF

概述 将DGN文件转换为PDF对许多行业至关重要&#xff0c;包括工程和建筑行业。能够轻松地以 PDF 格式共享设计&#xff0c;增强协作和可访问性。通过使用Aspose.CAD for Python via .NET的强大功能&#xff0c;开发人员可以高效地自动化此过程。这款 CAD 转换器 SDK 简化了转换…

宁德时代携手问界,以“厂中厂”模式加速扩产

6月30日&#xff0c;宁德时代在赛力斯超级工厂的两条CTP2.0高端电池包产线正式投产。这是宁德时代在重庆布局的首个基地&#xff0c;并首次采用“厂中厂”合作模式&#xff0c;为问界系列车型本地化生产供应动力电池系统。重庆市、四川省广安市有关负责人&#xff0c;赛力斯集团…

工作中常用的Git操作命令(一)

说明 时间过得真快&#xff0c;一转眼吗喽也是好歹工作几年了&#xff0c;把这些年平时用的git命令整理记录一下&#xff0c;分几个文章&#xff0c;囊括了常用的命令&#xff0c;工作日常很多时候都是使用svn&#xff0c;回到宿舍自己的项目才是git&#xff0c;就问你离不离谱…

2.2.5 Windows系统日志管理

文章目录 一、试题及考试说明二、操作步骤1. 在计算机策略中&#xff0c;启用安装程序的日志记录&#xff0c;并且配置日志大小最大10M&#xff0c;日志存储位置为D:\kaoshi_3\2.2.5\&#xff1b;2. 查询安全日志中登录失败的日志信息&#xff0c;并导出保存在D:\kaoshi_3\2.2.…

AiPy实战(7):一键生成天气组件,解放UI设计的双手

在传统 UI 开发流程中&#xff0c;界面设计与实现往往是一项高度依赖人工投入的系统性工作。从页面布局架构搭建、图标元素精确定位&#xff0c;到响应式设计适配&#xff0c;仅基础样式表&#xff08;CSS&#xff09;的编写就可能涉及数十行甚至上百行代码。​ 随着智能开发工…

解读32页大数据中心运营管理整体规划方案【附全文阅读】

该文档为大数据中心运营管理整体规划方案&#xff0c;聚焦于构建高效规范的运营管理体系。方案提出以 “敏前台、稳中台、强后台” 为框架&#xff0c;构建覆盖全角色、全过程、全周期、全要素的一体化 IT 运营管控体系&#xff0c;采用 “11N” 运营模式&#xff0c;明确业主、…

Pyhton-EXCEL与Mysql数据对比

该段代码主要实现从数据库和 Excel 文件中读取数据&#xff0c;并对两者进行字段匹配&#xff0c;最终找出 Excel 中未匹配到的数据库记录。功能如下&#xff1a; [sqlSelect()]&#xff1a;连接 MySQL 数据库并查询比价单及其商品信息。[BiJiaDaoChu()]&#xff1a;调用外部 …

InnoDB索引

1、索引的建立 / 数据的存储 一条条数据存储到页中后&#xff0c;各个数据页组成了一个双向链表&#xff0c;而每个数据页中的记录会按照主键值从小到大的顺序组成一个单向链表。此时&#xff0c;如果我想根据主键值查询一条记录&#xff0c;只能从第一个数据页开始一个页一个页…

[考研408数据结构]王道大题暑假自用复习记录(每日更新...)

DAY1 2025年6月29日 雨转晴&#x1f327;&#x1f324; 第二章 线性表 2.2线性表的顺序表示 1、从顺序表中删除具有最小值的元素&#xff08;假设唯一&#xff09;并由函数返回被删元素的值。空出的位置由最后一个元素填补&#xff0c;若顺序表为空&#xff0c;则显示出错信…