目录

前言

一、高德POI分类简介

1、数据表格

2、分类结构

二、从Excel导入到Postgresql

1、Excel解析流程

2、Mybatis批量导入

3、数据入库

三、总结


前言

        在大数据与地理信息深度交融的当下,地理信息系统(GIS)的触角已延伸至各个领域,为行业决策提供精准的空间数据支撑。而 POI(Point of Interest,兴趣点)分类数据,作为 GIS 数据的细分瑰宝,正发挥着独特且关键的作用。高德地图所涵盖的丰富 POI 分类数据,如美食、电影院、酒店、购物场所等,宛如一座有待深度挖掘的宝藏,对商业选址、城市规划、旅游服务等行业有着不可估量的价值。

        以商业领域为例,掌握准确的美食分类 POI 数据,能助力餐饮企业洞察竞争对手分布、分析区域市场潜力,为新店选址提供科学依据;而电影院分类数据则可辅助院线优化布局,甚至为周边配套商业设施的规划提供参考。但目前,要将这些高德 POI 分类数据高效整合到分析系统中并非易事。一方面,高德提供的 POI 分类数据获取往往存在一定限制和规则,开发者需要巧妙设计数据采集策略;另一方面,采集后的数据多存储于 Excel 表格中,格式多样且字段特性各异,要将其批量、快速且准确地导入到数据库,实现与信息系统无缝对接,是一道亟待攻克的技术难关。

        PostgreSQL 凭借其卓越的开源特性和对地理空间数据的强大支持能力,成为众多开发者存储和管理 POI 分类数据的首选数据库。而 ApachePOI 则是 Java 开发领域处理 Excel 文件的得力工具。本实战将聚焦于如何运用 ApachePOI,将高德 POI 分类数据(美食、电影院等类别)从 Excel 快速导入到 PostgreSQL 数据库的全过程。

        在此过程中,我们将深入剖析 Excel 中 POI 分类数据的存储结构特点,针对美食、电影院等不同分类数据字段特性,制定对应的映射规则与转换策略,还将着重探索如何优化导入流程,提升数据导入效率,减少系统资源消耗。通过本次实战,不仅能为开发者揭开高德 POI 分类数据导入的神秘面纱,也为各类基于 POI 分类数据的地理信息系统开发、商业智能分析以及城市规划应用等,铺设一条从数据获取到存储利用的高效路径,助力行业在空间数据赋能下实现精准决策与创新发展。

一、高德POI分类简介

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

1、数据表格

        大家可以从高德的地图开放平台中获取其最新的POI分类的Excel表格,这里我将从官网下载的类型截取一部分给大家参考,数据表格一共有32页太多,这里不进行赘述,需要原始Excel表格的,可以去网站上下载。

        在Excel表格中,一共提供了8个关键信息,分别是:

序号字段名说明
1序号数据的序号,如:1
2NEW_TYPEPOI分类编码,如:010000
3大类POI大类,如:汽车服务
4中类POI中类,如:加油站
5小类POI小类,如:中国石化
6Big CategoryPOI大类英文,如:Auto Service
7Mid  CategoryPOI中类英文,如:Filling Station
8Sub CategoryPOI小类英文,如:Sinopec

         从上面的数据表格和字段信息介绍可以知道,高德地图的POI分类按照类别分成大、中、小分成了三类,同时有对应的英文类别说明。同样的,基于高德地图的POI检索可以从返回接口中看到其对应的POI分类值为:

{"address": "茶子山路与银杉路交叉口东北60米","business": {"opentime_today": "17:00-01:00",cost": "61.00","keytag": "大排档","rating": "4.5","business_area": "湘江新区","tel": "15873178255","tag": "大排档","rectag": "大排档","opentime_week": "周一至周日 17:00-01:00"},"pcode": "430000","adcode": "430104","pname": "湖南省","cityname": "长沙市","type": "餐饮服务;中餐厅;中餐厅","typecode": "050100","adname": "岳麓区","citycode": "0731","navi": {"navi_poiid": "H49F046040_387534","gridcode": "4212278620"},"name": "二五八大排档(茶子山路店)","indoor": {"indoor_map": "0"},"location": "112.952067,28.241331","id": "B0FFIK20N1"
}

        其中type和typecode分别对应poi分类的类别和poi编码,需要注意的是,调用高德地图返回的POI中,POI分类都是返回到了小类。 

2、分类结构

        在了解了高德地图的POI分类之后,下面我们基于之前设计的数据库物理表和分类信息构建树形的信息,为了方便在后面的查询中可以根据POI的大类、中类、小类来进行查询。就不能直接存储小类,而需要对其分类采取细致的分类管理。在进行树形层次构建时,我们根据编码来进行统一管理:

        这个结构是其编码分类的基础,也是后面的数据程序解析的基础。我们将使用编码来进行三级分类的解析及入库。 在Excel中,很大的大类和种类都是重复的,因此需要在入库时将类别进行去重分类,最终构建一棵完整的POI分类树。

二、从Excel导入到Postgresql

        本节将详细介绍在Java中使用ApachePOI实现从Excel中解析到存储至PostgreSQL中,主要包含两个方面,第一个是如何结合POI分类的规则进行分类解析。第二个方面是如何基于Mybatis实现程序的批量入库。完整的数据处理流程如下:

1、Excel解析流程

        在进行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 AmapPoiCategoryExcelVO implements Serializable{private static final long serialVersionUID = 2795552725033725828L;@Excel(name = "NEW_TYPE")private String poiType;//高德的POI类@Excel(name = "大类")private String bigCategory;//中文大类@Excel(name = "中类")private String midCategory;//中文中类@Excel(name = "小类")private String subCategory;//中文小类@Excel(name = "Big Category")private String bigCategoryEn;//英文大类@Excel(name = "Mid  Category")private String midCategoryEn;//英文中类@Excel(name = "Sub Category")private String subCategoryEn;//英文小类
}

         接下来读取Excel的数据,按照分类对高德POI分类进行层级重建,核心代码如下:

File file = new File(AMAP_POI_FILE);
FileInputStream fis = new FileInputStream(file);
ExcelUtil<AmapPoiCategoryExcelVO> util = new ExcelUtil<AmapPoiCategoryExcelVO>(AmapPoiCategoryExcelVO.class);
List<AmapPoiCategoryExcelVO> dataList = util.importExcel(fis);
LinkedHashMap<String,PoiCategory> amapPoiTypeMap = new LinkedHashMap<String, PoiCategory>();
for(AmapPoiCategoryExcelVO poiCategory : dataList) {String type = poiCategory.getPoiType();String bigCategory = poiCategory.getBigCategory();String midCategory = poiCategory.getMidCategory();String subCategory = poiCategory.getSubCategory(); String bigCategoryEn = poiCategory.getBigCategoryEn();String midCategoryEn = poiCategory.getBigCategoryEn();String subCategoryEn = poiCategory.getSubCategoryEn();String bigCategorySno = type.substring(0, 2);String midCategorySno = type.substring(0, 4);//不包含大类,添加到集合中if(!amapPoiTypeMap.containsKey(bigCategorySno)) {PoiCategory category = new PoiCategory(IdWorker.getId(),101L,"0,100,101",bigCategory,bigCategoryEn,bigCategorySno);amapPoiTypeMap.put(bigCategorySno, category);}//不包含中类,添加到集合中if(!amapPoiTypeMap.containsKey(midCategorySno)) {String parentKey = midCategorySno.substring(0, 2);PoiCategory parentCategory = amapPoiTypeMap.get(parentKey);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,midCategory,midCategoryEn,midCategorySno);amapPoiTypeMap.put(midCategorySno, category);}//不包含小类,添加到集合中if(!amapPoiTypeMap.containsKey(type)) {String parentKey = midCategorySno.substring(0, 4);PoiCategory parentCategory = amapPoiTypeMap.get(parentKey);String ancestors = parentCategory.getAncestors() + "," + parentCategory.getPkId();PoiCategory category = new PoiCategory(IdWorker.getId(),parentCategory.getPkId(),ancestors,subCategory,subCategoryEn,type);amapPoiTypeMap.put(type, category);}
}

2、Mybatis批量导入

        基于Mybatis的批量导入,这里介绍基于Xml的批量操作,需要在创建的Mapper.xml文件中定义以下内容:

<insert id="batchInsertPoiCategory" parameterType="java.util.List">insert into biz_poi_category ( pk_id,parent_id,category_name,ancestors,order_num,origin_code,category_english_name,platform,status,del_flag,create_time) values <foreach collection="list" item="item" separator=",">( #{item.pkId},#{item.parentId},#{item.categoryName},#{item.ancestors},
#{item.orderNum},#{item.originCode},#{item.categoryEnglishName},#{item.platform},#{item.status},#{item.delFlag},now())</foreach>
</insert>

        在Mapper及业务逻辑层的批量保存方法比较简单,这里提供业务层的一个简单调用示例:

/**
* - 批量插入POI目录信息
* @param list
*/
@Override
public void batchInsertPoiCategory(List<PoiCategory> list) {this.poiCategoryMapper.batchInsertPoiCategory(list);
}

3、数据入库

        在数据入库之前,需要统一设置数据来源,如标记高德,设置删除标记、数据业务状态、数据创建时间等,这些都是非常重要的,设置公共数据后就可以调用之前提供的批量入库的方法进行插入数据库操作,关键方法如下所示:

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

        完成以上的操作后就完成了高德POI分类数据的Postgresql数据库导入操作,导入完成后就可以在数据库中查看,如下图所示:

        支持,完全实现基于ApachePoi的高德POI分类数据导入处理操作。 

三、总结

        以上就是本文的主要内容,在本文中我们将深入剖析 Excel 中 POI 分类数据的存储结构特点,针对美食、电影院等不同分类数据字段特性,制定对应的映射规则与转换策略,还将着重探索如何优化导入流程,提升数据导入效率,减少系统资源消耗。通过本次实战,不仅能为开发者揭开高德 POI 分类数据导入的神秘面纱,也为各类基于 POI 分类数据的地理信息系统开发、商业智能分析以及城市规划应用等,铺设一条从数据获取到存储利用的高效路径,助力行业在空间数据赋能下实现精准决策与创新发展。行文仓促,难免有许多不足之处,如有不足,在此恳请各位专家博主在评论区不吝留言指出,不胜感激。

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

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

相关文章

如何打造Apache Top-Level开源时序数据库IoTDB

引言 数据与时间结合后&#xff0c;便拥有了生命。在金融、系统日志、工业产线和智能设备等领域&#xff0c;时序数据每毫秒都在不断产生。管理这些海量时序数据需要专业的数据库系统。时序数据库产品正逐渐受到市场的关注&#xff0c;本文将分享如何通过开源的方式&#xff0…

高并发内存池实战指南

项目源码&#xff1a;https://gitee.com/kkkred/thread-caching-malloc 目录 一、脱离new&#xff1a;高并发内存池如何替代传统动态分配 1.1 new的痛点&#xff1a;碎片、延迟与锁竞争 1.2 高并发内存池的替代方案&#xff1a;分层预分配无锁管理 二、大内存&#xff08;…

基于springboot+vue的数字科技风险报告管理系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat12开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 管理员登录 管理…

实战篇----利用 LangChain 和 BERT 用于命名实体识别-----完整代码

上一篇文章讲解了Langchain,实现一个简单的demo,结合利用 LangChain 和 BERT 用于命名实体识别。 一、命名实体识别模型训练(bert+CRF) bert作为我们的预训练模型(用于将输入文本转换为特征向量),CRF作为我们的条件随机场(将嵌入特征转为标签),既然要训练,那么我们的损失函…

现代 C++ 容器深度解析及实践

一、线性容器&#xff1a;std::array 与 std::forward_list 1. std::array&#xff1a;固定大小的高效容器 在传统 C 中&#xff0c;数组与 vector 的抉择常让人纠结&#xff1a;数组缺乏安全检查&#xff0c;vector 存在动态扩容开销。C11 引入的std::array完美平衡了两者优…

数据集|猪姿态检测PigBehaviorRecognitionDataset

数据集|猪姿态检测PigBehaviorRecognitionDataset 一、数据集介绍1.1 介绍1.2 用途1.3 数据集统计 二、样本类别介绍1. Lying&#xff08;躺卧&#xff09;2. Sleeping&#xff08;睡眠&#xff09;3. Investigating&#xff08;探索&#xff09;4. Eating&#xff08;进食&…

Vue-13-前端框架Vue之应用基础路由器的使用步骤

文章目录 1 路由和路由器2 基本切换效果2.1 App.vue(根组件)2.2 components(子组件)2.2.1 Home.vue(首页)2.2.2 News.vue(新闻)2.2.3 About.vue(关于)2.3 路由器2.3.1 router/index.ts2.3.2 main.ts2.4 效果展示2.5 程序流程3 笔记3.1 路由组件和一般组件3.1.1 Header.vue(一般…

GaussDB实例级自动备份策略:构建数据安全的“自动防护网”

GaussDB实例级自动备份策略&#xff1a;构建数据安全的“自动防护网” 在数字化转型的浪潮中&#xff0c;数据库作为企业核心数据的载体&#xff0c;其安全性与可恢复性直接关系到业务的连续性。对于分布式数据库GaussDB而言&#xff0c;实例级自动备份策略是保障数据安全的关…

推荐几本关于网络安全的书

对于网络安全从业者、相关专业学生以及对网络安全感兴趣的人士而言&#xff0c;掌握扎实的网络安全知识和技能至关重要。以下推荐的几本网络安全书籍&#xff0c;涵盖了网络安全领域的多个重要方面&#xff0c;是学习和研究网络安全的优质参考资料。 1、攻击网络协议&#xff…

工业4.0浪潮下PROFIBUS DP转ETHERNET/IP在轧钢厂的创新实践

在工业自动化4.0推动制造业向智能化升级的背景下&#xff0c;轧钢厂生产对设备互联与数据协同提出更高要求。PROFIBUS DP与ETHERNET/IP协议的特性差异&#xff0c;制约着西门子PLC与工业测距仪等设备的高效协作。通过协议转换技术实现两者互通&#xff0c;为轧钢生产线注入智能…

从0开始学习R语言--Day31--概率图模型

在探究变量之间的相关性时&#xff0c;由于并不是每次分析数据时所用的样本集都能囊括所有的情况&#xff0c;所以单纯从样本集去下判断会有武断的嫌疑&#xff1b;同样的&#xff0c;我们有时候也想要在数据样本不够全面时就能对结果有个大概的了解。 例如医生在给患者做诊断…

微信小程序进度条progress支持渐变色

微信小程序自带进度条progress支持渐变色代码 .wx-progress-inner-bar {border-radius: 8rpx !important;background: linear-gradient(90deg, #FFD26E 8%, #ED0700 100%) !important; }<view class"progress-box"><progress percent"80" back…

Linux内核网络协议栈深度解析:面向连接的INET套接字实现

深入剖析Linux内核中TCP连接管理的核心机制,揭示高效网络通信的实现奥秘。 一、源地址匹配:连接建立的第一道关卡 在TCP连接建立过程中,内核需要验证源地址是否匹配。inet_rcv_saddr_equal()函数是实现这一功能的核心,它巧妙地处理了IPv4/IPv6双栈环境: bool inet_rcv_s…

Vue 项目中 Excel 导入导出功能笔记

功能概述 该代码实现了 Vue 项目中 Excel 文件的三大核心功能&#xff1a; Excel 导入&#xff1a;上传文件并解析数据&#xff0c;刷新表格展示。模板下载&#xff1a;获取并下载标准 Excel 模板文件。数据导出&#xff1a;将表格数据按多级表头结构导出为 Excel 文件。 一…

71. 简化路径 —day94

前言&#xff1a; 作者&#xff1a;神的孩子在歌唱 一个算法小菜鸡 大家好&#xff0c;我叫智 71. 简化路径 给你一个字符串 path &#xff0c;表示指向某一文件或目录的 Unix 风格 绝对路径 &#xff08;以 / 开头&#xff09;&#xff0c;请你将其转化为 更加简洁的规范路径…

Linux系统编程 | 互斥锁

1、什么是互斥锁 如果信号量的值最多为 1&#xff0c;那实际上相当于一个共享资源在任意时刻最多只能有一个线程在访问&#xff0c;这样的逻辑被称为“互斥”。这时&#xff0c;有一种更加方便和语义更加准确的工具来满足这种逻辑&#xff0c;他就是互斥锁。 “锁”是一种非常形…

数据文件写入技术详解:从CSV到Excel的ETL流程优化

文章大纲&#xff1a; 引言&#xff1a;数据文件写入在ETL流程中的重要性 在现代数据处理中&#xff0c;ETL&#xff08;提取、转换、加载&#xff09;流程是数据分析和业务决策的核心环节&#xff0c;而数据文件写入作为ETL的最后一步&#xff0c;扮演着至关重要的角色。它不…

在Cline中使用Gemini CLI,图形化界面操作:从命令行到可视化操作的全新体验,爽炸天!

在软件开发的进程中&#xff0c;命令行工具虽功能强大&#xff0c;但对部分开发者而言&#xff0c;图形化界面的直观与便捷性有着独特魅力。此前&#xff0c;Cline 新版本集成 Gemini CLI 的消息在开发者社群引发热议&#xff0c;尤其对于偏好图形界面的开发者来说&#xff0c;…

正交视图三维重建 笔记 2d线到3d线

这种代码怎么写好&#xff0c;x1tx1 x2tx2 x1x2在一条线上tx2和tx1在一条线上输出x1 y1 ty1&#xff0c;x2 y2 ty2 线过的点 的集合 俯视图找深度 测试一下 目标 四条线变一条线 复杂度贼大跑起来贼慢 加了16000条 去重 for (const [x1, y1, x2, y2, lineId, type] of front…

【耳机】IEM 前腔 后腔 泄压孔 -> 调音纸对频响曲线的影响

一、后腔 1.曲线说明 绿色&#xff1a;无调音纸 红色&#xff1a;使用Y3 粉色&#xff1a;使用Y6 2.结论 后腔是负责微调的&#xff0c;阻尼大小和低频升降成 反比。 阻 大 -> 低频 降低 阻 小 -> 低频 升高 二、前腔 1.曲线说明 红色&#xff1a;无调音纸 黄色&am…