基于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
英文地址,請注明出處:http://en.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;則顯示出錯信…