您的位置:首页 > 运维架构

OpenLayers.Layer.Grid

2017-12-07 22:42 176 查看
OpenLayers教程之OpenLayers的WMS调用:

图像的加载是采用的螺旋式加载。首先从右上角开始按照顺时针方向给整个img矩阵建立一个堆栈,其实质是按照堆栈先进后出思想设计的一个数组,然后按堆栈中的位置顺序从视窗中间开始逆时针方向依次加载栅格图像。

整个img矩阵构成一个grid格网,当移动地图使得grid的范围[即bound值]不能包含视窗的bound,或者地图的显示比例发生变化时会重新向服务器请求数据,否则只会移动各个img的位置,从而使得视窗在grid之内。

客户端用于栅格图显示的img数量是由计算得到的。用户指定的用于显示的div作为视窗,视窗大小除以每张img的长宽得到一个m*n的矩阵,表示要填满整个视窗在长宽方向所需的最少的img数量,然后将Img长宽方向都缓存两个img得到一个(m+2)*(n+2)的矩阵,即为客户端img数,默认缓存为两格,当然我们也可以将缓存数作为参数传入以改变缓存默认值buffer,那么改动之后的矩阵为(m+buffer)*(n+buffer)。

在移动的时候取grid网格中左上角那个tile的左上角坐标值,即grid[0][0]为参考点,当这个点的坐标超出阈值的时候会搬动grid中各个节点的位置。

这里的img在openlayers中其实已经被封装成了Tile类,该图层有一个div作为容器。每个image都有一个div将其包装起来,tileSize是按照OpenLayers.TILE_WHITH,OpenLayers.TILE_HEIGHT常量事先就定义好了,表示每个tile实例的大小。

栅格图形显示之提供了基于标准的WMS调用的,即只要服务器端提供了标准的WMS服务,客户端就可以调用到。由于OpenLayers的螺旋加载功能是和最底下的一层分开的,因此我们可以在最底层扩展自己的栅格地图调用类,即让自己的类继承自OpenLayers.Layer.Grid,在我们自己的类中重构getURL方法。但是,这也有个弊端,那就是我们依然很大程度上继承了OpenLayers的栅格调用方法,这种方法具有很高的重用性,非常利于扩展,但是不一定会带来高的效率。

举个例子:

我们需要自己的调用方式,服务器端提供的栅格图金字塔一共有17级,整个显示范围是-180,-90,180,90,第零级每张栅格图经纬度方向上的跨度都是18度,随着级数升高经纬度方向上的跨度相比前一级都减半,栅格图采用的是格网坐标,坐标原点在左上角。我们自己的调用方式有一部分和WMS栅格图调用相同。当移动或者缩放的范围超出阈值的时候会向服务器发送请求,我们根据每个Tile的经纬度范围计算得到该栅格图中心点的经纬度坐标,而根据当前经纬度可以知道该分辨率下服务器端栅格图矩阵,然后再根据该分辨率下栅格图的经纬度跨度得到Tile在服务器端提供的栅格图上所处的位置,从而取到该图。从服务器端过来的栅格图像每张大小为256*256像素。

这个过程是很我重新写过的,基本继承了OpenLayers的WMS调用的核心思想,当然效率也不会有改进。

其实我们完全可以让自己的栅格显示类直接继承自OpenLayers.Layer,这样一方面利用了OpenLayers图层操作的框架,令一方面又最大程度上放弃了OpenLayers带来低效率的机制。经过本人试验,虽然做了这个改进,但是最终的效果也没有很明显的改进,原因容后续分析。

该部分主要包含4个类,OpenLayers.Layer,OpenLayers.Layer.HTTPRequest,OpenLayers.Layer.Grid,OpenLayers.Layer.WMS,它们的继承关系如图所示:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: