彭成

摘要:为充分利用空间数据对象的位置信息,提升存储结构化程度及查询效率,基于多层索引及缓存建立空间数据管理系统。首先基于不同粒度建立用于渲染和查询的两层索引框架,同时为索引及空间数据建立内存缓冲队列。在查询过程中通过区域范围及索引多级筛选空间数据对象,在空间数据变更时增量修改索引及数据记录,在渲染时通过内存缓冲队列及渲染区域对应索引读取数据。结合实例,验证了索引及内存缓冲的效果,为高效空间数据存储及查询提供了技术支持。

关键词:数据库;空间数据;多层索引;内存缓冲队列;地理信息系统

中图分类号: TP311   文献标识码:A

文章编号:1009-3044(2023)36-0059-03

开放科学(资源服务)标识码(OSID)

0 引言

地理信息系统的发展与应用,导致空间数据不断增长,海量空间数据的存储和查询模式变得十分重要,也是地理信息系统发展的瓶颈所在[1-2]。如何设计高效的空间数据存储和查询模式,提高数据导入、加载、渲染、查询的速度,成为地理信息系统中首要解决的问题[3]。

空间数据的存储结构的发展经历了五个时代:文件系统存储、混合数据存储、关系数据库存储、面向对象数据库存储、对象关系型存储[4-5]。目前,在成熟的二维地理信息系统商业软件方面,主要采用对象关系型,其拥有完善成熟的数据管理功能。现存在两种方法,一是数据库企业在其各自的数据库产品中增加了支持空间数据类型的专用软件(如Oracle的Spatial Cartridge)[6],二是地理信息系统软件企业在传统的关系数据库管理系统之上进行功能和数据类型的扩张,外加一个空间数据管理引擎,如ESRI的ArcSDE,MapInfo与Oracle公司共同开发的Oracle Spatial等[7]。而在这一时期成熟的系统有加州大学Berkeley分校研制的PostGIS[8]。

对于现有的空间数据存储及查询,对空间数据对象的位置信息利用得不够充分,存储的结构化程度不够高,查询的效率也有提升空间。现有的空间数据存储根据空间数据对象的位置建立索引,查询时根据指定的查询范围对应的区域进行查询,当查询范围与区域范围大小不在同级别时效率较低。对于经常需要使用到的空间数据对象,也应该进行缓存以提升效率。同时,在空间数据导入、加载等过程中,应该充分利用计算机的性能进行多线程、生产者-消费者等模式来提升速度。

因此,针对上述问题,需要一种功能更为完善,更好地利用空间数据对象位置信息,建立更加灵活索引的空间数据存储及查询方法。

1 创建多层索引框架及内存缓冲队列

1.1创建表及索引

如图1所示,首先选择要导入的空间数据文件,可以选择多种格式的文件,如shp、cgm、mapgis、双狐文本文件等,本文选择shp文件类型,文件为countries.shp,是多边形类型的数据。选择完文件后,系统会创建相应的空间数据对象表、索引表、属性表、参数配置表。属性表默认只有对象编号字段,若导入的文件配有相应的属性文件,则会根据属性文件中的属性信息增加相应的字段;空间数据对象表包含对象编号,类型,范围及具体数据;索引表包含格子编号,格子类型,对象编号,格子与对象的关系,对象的范围;参数配置表包含渲染索引框架x和y两个方向的切分数量,查询索引框架对渲染索引框架中一个格子在x和y方向进一步切分的数量,内存缓冲队列中空间数据对象的数量限制及索引的数量限制,所有空间数据对象的总范围。

建表之后系统会给空间数据对象表的对象编号字段,索引表的格子编号、对象编号字段建立索引,以加快数据库访问速度。

1.2 配置参数设置

配置参数基本属性包括导入的空间数据对象渲染时显示的图层名称,是否可见,以及备注信息,配置参数的SDE属性即加载过程中的属性包括是否存入数据库,渲染索引框架x和y两个方向的切分数量,查询索引框架对渲染索引框架中一个格子在x和y方向进一步切分的数量,内存缓冲队列中空间数据对象的数量限制及索引的数量限制,是否使用多线程,是否在每导入一个空间数据对象时将其插入缓冲队列,空间数据对象和属性数据的提交间隔。

如图2所示,本文例子设置渲染索引框架划分方式为10×10,查询索引框架在渲染索引框架格子基础上每个格子在x和y上进一步切分2块,内存缓冲队列中空间数据对象的数量限制为100,内存缓冲队列中索引数量的限制为1 000,每导入5 000个空间数据对象和属性时进行一次提交。

1.3 创建索引框架

索引框架共分为两层,分别用于渲染和查询。查询索引框架是在渲染索引框架的每个格子基础上,进一步对格子进行划分。通常情况下,渲染涉及的区域较大,对精度要求低,采用粗粒度划分,查询涉及的区域较小,对精度要求高,采用细粒度划分。本文例子渲染索引框架划分粒度为10×10,查询索引框架的划分粒度为20×20。

建立索引框架时,先计算空间数据对象总体范围外包矩形,将其按照x和y两个方向进行分块,切分为多个格子。本文例子可以从导入的文件中直接获取到其总体范围的外包矩形,x的最小值和最大值分别为-190.0,190.0,y的最小值和最大值分别为-99.9, 93.6。将这片区域分别划分为10×10份和20×20份,建立渲染索引框架和查询索引框架。

1.4 创建缓冲队列

内存缓冲队列包括索引及空间数据对象,通过将部分索引及空间数据对象存放在内存中,减少渲染和查询过程中的数据库访问操作。其中索引在内存缓冲中以格子为单位进行存储。当队列已满时将最早添加进队列的元素剔除。本文例子索引队列的大小限制为1 000,空间数据对象队列的大小限制为100。

2 空间数据的导入与索引生成

2.1 导入空间数据

在建立完索引框架和内存缓冲队列后,导入空间数据,具体的形状和位置信息通过坐标存储和表示。本文例子空间数据对象的文件类型为多多边形,通过顶点坐标得到空间数据对象的形状和范围,用来判断与给定的查询和渲染范围是否有相交的部分。

2.2 生成索引

对于每个导入的空间数据对象生成索引,根据空间数据对象的范围,得到此范围包含的渲染索引格子和查询索引格子,再根据空间数据对象的形状,判断是否与格子范围有交集,对有交集的生成索引。导入完毕后,每个格子对应若干条索引,每条索引表示与此格子有相交部分的空间数据对象。

2.3 存储索引及空间数据

在到达提交间隔时,将生成的索引作为记录存储到数据库的索引表中,存储的信息包含索引类型、格子编号、对象编号、对象所占范围、与索引格子的关系。这些索引用来快速获取所给区域中包含的空间数据对象,提升显示查询速度。空间数据对象及其对应的渲染索引和查询索引会添加到内存缓冲队列中。同时,将每个空间数据对象作为一条记录存储到数据库的空间数据对象表中,存储的信息包含对象编号、类型、范围以及具体形状数据。本文例子每导入5000个空间数据对象进行一次提交。

导入空间数据采用多线程来读取和提交空间数据对象和索引,并采用生产者-消费者模式,生成渲染索引和查询索引作为生产者,提交作为消费者同时进行。

对于存在关联属性文件的情况,如本文例子,存在countries.dbf文件,其存储了每个空间数据对象的相关属性,如人口密度、名称,会读取这个属性文件并将信息添加到属性表中。

3 空间数据的渲染与查询

3.1空间数据渲染

根据给定的渲染范围,得到对应的渲染格子,然后逐一渲染这些格子所含的空间数据对象。对于一个渲染格子,如果对应的渲染索引记录存在于内存缓冲队列中,则直接获取索引对应的空间数据对象编号,否则从数据库索引表中获取编号,然后根据编号获取空间数据对象并渲染。对于存在于内存缓冲队列中的空间数据对象,直接进行渲染,否则从空间数据对象表获取数据然后渲染。本文例子效果如图3所示,是由多个多边形组成的世界地图形状。

3.2 空间数据查询

空间数据查询的分为初始过滤、中间过滤以及最终过滤。初始过滤是根据查询所指定的区域,得到其对应哪些查询格子,将这些格子作为初步结果;中间过滤是在初步结果基础上,进一步进行过滤,先计算出查询所指定区域对应的内切矩形,得到初步结果中存在于内切矩形中的格子,并获取这些格子所对应的空间数据对象,将其添加到最终查询结果中,对于初步结果中其他格子,在下一阶段进行判断;最终过滤是对上一阶段剩余的查询格子,获取他们所含的空间数据对象,并逐一与查询指定区域进行比较判断,把与查询区域有相交部分的空间数据对象添加到最终结果中。本文例子给出查询请求结果如图4所示,结果集中的空间数据对象以不同颜色显示;在对话框中选中结果集中的某个空间数据对象显示对应属性信息,并以不同颜色显示,图中选中的空间数据对象的名称为“Niger”,人口密度值为7.0。

4 空间数据的变更与加载

新增空间数据对象时,根据范围计算对应渲染和查询格子,生成索引添加到内存缓冲队列,添加到新增集合;修改时,根据对象编号得到对应渲染和索引格子,将其删除,然后根据修改后的空间数据对象范围计算对应渲染和索引格子,生成索引添加到内存缓冲队列,并添加到修改集合;删除时,根据对象编号得到对应的渲染和索引格子,将其删除,并添加到删除集合。

提交变更时,对新增集合,将对应的渲染、查询索引和对象数据提交到数据库;对修改集合,在索引表中删除对象编号相同记录,并将对应的新渲染、查询索引提交到数据库,在空间数据对象表中更新对象编号相同记录;对删除集合,在索引表和空间数据对象表中删除对象编号相同记录。

空间数据加载时,根据配置参数建立渲染和查询索引框架,然后读取渲染格子索引,从空间数据对象表读取空间数据对象加载到内存缓冲队列。

5 结论

本文设计实现了高效的基于多层索引及缓存的空间数据管理系统,建立了多层索引,针对不同的渲染和查询要求,都有较高的处理效率;建立了内存缓冲策略,对经常使用的空间数据对象直接从内存中给出,提升了效率;使用多线程及生产者-消费者模式进行空间数据对象的导入和加载,提升了数据存取的速度。

参考文献:

[1] 王峰,安晓亚,朱璇.地理空间数据增量更新版本化管理方法研究[J].地理空间信息,2021,19(2):26-29,6.

[2] 宋轩,高云君,李勇,等.空间数据智能:概念、技术与挑战[J].计算机研究与发展,2022,59(2):255-263.

[3] 郭名静,景琳.空间数据挖掘驱动城市疫情监测常态化的作用研究[J].商业经济,2022(2):11-13,16.

[4] 苏瑶.基于GIS+BIM的空间数据可视化研究[J].自动化与仪器仪表,2021(12):28-31,35.

[5] 周群.基于GIS的综合交通空间数据管理系统研究[J].地理空间信息,2021,19(11):75-78,8.

[6] 陈新.论空间数据挖掘和知识发现的理论与方法[J].电脑知识与技术,2021,17(33):20-21,31.

[7] 崔梦真,贺晗,王虎,等.便携式采集装置及铁路基础设施三维空间数据管理系统设计[J].铁路计算机应用,2021,30(10):24-29.

[8] 石伟伟,刘皓宇,程丽丽,等.超大规模空间数据管理及计算框架关键技术研究[J].国土资源信息化,2021(5):15-21.

【通联编辑:梁书】