(八)WebGIS中栅格图层的设计

1.    前言

我们在上一章里了解到WebGIS中栅格图层的本质——地图图片。而从之前的第二章到第五章,我们详细的介绍了地图图片的获取原理和方法。所以在设计栅格图层前,我们已经知道了栅格图层中数据是如何获得的,剩下的便是怎样将这个过程用一种符合面向对象的设计原则来进行实现。

2.栅格数据获得的流程

这里我再次将栅格数据获得的流程描述一遍:

首先,得到屏幕范围内的地图四角坐标,根据此四角坐标算出屏幕范围内地图最靠近的地图级别,以及此时瓦片的行号范围以及列号范围,然后按照行号和列号拼接出瓦片请求,进行瓦片加载。最后将得到的瓦片按照顺序拼接成一整块地图,进而在前端显示出来。

3.实际中的问题

设计前我们提出这样一个问题:

我们栅格数据的来源可能有很多种,比如在线地图和离线地图。同时,在线地图可能是由不同的请求方式而获得的数据,离线地图也同样可能是来自于不同的切图格式。

我们本身是不能确定用户使用哪一种数据来源,或者用户是否会中途改变数据来源。

4.思路

仔细分析上面提出的问题,结合面向对象设计中的继承、封装、多态三个特性,我们可以抽象出这样的一种设计思路:

(1)设计一个类,此类为所有的栅格图层最高的父类——BaseLayer。在该类中定义一些所有类皆需要的要素,同时提供最基础的方法,比如事件监听方法。

(2)设计一个过度的类——ImageLayer,此类继承于BaseLayer,但是在此类中对部分共同的方法进行实现。比如瓦片的请求中,行号和列号是每一种栅格图层均需要有的,并且瓦片的拼接方式也是通用的。所以由这几个共同点,可以定义一些与此相关的方法。

(3)设计具体的栅格图层类,比如设计针对于ArcGIS在线地图的类、针对于超图在线地图的类、针对于WMS请求方式的类等等。而这些具体类均继承于ImageLayer。

5.UML图

根据第4节中的思路,我们这里给出一种栅格图层的设计方式:

6.对栅格图层设计的详解

从UML图中可以看出,我们首先提炼出了每种瓦片图层所共有的一个基类,即BaseLayer,在这个基类中包括了组成每一种图层所必须有的几个属性,例如瓦片图层的本质-Canvas,以及每一个瓦片图层的几何边境范围还有对地图事件的监听和移除方法等。

而所有瓦片图层涉及到的核心算法,即获取瓦片的行列号、瓦片在屏幕中的坐标等均是首先在继承于BaseLayer中的ImageLayer里进行定义以及部分共同算法的编写。其中getMapByGeoExtent是核心的算法,此算法的功能是将范围内的瓦片的url进行换算以及通过url进行瓦片请求和加载。

每一个具体的瓦片图层类均是直接继承于ImageLayer,然后在具体瓦片图层中实现对瓦片行列号的换算,以及瓦片的URL的换算。在地图加载事件触发后,进行execTileRequest方法进而调用基类父类ImageLayer中的geoMapByExtent方法。

7.优化栅格图层的设计

根据瓦片图层设计的原理,可以在两个方面进行优化。一个是瓦片请求时,请求的地图范围的优化;一个是对请求得到的瓦片按照一定的规则缓存到内存中。

7.1瓦片请求范围的优化

如果地图每次只请求屏幕范围内的瓦片,那么每当地图平移被触发就会进行瓦片请求,这样会让前端经常处于瓦片请求状态。但是同样,瓦片请求的范围也不能过大,过大会造成请求瓦片时用户等待时间过长。所以,在屏幕范围外设置一个合理的缓存范围,使每次请求时请求的地图范围为屏幕范围加上缓存范围之和(screenBoundary+toleranceBoundary)是很必要的。

7.2瓦片的缓存

如果每次请求的瓦片均需要从服务器或者浏览器的瓦片缓存中获取,这势必将延长前端地图的展现时间,如果能直接将瓦片缓存到内存中,然后遇到相同瓦片时直接从内存中读取,这比上述两种方式都要快,能加快前端地图的显示。但是同样,瓦片不能缓存太多,这样对内存来说负荷太大,并且很多瓦片用过一次后,可能后来很长时间都不会用到,所以需要用一定的调度规则以及合理的内存容器大小来放置和管理瓦片。

8.优化的实现

8.1请求范围优化的实现

在实际项目中,有的项目是默认在屏幕范围所对应的瓦片范围上,另外在四周扩充一个或多个瓦片的宽度范围。而有的项目,对此不做任何处理,因为我们实际上获得的瓦片范围,其本身就是大于屏幕所对应的地理范围的。

对于想人为扩充一个或多个瓦片宽度范围的读者,可以在本系列第三章中,计算瓦片实际起始号时,人为的将瓦片起始号进行变动。在变动瓦片起始号后,后面计算出来的请求瓦片的实际地理范围等参数均需作出相关调整。

当然,最简单的是不人为做此优化,因为如我上面所说,我们通过公式算出来的瓦片范围本身就是比屏幕地理范围要大的。优化在基本算法中就已经实现了。

8.2瓦片缓存机制的实现

我们可以定义一个大小固定的容器,其中内容是通过键值对来存储。每个瓦片的URL是独一无二的,可以当做Key。而容器中瓦片的调度规则为使用频率排序加先进先出原则。详细流程如下:

(1)容器中新添加的瓦片放在所有瓦片的上面,Max(index)。

(2)容器中被调用的瓦片重新放在所有瓦片的上面(Max(index)),而其他瓦片均自动向前进一位(index-1)

(3)当容器装满时,将最低层的瓦片删除,即index为0的瓦片被删除。

9.总结

基于之前章节的知识,我们在这一章里没有多描述栅格数据的获取原理和方法,而是把重点都放在了栅格图层的设计上面,在最后我们介绍了两个优化栅格图层设计的思路。栅格图层作为WebGIS中地形图的显示核心,设计一个好的栅格图层组织方式是至关重要的,否则会照成地形图显示过慢,或者不能很好的支持多种地形图来源。并且如果设计的不合理,会照成大量的代码冗余,导致任何扩展或者维护均会非常困难。当然,这里给出的这种设计框架肯定不是最好的,希望我能给读者抛砖迎玉。下一章开始,要开始连续几个篇章来讲解矢量图层的设计了。我会从矢量图层的数据来源、坐标转换和最后的设计实现来跟大家一起全面的探索WebGIS中的矢量图层。欢迎大家持续关注。

------欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS

如果我们留恋,或者感到遗憾,都是因为我们害怕我们留恋的遗憾的东西,不会再次经历。

而经历是可以创造的,多努力。

(八)WebGIS中栅格图层的设计,布布扣,bubuko.com

时间: 2024-10-01 18:45:16

(八)WebGIS中栅格图层的设计的相关文章

(十二) WebGIS中矢量图层的设计

1.前言 在前几章中我们已经了解了什么是矢量查询.屏幕坐标与地理坐标之前的转换以及要素的设计,有了这些知识,这一章里我们终于可以进行矢量图层的设计了. 在Catalog里创建一个FeatureClass时,我们能够选择是创建点图层或者线图层或者面图层等.所谓点图层,即该图层中的要素只能是点,其他几个图层顾名思义,也是如此.那么在WebGIS中,我们同样也可以按照ArcGIS里的这个设计思路来设计我们的矢量图层,虽然这个方法是肯定可行的,但是在实际的业务需求中,如果按照这种点图层等来严格控制的话,

(十八)WebGIS中I查询的原理及设计(包含AGS、GeoServer、Supermap)

1.背景 我们在使用arcmap时,经常会用到被称为I查询的工具.具体功能便是,当激活I查询功能后,鼠标点击到某个要素上时,界面上会弹出一个对话框用来显示该要素的各属性信息.该功能截图如下: 2.原理 在WebGIS中设计和实现该功能之前,我们有必要对该功能的原理做一个了解. 在OGC的WMS标准中规定了一个接口:GetFeatureInfo.该接口的功能描述便是:根据屏幕坐标.当前视图范围等参数,获得屏幕坐标某处要素的信息. 在OGC的WFS标准中也规定了一个接口:GetFeature.该接口

(十八)WebGIS中清空功能和地图定位功能的设计以及实现

1.背景 当地图中增加了很多元素后,对不同的元素需要进行一定的控制,最简单的控制就是能对元素有选择的进行清空删除.在本节中,还将介绍WebGIS中另外一个常用功能,即地图定位功能.具体描述便是:当输入一个坐标点后,能够将地图缩放到该点处.下面我便就以上两个功能展开此章节的内容. 2.清空功能 2.1设计思路 根据功能点,我们可以将清空分为如下几个情形: a.清空某个或者指定个数元素 b.清空某类或多类元素 c.清空所有元素 在之前的矢量图层原理章节中,我已经就WebGIS中的矢量图层原理做了详细

(十五)WebGIS中平移功能的设计和实现

1.前言 这一章我们将详细讲解WebGIS工具栏中另一个基础工具——平移工具(Pan).在介绍命令模式时,我们已经知道了此工具为Tool型的. 这个工具主要有如下两个功能: A.当切换到此工具上时,按下鼠标不放,移动鼠标时可以拖动地图. B.当切换到此工具上时,点击鼠标(鼠标不做平移),可以使地图平移,以点击处为中心. 2.设计 2.1 原理 我们已经知道,WebGIS中图层的本质是Canvas.平移效果的实现,其实质就是改变各Canvas的左上角坐标. 这里我给出示意图: 2.2提一个问题 当

(十四)WebGIS中地图放大缩小的设计和实现

1.背景 在上一章中,我们给出了整个工具栏设计的核心,使用命令模式,并设计了具体工具类所继承的基类——Command类.从这一章开始我们便正式进入了具体工具类的设计和实现. 放大和缩小工具是最基础的工具之一,其操作分为三种: a.点击地图,进行放大缩小 b.拉框,进行放大缩小 c.滚轮调控放大缩小 针对这三种操作方式,我们进行了不同的代码逻辑设计. 2.分析 a.滚轮调控地图放大缩小是一个固定的操作,即使切换到其他操作上时,此操作也应该同样生效.所以,将此功能应该放入到基类Command类中.

以项目谈WebGIS中Web制图的设计和实现

文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.背景介绍 一般WebGIS项目中,前端展示数据的流程基本是先做数据入库.服务发布.然后前端调用展示.假设用户没有基本的GIS背景,需要将本地的excel或CSV等文件快速在地图上进行展示,此需求该如何解决? 目前市场上针对解决这种需求的产品已陆续出现,比如mapbox的studio,esri的portal,超图的地图慧以及由超图原项目经理离职后创办的地图无忧等产品.

(七)WebGIS中的栅格图层和矢量图层的显示原理

1.何为栅格数据,何为矢量数据? 在GIS中,对于数据格式的分类,我们一般会将其分为栅格数据和矢量数据两种类型.栅格数据是将空间看做离散的像元,由二维数组或者其他数据组织方式来进行表达.矢量数据恰恰相反,它将空间看成是连续的,用要素(点.线.面)来进行表达. 我们把栅格数据和矢量数据的特点归纳如下: (1)栅格数据是离散的,矢量数据是连续的.所以栅格数据多用二维数组(行.列)的方式组织.而矢量数据可以理解为一种向量,它用平面坐标(X.Y)的有序几何来组织. (2)栅格数据的最小单位是像素,矢量数

(十六)WebGIS中偏移补偿量引发的问题之探讨

1.背景 在上一章里讲解地图平移功能的实现时,我在最后提出了两个问题: A.在地图平移后,矢量图层的canvas的XY都发生了变化,此时根据地理坐标转换为屏幕坐标公式得出的屏幕坐标,在canvas上能将要素正确显示吗? B.矢量图层canvas的原点坐标XY有需要还原成初始的(0,0)的时候吗? 对这两个问题我给出的答案是:不能和需要. 在这一章里,我们将详细讲解得出这两个答案的原因. 2.何为偏移补偿量? 在地图平移时,我们做了两个操作:一个是对MapCanvas的原点坐标XY进行了变化,第二

(六)WebGIS中地图瓦片在Canvas上的拼接显示原理

1.前言 在之前的五个章节中,我们在第一章节里介绍了WebGIS的基本框架和技术,第二章节里介绍了什么是瓦片行列号以及计算它的原因,第三章节里介绍了如何通过地理范围计算出这个范围内瓦片的行列号,第四和第五章节里介绍了在得到瓦片行列号后如何获得离线和在线地图的URL,这个章节里,我们将介绍在通过URL得到瓦片后,如何将其显示在浏览器相对应的地方,拼接出整块地图. 2.左上角瓦片起始点屏幕坐标的计算 在第三章节中,我介绍了对于左上角瓦片起始点屏幕坐标的换算原理和方法,这里我再次给出这个公式: off