30一种基于矢量数据的瓦片金字塔算法
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一种基于矢量数据的瓦片金字塔算法
李海亭
武汉市勘测设计研究院
工程师,博士
摘要
由于响应速度一度成为互联网电子地图的发展瓶颈,随着瓦片地图技术的出现,地图的拖动、缩放以及不同比例尺下的快速浏览都有了很大的改善。近年来,许多互联网电子地图供应商(包括Google、Baidu、Mapbar、灵图等)都使用了这一技术。瓦片地图本质上就是把人们通用的地图作为主要地图背景,并采用预先生成的方法存放在服务器端,然后根据用户提交的不同请求,把相应的地图瓦片发送给客户端的过程。由于客户端请求的地图是预先生成,不需像传统的WebGIS那样对用户的请求进行实时计算和绘图,所以瓦片地图技术能够在地图的显示方面具有速度的优越性。地图瓦片是如何生成的,如何根据用户的请求范围实时地将相关瓦片反馈给用户,这需要建立一个良好的索引机制。本文根据基于瓦片地图机制的武汉市公益地图网()的实际开发应用,提出了一种基于矢量数据的瓦片金字塔算法,并探讨了该算法引发的地图变形问题及其修正方法。
关键词:瓦片金字塔;网格索引;地图变形;步长修正
1 前言
瓦片索引是当今网络电子地图发布的主要技术手段,它采用预生成思想将地图进行横向分幅和纵向分级,然后根据用户请求动态检索相应的图块并自动完成拼接。对全球进行空间划分的方法归纳起来主要有以下两种:等间隔空间划分和等面积空间划分。但在平面电子地图的表达中,瓦片索引在本质上则是地图投影变换和空间索引的融合运用,该索引模型的建立过程须根据其应用特点参考不同地图投影的变形规律。因此,瓦片索引方法研究同样也是适应新型地图产品而派生的新的研究领域,它是地图投影学研究的一个延伸。本文首先介绍基于矢量数据的地图瓦片金字塔概念,然后提出了一种采用网格索引的瓦片金字塔算法。本文还在分析该算法在特定区域引发的地图变形问题的同时进一步探讨了如何通过地图瓦片的长宽修正和经纬度步长修正两种方法解决变形问题。
2 基于矢量数据的瓦片金字塔
将指定范围内由矢量数据绘制并符号化的地图,进行纵向分级和横向分幅,根据不同的比例尺等级,按照指定尺寸(如300×240等)和指定格式(如JPEG,PNG等)进行切割,得到若干行和列的矩形图片库,这些矩形地图切片也称为地图瓦片(Map Tile) ,这些若干行和列的地图瓦片库呈现正金字塔形的数据结构。将预先生成的金字塔式地图瓦片库放置于服务器的虚拟目录中,服务器接收到客户端请求及验证后,根据客户端请求的地理范围及比例尺的大小,将预先生成的地图瓦片返回并显示在不同的客户端。
3 具体算法描述及步骤
现以世界地图为例,阐述该瓦片金字塔的主要算法。具体如下:
3.1 地图瓦片的基本约定
假设把世界地图按比例尺的大小分为16个等级,也就是说要在以后的地图切片中完成16套地图瓦片的制作。为了方便快捷的进行地图切片,同时考虑到要反映整个世界地图的特征,拟采用WGS84大地坐标系作为地图瓦片库的坐标系统,即将需要切片的矢量数据全部转换为WGS84的大地坐标系统。WGS84大地坐标系以经度和纬度反映地球上任意一点的具体位置,在相同等级的前提下,假定每张地图瓦片跨越的经纬度是相同的,并将地图瓦片的经纬度步长分为16个等级。根据实际计算的精度需要,拟采用非等比数列的步长数组。用
工作单位:武汉市勘测设计研究院,工程师
Javascript语言描述如下:
//定义地图缩放的级别
//定义地图瓦片跨越的经度步长数组
//定义地图瓦片跨越的纬度步长数组
3.2 地图瓦片的存放约束
由于地图瓦片是基于矢量数据生成的栅格图片,其本身并不具有空间位置信
息。但是每一张地图瓦片在特定的比例尺下跨越了固定的经纬度步长,所以很容易计算出该地图瓦片的具体位置信息。本文拟采用地图瓦片的文件名来标识其所在的地理位置。需要指出的是:由于地图瓦片的数量巨大,若用同一个文件夹来存放所有的地图瓦片,不仅会引起瓦片数据的管理混乱,而且对于存放地图瓦片的操作系统而言,每一个文件夹中文件的存放数量受限,很难达到地图瓦片库的存放要求。由于不同比例尺级别的地图瓦片库相对独立,故分别建立相应比例尺级别的文件夹用以存放该级别的地图瓦片,然后再根据网格索引的具体算法对该级别的地图瓦片进一步分类存放。
3.3 瓦片金字塔算法
地图瓦片的文件夹命名不是唯一的,为了方便计算的需要,拟采用缩放级别的数值作为每一套地图瓦片库文件夹的名称。实验证明:如果简单地将每一级别的地图瓦片都存放在同一个文件夹下,那么除了会遇到管理混乱和存放受限的问题外,客户端对地图瓦片的访问速度也会明显减慢。因此需要建立一种索引机制来提高这种金字塔形海量地图瓦片库的搜索速度。因为每张地图瓦片的文件名都是其地理位置信息的标识,在地图瓦片的切割过程中,假定以x_y的方式来命名,current_longitude,current_latitude分别表示当前的经度和纬度,current_level表示当前的缩放级别,用Javascript语言描述,那么最简单的索引算法是:
为避免上述瓦片管理混乱、存放受限及访问速度缓慢等问题,本文采用网格索引为海量地图瓦片库提供位置搜索服务,即假定每一个网格中包含若干行和列的地图瓦片,然后根据特定级别的瓦片数量,确定每一个网格具体的行和列的数值值。为了方便计算的需要,采用方阵来描述每一个网格。假设某一个级别方阵行数的值为M,根据该级别的地图瓦片数量设定M值。因为随着比例尺的增大,瓦片文件的数量呈非线性剧增,根据实际的计算结果,比例尺较小的M值设为10,比例尺较大的M值设为50。用Javascript语言描述如下:
//定义相应级别的网格方阵阶数数组
这样,每一个级别的瓦片库文件夹下就可以存放若干个用于索引的引擎文件夹,即引擎文件夹的名称将为地图瓦片库提供位置索引服务。上述瓦片文件名称x_y分别代表地图瓦片相对于经纬度原点(0,0)和相应经纬度步长的零点坐标值,分别用Origin_x和Origin_y来描述。对于某一级别的地图瓦片库,假设它的引擎文件夹名称为folder_x_folder_y,用Javascript语言描述,则满足:
假定应用网格索引后的地图瓦片名称仍然用x_y表示,用Javascript语言描述,则x和y的具体数值可以通过如下计算获得(%表示取余计算):
或者是:
这样,在客户端浏览特定范围的地图瓦片库或定位某一个具体的地理位置时,就可以根据此引擎机制调用相应的地图瓦片,并返回给客户端并无缝拼接显示。引擎机制调用的地图瓦片如图1所示。地图瓦片无缝拼接的计算方法同样采用此索引原理。由于地图瓦片的索引计算是在客户端完成的,属于一种胖客户端的结构,这样便大大减轻了服务器的负担,并很好地提升了地图请求的响应速度。
引擎机制调用的地图瓦片
3.4 瓦片的定位与拼接