高效地图缓存分包封装技术研究与实现

郑天宇,苟宇

( 北京超图软件股份有限公司,北京 100015)

论文来源:《测绘与空间地理信息》第36卷 增刊

摘要:论述了一种高性能的地图缓存的分包封装技术。通过高效的算法,将大数据量的缓存瓦片封装为多个独立缓存瓦片包。并通过多线程等并行技术,有效地提升了缓存的生成效率,加快缓存的读取速度,降低缓存分发、部署难度。该技术较好地解决了大数据量下缓存数据存储复杂性的问题。

关键词: 瓦片式地图缓存,分包封装技术,高性能

0 引 言

地理信息系统中的地图缓存得到了越来越广泛的应用[1]。Google Maps,Bing Maps,Yahoo Maps、天地图等都使用地图缓存来提供地图在线浏览服务。通过将矢量地图在发布前渲染生成为地图缓存,可以避免在提供在线服务期间动态地生成服务使用者所请求的图片,进而提高服务速度,改善服务体验[2]。但是,传统的瓦片地图缓存生成方式将地图瓦片生成为外存储器上分散的图片文件。这种方式虽然能够满足地图缓存预先生成的需要,也相对于在服务使用者请求到来时进行实时渲染要快得多,但是,该方法仍然存在不足:

1) 瓦片文件分散、占用空间大。由于地图瓦片文件数量大以及外存储器所使用的文件系统中多存在最小分配空间限制,存储在外存储器上所造成的存储碎片增多;再加上单个地图瓦片图片体积小,使得实际数据占用存储空间的比例相对于存储碎片的比例小,外存储器的空间利用率显著下降。

2) 瓦片存储在外存储器上的文件系统中,占用了大量的目录项,造成了查找单个瓦片文件的速度下降显著。

3) 数据在移动时需要对每一个瓦片进行操作,数据的迁移和部署过程复杂,耗时长。

4) 分散的瓦片进行版权保护时需要通过在瓦片图片上加上水印的方式[3],只能够保护发布后的瓦片不会被盗用。在某些情况下需要地图瓦片在未授权的情况下不能够使用,就必须在文件读取和传播上进行限制。将瓦片保存为零散图片文件的方式并不能进行此种保护。

由于分散式的地图缓存存在的以上种种不足,需要开发其它的存储形式来进行地图瓦片的保存。

本文介绍了一种高性能的地图缓存文件的分包封装技术。该技术通过将大量分散的地图瓦片文件封装进数量较少的包中,克服了分散式地图缓存存在的弊端。

1 地图缓存存储结构

分包式地图缓存将整个地图缓存区域分为不同的大小相等的数据区域。每个区域中的瓦片被封装在各个分包之中。所有分包加上地图缓存的元数据组成了地图缓存。

客户端在请求缓存瓦片的时候都存在局部性的特点,即在一段时间内的瓦片请求都集中在某一个区域之内。为了利用该特点,将一个矩形区域内的所有瓦片存储在一个包内。一个单独的包可以存储 x 行 x 列的瓦片。同时在包的起始位置放置该包内所有瓦片存储位置偏移量的索引。

地图缓存内部包含有不同层级的数据,例如 Google Maps 包含 18 个不同的层级下的数据。每一层级的数据又被分割为不同区域分别存放。图 1 描绘了此种存储方式的地图缓存的结构。

1. 1 元数据文件

地图缓存的元数据文件用来对于整个缓存进行说明。在地图缓存进行操作时,程序根据元数据来获取地图缓存的各个参数。元数据采用 xml 格式保存。元数据文件的内容包括各个层级的比例尺,数据的投影和大地参考系信息,缓存数据格式,存储类型等信息。

1. 2 层级目录

瓦片缓存被按照不同的层级被分别放置到不同的路径下。该方式也能简化缓存的分割、提取和局部数据的更新等操作。

1. 3 行划分和列划分

在每一个层级下,整个缓存范围被划分为 m 行、n 列张瓦片。为了避免将所有瓦片文件保存在一个目录下造成该目录的目录项过多,继而导致查找读取速度减慢,需要将所有瓦片分别封装进入不同的分包内。每个行下包含多个列。对于指定的行、列位置,所有的瓦片都被封装至一个分包内。

1. 4 分包内部结构

分包内的数据按照固定的格式进行组织,如图 2所示。

更多内容请点击下方的PDF下载