我们在使用一些在线地图产品时,通常有这种体验:打开一个地图,往往出现一个能够显示较大范围的地图,然后用户通过不断放大去查看地图的更多细节和了解更多的信息。这种操作就运用了地图切片的原理。对于一张范围比较大的地图,首先切片将其分为很多小块的地图,用户访问地图服务时,服务器将小块地图返回给用户,客户端再将小块地图进行拼接,这样就还原出了大块地图。对于用户来说,只需请求相应放大级别的瓦片地图图片在地图引擎进行显示。而在服务器端,是通过相应的算法将世界地图或某个区域的地图在每个级别都进行划分。在WebGIS中,大多数的在线地图使用墨卡托投影,地图投影到平面上时就是一个正方形。从瓦片金字塔的底层到顶层,分辨率越来越低,但表示的地理范围不变。上一层级的一张瓦片,在下一层级中,会用4张瓦片来表示,依此类推,按照2的幂次方放大,层级0的瓦片数是1=20×20,层级1的瓦片数是4=21×21,层级n的瓦片数是2n×2n。如图4-27所示,表示的是一个三层金字塔模型。
图4-27 切片金字塔
使用瓦片地图的作用在于,每次请求地图服务时,在一个视域内只能看到地图的一小部分,而不是一次性加载一整张地图。因为如果地图范围很大,一次性加载和绘制这张地图,无论是对客户端还是服务端来说,都是很重的负载。
要理解地图切片,我们需先了解两个关键点:切片坐标系和切片分辨率。
1.切片坐标系
不同的在线地图服务提供商,定义的瓦片坐标系不一定一样。切片坐标系的原点一般有两种:左上角和左下角。大部分切片的算法是采用左上角作为切片原点的,向上为y轴正方向,向右为x轴正方向,如天地图、Arcgis Server、OpenLayers3。使用OpenLayers3加载不同厂商的切片地图时,若切片坐标系不同,计算出来的切片地址就获取不到对应的切片,如果想正确显示对应的切片,就必须对切片坐标进行相应转换。(www.xing528.com)
2.切片分辨率
分辨率是指屏幕上的单位像素代表现实中的实际距离为多少。切片分辨率则是在该分辨率下的一张瓦片地图图片的实际范围为多少。大多数的地图厂商采用的切片大小为256×256,Yahoo地图使用的是512×512。所以,在使用OpenLayers3加载这类地图时,需要特别指明其切片大小。
了解切片的基础概念后,我们还需要了解一下Web地图中的瓦片是如何组织的。在本小节的最开始也简单介绍了一下客户端请求切片地图的流程。通常在客户端(一般指浏览器)请求地图服务时,客户端根据当前请求的位置,向服务器发送请求,服务器返回在这个视图范围内的一组连续的地图切片。在客户端获取图片后,再按照相应的规则进行拼接,一张张切片无缝衔接,这时候用户看到的就是一张完整的地图。
按照常识,通常定义一个二维坐标系需要x和y两个坐标轴,虽然用户在浏览一些地图服务时,看到的地图是平面地图,但是这背后其实是一个三维坐标系统。因为用户在请求当前瓦片在坐标系中所处位置的同时,还请求了当前瓦片的缩放级别,这里的缩放级别就相当于三维坐标系的“z”轴了。因此,大多数用户在使用鼠标滚轮进行缩放操作时,其实是在切换z轴的参数,地图服务系统监控到用户的请求后,向服务器请求更改缩放级别下(也就是不同层级)的地图切片。
在图4-27中,我们可以看到每拓展一个层级,切片的数量就会呈幂次方增加。如当地图的缩放级别为15时,且要满足用户可以看到城市的建筑,大约需要11亿张瓦片才能覆盖整个世界;而当缩放级别达到17时,仅仅是增加了两个缩放级别,要满足同样要求覆盖全世界就需要170亿张瓦片。所以,越是精细的地图,其瓦片数量越多,对服务器的要求也就更高。
在前面也提到过,使用地图切片技术能够使地图访问速度大大加快。例如,当用户曾经查看过某个位置的地图,再次访问该位置时,浏览器可以直接访问缓存在本地的地图切片,而不需要再次向服务器发送请求进行下载。除此之外,使用切片地图可以渐进加载,可能有的用户在使用地图服务时有过这种体验:在网速并不是特别快的情况下,有时候会看到整张地图像填补方格一样,需要一小段时间才能够填充完毕,即使当前地图的边缘或者其他部分没有全部加载完成,用户也可以移动或者缩放地图到某一特定点。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。