基于ApachePOI實現高德POI分類快速導入PostgreSQL數據庫實戰

目錄

前言

一、高德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…