目錄
前言
一、高德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 |
2 | NEW_TYPE | POI分類編碼,如:010000 |
3 | 大類 | POI大類,如:汽車服務 |
4 | 中類 | POI中類,如:加油站 |
5 | 小類 | POI小類,如:中國石化 |
6 | Big Category | POI大類英文,如:Auto Service |
7 | Mid ?Category | POI中類英文,如:Filling Station |
8 | Sub Category | POI小類英文,如: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 分類數據的地理信息系統開發、商業智能分析以及城市規劃應用等,鋪設一條從數據獲取到存儲利用的高效路徑,助力行業在空間數據賦能下實現精準決策與創新發展。行文倉促,難免有許多不足之處,如有不足,在此懇請各位專家博主在評論區不吝留言指出,不勝感激。