目錄
前言
一、百度 VS 高德 POI分類
1、高德POI分類
2、百度POI分類
3、分類對比與區別
二、POI分類表設計
1、物理表結構
2、數據存儲
3、數據查詢
三、總結
前言
????????在當今數字化快速發展的時代,地理信息數據的重要性日益凸顯,而POI(Point of Interest,興趣點)數據作為地理空間數據的關鍵組成部分,廣泛應用于地圖導航、位置服務、商業選址、城市規劃等諸多領域。例如,在地圖導航軟件中,精準豐富的POI數據能夠為用戶呈現周邊各類設施的位置與信息,幫助其更好地規劃出行路線;對于商業機構而言,分析POI數據則可助力其洞察區域商業布局,為新店選址提供科學依據。目前,百度、高德等地圖服務提供商均積累了海量且細致的POI數據,這些數據涵蓋了餐飲、住宿、購物、旅游景點、交通設施等眾多生活服務類別,并且呈現出多層級的分類結構。以餐飲類為例,先分為中式、西式、日式等菜系大類,中式菜系下又有川菜、粵菜、魯菜等細分,每一細分菜系下還可能包含不同風格、檔次的餐廳子項。如此復雜且層次分明的分類體系,對數據的存儲與管理提出了嚴峻挑戰。
????????傳統的數據庫存儲方式在面對這種多層級、海量的POI數據時,逐漸顯現出諸多弊端。一方面,數據之間的層級關系難以直觀、高效地表達,導致在數據查詢時,尤其是跨層級查詢或鉆取時,操作繁瑣且性能不佳;另一方面,隨著數據量的不斷增長,數據庫的擴展性也受到限制,難以靈活應對業務的快速擴張需求。為了實現多源數據的POI分類的準確管理,同時可以保持各平臺的獨立性,要求我們可以實現對不同的數據源進行管理,因此要求設計一個多層次的POI分類表,以適應多源多層次的分類管理需求。
????????PostgreSQL作為一種功能強大、開源的數據庫管理系統,憑借其在存儲復雜數據結構、支持擴展性以及數據一致性和完整性保障等方面的卓越性能,成為了應對這類挑戰的理想選擇之一。其支持豐富的數據類型,例如可以利用數組類型、JSON類型等來存儲多層級數據結構的特征信息;而且具備強大的函數與索引功能,能夠針對特定的查詢需求進行優化,提升查詢效率。因此,對基于PostgreSQL存儲百度或高德等POI多層級分類的數據庫設計進行深入研究具有重要的現實意義。本研究旨在探索如何根據POI數據的多層級特點,合理規劃數據庫的表結構、字段設計,通過有效的數據關聯方式和索引策略,實現對海量POI數據的高效存儲、快速查詢以及便捷的維護與更新,為各類依賴POI數據的應用場景提供堅實可靠的數據支撐,推動地理信息數據在更廣泛領域的深度應用與創新發展,以更好地滿足人們在智能生活與智慧城市建設進程中對精準地理信息服務的不斷攀升的需求。
一、百度 VS 高德 POI分類
????????本節將重點介紹百度和高德兩個平臺的POI分類信息,不僅詳細說明兩者的官方數據入口。還對比了兩者的層級和各層級的分類信息,通過兩個平臺的分類分層的體系說明,也說明了兩者在細分領域的深入程度。不管是高德還是百度的檢索接口,POI的分類絕對是很重要的一個信息。同時也是區域信息查詢的一個重要條件。
1、高德POI分類
????????首先來看高德POI分類,可以在檢索接口中看到POI分類的第一個應用,如下圖所示:
pes | 查詢?POI?類型 | 可選值:分類代碼?或?漢字(若用漢字,請嚴格按照附件之中的漢字填寫) 規則:?多個關鍵字用“|”分割 分類代碼由六位數字組成,一共分為三個部分,前兩個數字代表大類;中間兩個數字代表中類;最后兩個數字代表小類。 若指定了某個大類,則所屬的中類、小類都會被顯示。 例如:010000為汽車服務(大類) ??????????010100為加油站(中類) ??????????010101為中國石化(小類) ??????????010900為汽車租賃(中類) ??????????010901為汽車租賃還車(小類) 當指定010000,則010100等中類、010101等小類會被包含,當指定010900,則010901等小類會被包含。 注意:返回結果可能會包含中小類POI,但不保證包含所有,如需更精確的信息,推薦輸入小類或縮小范圍查詢 下載?POI 分類編碼和城市編碼表 若不指定?city,返回的內容為城市列表以及此城市內有多少結果符合要求。? | 必填(keyword?或者?types?二選一必填) |
????????其實在這里就可以下載高德平臺的POI分類和城市信息表,點擊超鏈接將跳轉到具體的下載頁面中,如下圖所示:
?????????點擊下載按鈕就可以將高德的POI分類表格下載到本地。
2、百度POI分類
????????下面再來詳細介紹一下百度的POI分類,同樣是來看一下百度地圖的POI分類的入口,關于POI的介紹有兩個入口,第一個是比較粗略的二級分類,同樣在檢索接口中包含以下分類Tag的定義與使用。
tag | 檢索分類偏好,與query組合進行檢索,多個分類以","分隔 (POI分類),如果需要嚴格按分類檢索,請通過query參數設置 | 美食 | string(50) | 否 |
?????????點擊“POI分類”可以查看百度的POI分類信息,如下表所示:
一級行業分類 | 二級行業分類 |
---|---|
美食 | 中餐廳、外國餐廳、小吃快餐店、蛋糕甜品店、咖啡廳、茶座、酒吧、其他 |
酒店 | 星級酒店、快捷酒店、公寓式酒店、民宿、其他 |
購物 | 購物中心、百貨商場、超市、便利店、家居建材、家電數碼、商鋪、市場、其他 |
生活服務 | 通訊營業廳、郵局、物流公司、售票處、洗衣店、圖文快印店、照相館、房產中介機構、公用事業、維修點、家政服務、殯葬服務、彩票銷售點、寵物服務、報刊亭、公共廁所、步騎行專用道驛站、其他 |
麗人 | 美容、美發、美甲、美體、其他 |
旅游景點 | 公園、動物園、植物園、游樂園、博物館、水族館、海濱浴場、文物古跡、教堂、風景區、景點、寺廟、其他 |
休閑娛樂 | 度假村、農家院、電影院、ktv、劇院、歌舞廳、網吧、游戲場所、洗浴按摩、休閑廣場、其他 |
運動健身 | 體育場館、極限運動場所、健身中心、其他 |
教育培訓 | 高等院校、中學、小學、幼兒園、成人教育、親子教育、特殊教育學校、留學中介機構、科研機構、培訓機構、圖書館、科技館、其他 |
文化傳媒 | 新聞出版、廣播電視、藝術團體、美術館、展覽館、文化宮、其他 |
醫療 | 綜合醫院、專科醫院、診所、藥店、體檢機構、療養院、急救中心、疾控中心、醫療器械、醫療保健、核酸檢測點、新冠疫苗接種點、風險點、方艙醫院、發熱門診、其他 |
汽車服務 | 汽車銷售、汽車維修、汽車美容、汽車配件、汽車租賃、汽車檢測場、其他 |
交通設施 | 飛機場、火車站、地鐵站、地鐵線路、長途汽車站、公交車站、港口、停車場、停車區、停車位、加油加氣站、服務區、收費站、橋、充電站、路側停車位、普通停車位、接送點、電動自行車充電站、高速公路停車區、其他 |
金融 | 銀行、ATM、信用社、投資理財、典當行、其他 |
房地產 | 寫字樓、住宅區、宿舍、內部樓棟、其他 |
公司企業 | 公司、園區、農林園藝、廠礦、其他 |
政府機構 | 中央機構、各級政府、行政單位、公檢法機構、涉外機構、黨派團體、福利機構、政治教育機構、社會團體、民主黨派、居民委員會、其他 |
出入口 | 高速公路出口、高速公路入口、機場出口、機場入口、車站出口、車站入口、門(備注:建筑物和建筑物群的門)、停車場出入口、自行車高速出口、自行車高速入口、自行車高速出入口、停車場出口、停車場入口、其他 |
自然地物 | 島嶼、山峰、水系、其他 |
行政地標 | 省、省級城市、地級市、區縣、商圈、鄉鎮、村莊、其他 |
門址 | 門址點、其他 |
道路 | 高速公路、國道、省道、縣道、鄉道、城市快速路、城市主干道、城市次干道、城市支路、車渡線、路口、其他 |
鐵路 | 鐵路、地鐵/輕軌、磁懸浮列車、有軌電車、城際快軌、其他 |
行政界線 | 其他國家國界、已定國界、未定國界、港澳界線、南海范圍線、已定省界、未定省界、海岸線、其他 |
其他線要素 | 橋梁、隧道、行政假想線、水域假想線、綠地假想線、島嶼假想線、疫情管控區、其他 |
行政區劃 | 世界級、國家級、省級、市級、區縣級、熱點區域、建成區、智能區域、其他 |
水系 | 雙線河、湖沼、海洋、其他 |
綠地 | 綠地公園、高爾夫球場、島、綠化帶、機場、機場道路、其他 |
標注 | 大洲標注、大洋標注、海域標注、水系標注、島嶼標注、非水系標注、其他 |
公交線路 | 普通日行公交車、地鐵\輕軌、有軌電車、機場巴士(前往機場)、機場巴士(從機場返回)、機場巴士(機場之間)、旅游線路車、夜班車、輪渡、快車、慢車、機場快軌(前往機場)、機場快軌(從機場返回)、機場軌道交通環路、其他 |
電子眼 | 限速電子眼、應急車道電子眼、公交車道電子眼、外地車輛電子眼、違章電子眼、其他 |
????????當然,以上表格是一個最多到二級的分類信息。如果需要百度的更詳細的POI分類表格,需要在接口文檔的響應參數中進行查看,如下圖:
????????點擊紅框中的超鏈接即可下載百度的POI分類。?
3、分類對比與區別
????????我們將百度和高德兩個平臺的POI類別都下載都本地后,可以打開Excel文件具體的對比一下兩者的聯系和區別。首先來看下高德的POI分類表格,如下圖所示:
????????可以看到,高德的POI分類是三級分類,最多也就是三級。 接下來再看一下百度的分類:
????????可以很明顯的看到,百度的POI分類層級居然到了五級,比高德的三級更多也更細。這也側面應征了前面的話,百度的POI分類比高德更加細致。除了兩個在層級有區別以外,我們也可以對比兩者的一級分類的對應關系,百度地圖POI分類中,旅游景點是一級分類;而高德地圖的一級分類是風景名勝;當然這種分法本身沒有什么問題,分類而已。同時,兩者在層次設計上,高德一般三級分類都是全部設置好的,而百度地圖的POI分類,有的只有二級,不會到更細致的層級,這也是兩者的一個大差別。如果還有其它未說明的區別或者聯系,歡迎大家在評論區留言指出。
二、POI分類表設計
????????不管是百度地圖還是高德地圖,兩者其實都包含了一個層級的概念,而一般層級在樹形結構中用的非常多。相信大家對二叉樹等比較熟悉,這里其實也是一個差不多的意思。因此我們在進行表結構的設計時就考慮到了這種父子關系的樹形結構設計。那么本文將給出一種具體的面向高德或者百度的POI分類存儲表,能夠實現兩個不同平臺的數據存儲與檢索,最后給一個查詢的實例用于說明如何進行數據查詢。
1、物理表結構
????????既然是面向多層級的動態樹結構,這里我們就一定會采用樹形表結構設計。這里我們直接給出存儲POI類型表的物理表結構,當然這里我們給出了數據表結構的SQL語句,如有不足或者有問題的地方,歡迎大家評論區交流,物理表模型如下:
????????對應的物理表SQL如下:
CREATE TABLE "public"."biz_poi_category" ("pk_id" int8 NOT NULL,"category_name" varchar(100) NOT NULL DEFAULT ''::character varying,"origin_code" varchar(100) NOT NULL DEFAULT ''::character varying,"parent_id" int8 NOT NULL DEFAULT 0,"ancestors" varchar(2000) NOT NULL DEFAULT ''::character varying,"category_english_name" varchar(100) NOT NULL DEFAULT ''::character varying,"platform" varchar(10) NOT NULL DEFAULT ''::character varying,"order_num" int4 NOT NULL DEFAULT 0,"status" int2 NOT NULL DEFAULT 0,"del_flag" int2 NOT NULL DEFAULT 0,"create_by" varchar(64) NOT NULL DEFAULT ''::character varying,"create_time" timestamp(6),"update_by" varchar(64) NOT NULL DEFAULT ''::character varying,"update_time" timestamp(6),CONSTRAINT "pk_biz_poi_category" PRIMARY KEY ("pk_id")
);
CREATE INDEX "idx_biz_poi_category_name" ON "public"."biz_poi_category" USING btree ("category_name" COLLATE "pg_catalog"."default" "pg_catalog"."text_ops" ASC NULLS LAST
);
COMMENT ON COLUMN "public"."biz_poi_category"."pk_id" IS 'pk_id';
COMMENT ON COLUMN "public"."biz_poi_category"."category_name" IS '分類名稱';
COMMENT ON COLUMN "public"."biz_poi_category"."origin_code" IS '原始分類code';
COMMENT ON COLUMN "public"."biz_poi_category"."parent_id" IS '父分類id';
COMMENT ON COLUMN "public"."biz_poi_category"."ancestors" IS '祖級列表';
COMMENT ON COLUMN "public"."biz_poi_category"."category_english_name" IS '分類名稱-英文';
COMMENT ON COLUMN "public"."biz_poi_category"."platform" IS '所屬平臺';
COMMENT ON COLUMN "public"."biz_poi_category"."order_num" IS '排序號';
COMMENT ON COLUMN "public"."biz_poi_category"."status" IS '狀態';
COMMENT ON COLUMN "public"."biz_poi_category"."del_flag" IS '柵格標記';
COMMENT ON COLUMN "public"."biz_poi_category"."create_by" IS '創建者';
COMMENT ON COLUMN "public"."biz_poi_category"."create_time" IS '創建時間';
COMMENT ON COLUMN "public"."biz_poi_category"."update_by" IS '更新人';
COMMENT ON COLUMN "public"."biz_poi_category"."update_time" IS '更新時間';
COMMENT ON TABLE "public"."biz_poi_category" IS 'POI分類信息表,完全兼容百度、高德等平臺,還可以擴展至其它平臺';
2、數據存儲
????????數據的存儲結構比較簡單,主要就是基于parent_id進行父子關聯使用。這里我們使用web界面對POI分類表進行管理,手動添加示例數據。我們在添加一些演示后演示的數據如下:
3、數據查詢
????????這里我們簡單的講解一下如何在PostgreSQL中進行POI分類表的的數據檢索查詢。這里我們講一種是查詢高德節點和下級子節點。sql如下:
with RECURSIVE r as
( select t1.* from biz_poi_category t1 where t1.pk_id = 101
union all
select t2.* from biz_poi_category t2 inner join r on r.pk_id = t2.parent_id)
select * from r order by pk_id;
????????查詢結果如下:
三、總結
????????以上就是本文的主要內容,本研究旨在探索如何根據POI數據的多層級特點,合理規劃數據庫的表結構、字段設計,通過有效的數據關聯方式和索引策略,實現對海量POI數據的高效存儲、快速查詢以及便捷的維護與更新,為各類依賴POI數據的應用場景提供堅實可靠的數據支撐,推動地理信息數據在更廣泛領域的深度應用與創新發展,以更好地滿足人們在智能生活與智慧城市建設進程中對精準地理信息服務的不斷攀升的需求。文章詳細得介紹了百度和高德兩個地圖平臺的POI分類信息,最后基于這個POI分類設計了存儲相關數據的物理表用來存儲相關數據。行文倉促,定有不足之處,歡迎各位朋友在評論區批評指正,不勝感激。