从底层谈WebGIS 原理设计与实现(八):WebGIS中栅格图层的设计

2024-06-06 07:32

本文主要是介绍从底层谈WebGIS 原理设计与实现(八):WebGIS中栅格图层的设计,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

从底层谈WebGIS 原理设计与实现(八):WebGIS中栅格图层的设计

 

摘要:我们在上一章里了解到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 原理设计与实现(八):WebGIS中栅格图层的设计的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1035473

相关文章

python使用watchdog实现文件资源监控

《python使用watchdog实现文件资源监控》watchdog支持跨平台文件资源监控,可以检测指定文件夹下文件及文件夹变动,下面我们来看看Python如何使用watchdog实现文件资源监控吧... python文件监控库watchdogs简介随着Python在各种应用领域中的广泛使用,其生态环境也

el-select下拉选择缓存的实现

《el-select下拉选择缓存的实现》本文主要介绍了在使用el-select实现下拉选择缓存时遇到的问题及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录项目场景:问题描述解决方案:项目场景:从左侧列表中选取字段填入右侧下拉多选框,用户可以对右侧

Python pyinstaller实现图形化打包工具

《Pythonpyinstaller实现图形化打包工具》:本文主要介绍一个使用PythonPYQT5制作的关于pyinstaller打包工具,代替传统的cmd黑窗口模式打包页面,实现更快捷方便的... 目录1.简介2.运行效果3.相关源码1.简介一个使用python PYQT5制作的关于pyinstall

使用Python实现大文件切片上传及断点续传的方法

《使用Python实现大文件切片上传及断点续传的方法》本文介绍了使用Python实现大文件切片上传及断点续传的方法,包括功能模块划分(获取上传文件接口状态、临时文件夹状态信息、切片上传、切片合并)、整... 目录概要整体架构流程技术细节获取上传文件状态接口获取临时文件夹状态信息接口切片上传功能文件合并功能小

python实现自动登录12306自动抢票功能

《python实现自动登录12306自动抢票功能》随着互联网技术的发展,越来越多的人选择通过网络平台购票,特别是在中国,12306作为官方火车票预订平台,承担了巨大的访问量,对于热门线路或者节假日出行... 目录一、遇到的问题?二、改进三、进阶–展望总结一、遇到的问题?1.url-正确的表头:就是首先ur

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

JAVA利用顺序表实现“杨辉三角”的思路及代码示例

《JAVA利用顺序表实现“杨辉三角”的思路及代码示例》杨辉三角形是中国古代数学的杰出研究成果之一,是我国北宋数学家贾宪于1050年首先发现并使用的,:本文主要介绍JAVA利用顺序表实现杨辉三角的思... 目录一:“杨辉三角”题目链接二:题解代码:三:题解思路:总结一:“杨辉三角”题目链接题目链接:点击这里

基于Python实现PDF动画翻页效果的阅读器

《基于Python实现PDF动画翻页效果的阅读器》在这篇博客中,我们将深入分析一个基于wxPython实现的PDF阅读器程序,该程序支持加载PDF文件并显示页面内容,同时支持页面切换动画效果,文中有详... 目录全部代码代码结构初始化 UI 界面加载 PDF 文件显示 PDF 页面页面切换动画运行效果总结主

SpringBoot实现基于URL和IP的访问频率限制

《SpringBoot实现基于URL和IP的访问频率限制》在现代Web应用中,接口被恶意刷新或暴力请求是一种常见的攻击手段,为了保护系统资源,需要对接口的访问频率进行限制,下面我们就来看看如何使用... 目录1. 引言2. 项目依赖3. 配置 Redis4. 创建拦截器5. 注册拦截器6. 创建控制器8.