APP下载

一种基于Redis的矢量数据快速加载方法

2022-10-09刘胜杰倪慧珠郭见兵徐舒畅

关键词:瓦片矢量切片

刘胜杰,倪慧珠,郭见兵,徐舒畅

(1. 杭州师范大学信息科学与技术学院,浙江 杭州 311121; 2. 浙江省测绘科学技术研究院,浙江 杭州 311100)

矢量瓦片具有数据体量小、传输和渲染速度快等特点,支持动态更改样式[1],在前端有较好的交互性和空间分析能力[2],为减少网络传输、缩短响应时间、提升用户体验提供了可能[3-4],因此矢量瓦片技术成为当今电子地图开发中优先考虑的技术.

对于矢量瓦片的生成、存储、加载和渲染,学者做了深入研究.翁世杰等[5]从矢量切片数据和浏览器渲染两方面基于GeoServer发布矢量切片服务,利用GeoWebCache对空间数据库中存储的矢量数据实时切片,并使用Mapbox GL加载矢量瓦片服务,简化了矢量切片地图的配图过程.但GeoWebCache产生的矢量切片会存储到硬盘中,数据量大时对计算机性能也有一定的要求.李飞等[6]针对实时路况数据提出了一种基于矢量切片的实时路况可视化方法,利用GeoServer内置切片工具和WebService将矢量数据通过浏览器屏幕范围实现自动化切片后,将瓦片存入文件数据库,并将空间数据、实时属性数据存入Oracle 11g数据库进行管理.如有矢量数据出现更新,则需要将更新后的矢量切片替换到文件数据库中,过程比较耗时,同时也增加了服务器的压力.王尊等[7]采用分布式存储方式逐级存储每个层级的矢量瓦片,运用缓存技术,并使用Cesium加载矢量瓦片实现海量矢量数据的有效存储和管理,提高了前端瓦片数据的响应速度.

上述学者们都基于矢量瓦片做了大量研究,对于矢量数据的实时切片与动态加载也有一定的成果,但大多研究使用的数据类型较少.如果数据量较大并且数据类型较多的情况下,这些方法实现矢量数据的切片无疑会给服务器端增加压力,并降低矢量数据在前端的加载、渲染效率.本文设计实现了一种矢量数据动态切片方案,将矢量数据存储到数据库中,通过前端向后端动态请求矢量瓦片来完成对数据库中矢量数据实时、动态切片成MVT格式矢量瓦片的操作,然后在界面中实时加载、渲染,并使用Redis设计矢量瓦片缓存方式,以提高矢量瓦片的请求、加载速度,并实现矢量数据在前端的可视化加载.

1 技术实现

1.1 矢量数据的动态、实时切片技术

本文使用Spring Boot框架,将矢量数据通过PostGIS导入到关系型数据库PostgreSQL中.数据库中一张表对应一个矢量图层,表中包含了矢量数据的空间位置信息和基本属性信息,如编号、名称等,对空间位置信息列添加GiST索引[8],用以加快获取指定范围内矢量数据的速度.根据矢量瓦片金字塔原理[9-10],前端向后端发送要加载的屏幕范围内矢量瓦片缩放层级、行号、列号的请求,后端接收到这些参数的请求之后,通过公式计算出当前瓦片所在的经纬度范围,将此范围使用多边形构造方法构造出一个多边形.使用MVT坐标空间转换方法将构造好的多边形转换成基于MVT坐标空间的多边形,并从PostgreSQL中检索、获取此范围的矢量数据.使用MVT格式矢量瓦片构造方法将检索结果转换成MVT格式的二进制矢量瓦片,将得到的MVT矢量瓦片即时返回给前端加载显示.矢量数据动态、实时切片的过程如图1所示.

图1 矢量数据动态、实时切片过程Fig.1 Dynamic, real-time slicing process of vector data

该方法体现了矢量数据切片的实时性和动态性,提高了前端加载、渲染的速度和效率,并且一次性把所有的图层全部都加载出来,通过前端实现对不同层级下图层显示的控制,减轻了后端服务器的压力.

1.2 基于Redis的矢量瓦片缓存设计

作为展示所用的矢量数据并不会频繁更新,因此把已经请求过的矢量瓦片放到缓存中,再请求该矢量瓦片时,从缓存中取出相对应的矢量瓦片信息即可.如果有矢量数据更新,不需要将缓存全部清空,而是清除掉更新范围内对应的各个层级的矢量瓦片缓存,简化了后端的操作步骤,提升了前后端交互的速率,实现了缓存中矢量瓦片的高效调度.

本文采用Redis缓存,以方便矢量数据的更新,设计Hash类型[11]为缓存策略,将矢量瓦片分组存储.矢量瓦片加载过程中,设置矢量瓦片初始加载的最小层级为第4层,最大层级为20层.矢量瓦片的存储结构如表1所示,其中,key相当于组号,用地图初始加载层级矢量瓦片的层级、行号、列号作为编号表示,field是该组4层级后矢量瓦片的编号,value是存储field中对应的二进制矢量瓦片信息,矢量瓦片存储的具体信息如表2所示.

表1 矢量瓦片的存储结构表Tab.1 Storage structure of vector tiles

表2 矢量瓦片存储具体信息表Tab.2 Storage specific information of vector tiles

1.3 基于MapBox的矢量瓦片加载

矢量瓦片是将矢量数据分割的矢量要素描述文件.在单个矢量瓦片上存储着投影于一个矩形区域内的几何信息和属性信息,常见的矢量切片形式有3种:GeoJSON、TopoJSON和MVT(MapBox Vector Tile)[12-13],其中,MapBox公司制定的瓦片数据标准格式MVT是目前较为通用的矢量瓦片数据组织文件格式[14],它基于Google protocol buffers[15],压缩率最高,体积最小.

本文采用MapBox GL作为前端加载、渲染矢量瓦片的框架.MapBox GL框架主动计算出屏幕应显示出的矢量瓦片的层级、行号和列号,然后将计算出的层级、行号和列号作为参数向后端发送请求,后端解析瓦片数据,将请求得到MVT格式的矢量瓦片返回给前端.MapBox GL则会将MVT矢量瓦片通过前端的样式配置、渲染,最终显示到屏幕中.矢量瓦片的加载过程如图2所示.

图2 矢量瓦片的加载过程Fig.2 Loading process of vector tiles

2 实验分析

实验使用OpenStreetMap浙江省范围内的水系、公路、铁路、建筑、土地利用等13种类型的矢量数据,存储到PostgreSQL数据库中,基于B/S架构用Spring Boot和MapBox设计开发系统对矢量数据进行操作和管理,并测试这些矢量数据在6—20级动态、实时切片并且渲染、加载到前端界面的时长和性能.本文使用的测试数据如表3所示,数据量达到44.9万.

表3 测试数据Tab.3 Test data

对上述测试数据进行矢量数据切片、缓存、加载操作.初次加载时需要访问数据库,并对对应的矢量数据进行切片操作,前端界面加载需等待一定的时间.第二次前端再请求该范围的矢量数据时,从缓存中获取对应范围内的矢量瓦片,若缓存中不存在,再从数据库中读取并切片.两次矢量瓦片加载时间的比较如图3所示,为使折线图有更明显的比较效果,图中每个矢量瓦片第一次的加载时间分别是实际时间的千分之一倍.从图3中可以看到,层级越低,矢量瓦片中所包含的数据量就越大,加载时间也越会长,编号为6-53-26的瓦片大小为8.7 Mb,第一次加载该瓦片的时间达到了2.4 min;随着层级的增加,矢量瓦片包含的信息越来越小,加载时间也越来越快,对于同一个范围的矢量数据,第二次请求要比第一次快很多.同时也可以看出,在低层级时,相同的矢量瓦片第一次和第二次的加载速度相差很大,随着层级越大,加载速度差距越来越小,最后加载时间基本在3 ms左右.

图3 矢量瓦片第一次和第二次切片加载时间Fig.3 First and second slice loading time of vector tile

王尊[7]在业务逻辑层对矢量数据进行逻辑切分,完成矢量瓦片数据的构建,并基于Memcached设计实现了服务端缓存机制,在线发布矢量瓦片数据,保证矢量瓦片数据的在线传输效率,然后使用Cesium框架加载矢量图层.对本文方法与王尊[7]方法进行7—13级矢量瓦片加载平均时间的比较,结果显示本文所用的方法加载时间较快,尤其是随着矢量瓦片层级的增加,两种方法的加载时间相差更加显著.两种方法各层级所需加载的平均时间的比较如图4所示.

图4 两种方法平均加载时间比较Fig.4 Comparison of the average load time of two methods

3 应用实例

本文设计实现的矢量数据动态、实时切片并缓存加载的方法,已应用到浙江省新型基础测绘资源库管理系统的地理空间数据展示模块,该系统目前存储了湖州市、嘉兴市、绍兴市、丽水市和杭州市等部分矢量数据,界面中加载了县级行政区划、街道、兴趣点、河流等55个线、面图层,大约有50万条数据.通过测试,系统之前使用GeoServer服务调用矢量瓦片的方式平均耗时为5 s左右,而使用本文所提出的方式对地理空间矢量数据的加载、渲染平均耗时为800 ms,效率得到了显著提升.如图5所示,界面一次性加载55个图层,MapBox GL框架对各个图层用不同的颜色表示,还原了标准矢量地图的配色,使得浙江省地理空间矢量数据的展示得到了美化,满足用户浙江省地理空间矢量数据展示的要求,增强了系统的可用性.

图5 浙江省测绘资源库管理系统地理空间数据展示(以杭州市为例)Fig.5 Geospatial data of the management system of fundamental surveying resource databases in Zhejiang (Hangzhou)

以嘉兴市秀洲区为例的地理空间矢量数据不同层级下显示的内容如图6和图7所示,矢量瓦片的层级越小,矢量瓦片中所包含的内容就越多,所需要加载的时间也越长,所显示的内容也越不清楚,所以随着缩放比例尺的减小,地理空间矢量数据的加载速度越来越慢.由于系统使用的缓存机制来存储矢量瓦片,系统只在初次加载地理空间矢量瓦片时会出现卡顿现象.

4 结束语

本文基于关系型数据库PostgreSQL、缓存数据库Redis,提出了一种矢量数据存储,动态、实时对矢量数据切片以及矢量瓦片缓存的方式,设计Redis缓存的结构用于提高缓存的获取速度,并在数据库中存储了44.9万条数据用来测试该方式的可行性.该方法省去了传统方式发布矢量瓦片服务或者预先切片的步骤,在实现实时、动态矢量数据的切片方面具有较大的优势,有助于更好地管理矢量数据.测试实验表明,实时生成的矢量切片存入缓存的方式,提高了矢量数据的加载速度,时间效率更高.这种矢量数据高效、实时、动态的切片方式以及前端加载速度提升的方法,也已经成功应用到浙江省新型基础测绘资源库管理系统中,后续将基于当前的研究,利用分布式存储,实现海量矢量瓦片加载速度的进一步提升.

猜你喜欢

瓦片矢量切片
一种适用于高轨空间的GNSS矢量跟踪方案设计
矢量三角形法的应用
打水漂
新局势下5G网络切片技术的强化思考
5G网络切片技术增强研究
网络切片标准分析与发展现状
乡村瓦语
惯性
推力矢量对舰载机安全起降的意义
浅析5G网络切片安全