当前位置:文档之家› 30一种基于矢量数据的瓦片金字塔算法

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 瓦片的定位与拼接以定位某一个具体的地理位置来说明该引擎机制在地图瓦片库中的具体应用。

根据上述设定,当前需要定位的地理坐标为(current_longitude, current_latitude),调用的地图瓦片文件路径为Tile_path,则满足:Tile_path = 地图瓦片库文件夹+ current_level + folder_x_folder_y + "/" + x_y + .扩展名定位某一个具体的地理要素并使该要素在地图上完整居中显示,则根据其质心及整个要素所跨越的地图瓦片计算获得。

4 算法引发的地图变形问题及其修正方法在瓦片地图的发布过程中,所有的地图瓦片从形状来讲往往是全等的。

但地球是一个不规则的椭球体,在同一个地点,跨越相同的经度和纬度,距离一般并不相等。

并且,在不同的纬度带,跨越同样的经度差,距离也往往是不相等的。

因此,利用上述计算方法,只有在同时满足上述两种条件的理想情况下,地图瓦片上所表示的地理要素与实际地物的长宽比才会一致。

也就是说,假设地球是一个标准的球体,这种瓦片金字塔算法在赤道地区附近相对来讲是适用的。

如何使该算法适用于世界范围或某一特定的区域呢?本文尝试通过地图瓦片修正和经纬度步长修正两种方法对上述算法进行改进,使其能够较真实的反映某一区域而不产生大的变形。

4.1瓦片长宽修正瓦片长宽修正方法是指根据其特定在区域位置,在该区域范围内,通过计算同一经度和纬度所跨越的实际距离来调整地图瓦片的长宽比例关系,以此来修正瓦片上所表示地理要素的真实形状及要素间的相对位移。

以北京市为例,同样假设地球为一标准的球体(这样假设的误差并不大),假设经纬度每变化一度跨越的实际地理距离为x_perlongitude、y_perlatitude,地球半径为radius_Earth,北京市的经纬度坐标为BJ_LONGITUDE,BJ_LATITUDE。

则满足:北京市的纬度坐标大约为北纬39.92度,因此,每块地图瓦片的长宽比为cos(39.92°)=0.767。

为了计算方便的需要,将瓦片的长宽比调整为4:5。

在实际计算中,设定每块瓦片大小为240像素×300像素,并同北京1954坐标系下公里格网的北京市地图相比较,没有发生大的变形,基本满足公众需要。

4.2经纬度步长修正经纬度步长修正方法是指地图瓦片保持正方形特征,而修正每块瓦片跨越的经度或纬度步长。

以纬度步长修正为例,根据上述计算,每一块瓦片的大小设定为300像素×300像素,调整每块瓦片跨越的纬度和经度的比值为4:5。

即将上述地图瓦片跨越的纬度步长数组修改为:经过上述方法进行修正,可以基本解决瓦片地图技术在特定区域范围内引发的地图变形问题。

对于世界范围内的地图瓦片表达,可以通过对经纬度实行分带,然后再通过步长修正的方法来尽量减小地图变形。

分带的数值越大,引发的地图变形将越小。

5 结语本文采用网格索引为矢量地图的瓦片金字塔图库提供引擎服务,该引擎算法可以快速实现客户端地图瓦片的调用及无缝拼接显示,大大提升地图的响应速度;另外,本文还探讨了瓦片金字塔算法引发的地图变形问题,并提出了两种修正方法:即在特定的区域范围内,根据计算同一经度和纬度所跨越的实际距离,对地图瓦片自身的长宽比例关系进行修正;或者对地图瓦片跨越的经纬度步长进行修正。

相关主题