基于PostgreSQL的百度或高德等POI多层级分类的数据库设计_高德地图poi
目录
前言
一、百度 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的定义与使用。
检索分类偏好,与query组合进行检索,多个分类以\",\"分隔 (POI分类),如果需要严格按分类检索,请通过query参数设置
点击“POI分类”可以查看百度的POI分类信息,如下表所示:
当然,以上表格是一个最多到二级的分类信息。如果需要百度的更详细的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分类设计了存储相关数据的物理表用来存储相关数据。行文仓促,定有不足之处,欢迎各位朋友在评论区批评指正,不胜感激。