OpenLayers.Layer.Grid

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,它们的继承关系如图所示:

wms

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值