WebGSI地图切片|栅格地图切片原理|地图矢量切片原理

news2024/11/15 3:21:48

介绍

图栅格切片是WebGIS中使用的一种新技术,通过地图栅格切片可以有效缩短服务器的地图生成时间和地图传输时间,提高系统的响应速度。
地图切片是在多个比例尺下配置地图,预先将每个比例尺下的地图绘制成小图片,保存到服务器上一个名为CACHE的目录中。这样,客户端在访问地图时,可以直接获取所需的小图片并拼接成整个地图,而不是由服务器动态创建图片并发送给客户端,从而大大提高了访问速度。
当浏览区域发生变化时,客户端通常会向服务器请求更新地图数据,服务器在接收到请求后需要将新区域的地图转换成图形格式,并发送给客户端。如果能控制服务器每次只更新有变化的区域,而不是窗口的全部区域,就可以缩短服务器的成图时间和地图传输时间,提高系统的响应速度。

切片基本原理

地图切片服务将大型地图分割成若干小块(切片),每个切片对应地图的一个小区域。用户在浏览地图时,客户端会根据当前视图的范围和缩放级别请求相应的切片,从而逐步加载并显示完整地图。

  • 分层结构:地图通常按不同的缩放级别进行切片。每个缩放级别对应一组不同分辨率的切片。
  • 网格系统:地图被划分成一个网格,每个网格单元代表一个切片。切片使用行列号来标识其位置。
  • 请求与响应:客户端请求特定位置和缩放级别的切片,服务器根据请求返回对应的图像。

WMTS与WMS

Web地图服务规范包括WMS(网络地图服务)、WMTS(网络地图瓦片服务)等。
WMTS(Web Map Tile Service)服务和WMS(Web Map Service)服务对客户端的服务请求有不同的响应。

  • 当客户端请求WMTS服务时,会向客户端返回固定大小的切片。客户端根据索引号获取每个切片,并进行拼接,显示为地图。
  • 当客户端请求WMS服务时,一个完整的图片返回给客户端,客户端可以直接获取并展示。

切片相关概念

切片原点:通常有两种类型的切片原点:1.左上角;2.左下角。大多数切片算法使用左上角作为切片的原点,如Sky Map、ArcGIS Server等。切片原点定义了第一个切片的位置。
切片分辨率:和比例一一对应。比例尺指的是地图上单位所代表的实际距离。分辨率表示由屏幕上的一个像素表示的实际距离,因此当确定一个像素时,相应的距离也被确定。

由于不同维度变形不一样,因此进行地理量算时不是根据比例尺而是根据地理坐标直接计算的。

初始切片范围:指的是被切片原始图像的大小,图像是在此分辨率下256*256个切片的数量。

栅格地图切片

1.地图栅格切片的原理

地图的预生成一般将指定范围的地图按照指定尺寸(如256 px等)和指定格式(如JPEG、PNG等)切成若干行及列的正方形图片,切图所获得的地图栅格切片也称瓦片。
对某个区域进行切片时,从左上角(西北角)开始对此固定范围进行切图,第一级切片一般情况下可以采用1张图片,后续不同等级的地图之间采用四叉树数据结构,第level级上的1张切片到第level+1级将变成4张,这种结构有助于切图和快速显示,但得出的地图没有固定的比例尺,比例尺随地理纵坐标变化。
图栅格切片金字塔结构示意图

图中每个切片采用“级号+行号+列号”的方式给切片编号(其中级号、行号、列号都从0开始编号),对切片的加载,可以采用级号/列号/行号的方式进行请求。

2.基于地图栅格切片的WebGIS

基于地图栅格切片的WebGIS工作流程如下:

  1. 服务器预先将要发布的地图生成多级地图栅格切片。
  2. 客户端在使用地图时,根据客户端的地图需求,确定需要加载的地图栅格切片(切片的级号、行号、列号)。
  3. 客户端的多线程功能可以同时下载多个切片。当地图窗口发生移动、缩放等地理范围变化时,可以同时下载多个新的地图栅格切片来拼成一幅完整的地图。

image.png
基于地图栅格切片的WebGIS的优缺点:
优点:

  1. 与平台和操作系统无关,具有很好的跨平台能力。
  2. 预先生成地图栅格切片,减轻了服务器的负担。
  3. 能充分利用浏览器缓存和多线程技术,提高响应效率。
  4. 能处理海量的GIS数据。

缺点:

  1. 地图表现比较有限,图层控制能力弱,尤其是图层特别多的地图数据,在进行切片时,可能对较多的图层进行了合并。
  2. 空间分析非常有限,一些较复杂的GIS功能需要结合别的方式实现。

地图矢量切片

1.地图矢量切片简介

地图矢量切片和地图栅格切片采用了相同的思路。地图矢量切片以金字塔方式切割矢量数据,只不过切割的不是栅格图片,而是矢量数据的描述性文件。目前地图矢量切片主要有以下三种格式:GeoJSON、TopoJSON和Mapbox Vector Tile(MVT)。

  • GeoJSON易于阅读、通用性强,大多数软件可以直接打开这类文件,但存储的地理数据较多时易产生冗余信息。
  • TopoJSON是在GeoJSON基础上对共享边界几何要素拓扑编码,减少冗余信息的一种优化数据格式,被Mapzen(一个开源平台)推荐作为地图矢量切片的存储格式。
  • PBF是一种轻便、高效的结构化数据存储格式,MVT采用PBF格式组织单个切片内要素的信息。

Mapbox的矢量瓦片(mapbox vector tile)是一种轻量级的数据格式,用于存储地理空间矢量数据,例如点、线和多边形。

地图矢量切片技术继承了矢量数据和地图切片的双重优势,有如下优点:

  • 相对于原始矢量数据,地图矢量切片更小巧,重新进行了编码,并进行了切分,只返回请求区域和相应级别的矢量数据。
  • 数据信息接近无损,但体积更小,地图矢量切片的大小通常比地图栅格切片小,这使得数据传输得更快,可以使用更小的带宽。
  • 数据在客户端渲染,而不是在服务器。这允许不同的地图应用程序使用不同的样式去渲染一个地图,而不需要事先在服务器进行预先的样式配置。
  • 更灵活,可以只返回每个专题数据的图层,而不像地图栅格切片那样把很多专题数据渲染在一张底图中。

地图矢量切片的主要缺点;

  • 需要对地理数据进行预处理,以便客户端能够完成所需的绘图(类似于地图栅格切片的数据预处理)。
  • 考虑到这一点,地图矢量切片只能用于渲染。虽然是矢量格式,但它们不可编辑,地图矢量切片是为了读取和渲染的优化。如果要在客户端编辑要素,最适合的是使用OGC的WFS服务。

相关资料 :
mapbox vector tile 详解
Vector tiles standards | Tilesets | Mapbox Docs

2.地图矢量切片的原理

地图矢量切片的原理:以MVT为例:

(1)地图矢量切片数据组织

  • MVT采用PBF格式组织单个切片内要素的信息。PBF是一种轻便、高效的结构化数据存储格式。

image.png
(2)地图矢量切片的编码规则。

  • 几何位置信息编码:
    • PBF格式的地图矢量切片在存储几何位置信息时所用的坐标系是以地图矢量切片左上角为原点、以x轴向右为正、以y轴向下为正,坐标值以格网数为单位。
    • 单个地图矢量切片的默认格网数为4096×4096。

image.png

  • 切片属性信息编码。
    • PBF格式的切片属性信息被编码为tags字段中的一对整数。
    • 在存储大量的重复字段名称和属性值的要素信息时,PBF格式能够很好地避免重复信息。

image.png

要素1的属性字段hello的属性值为world,在PBF格式中用一对整数“0,0”表示。第一个整数表示hello在地图矢量切片所属的图层keys列表中的索引号(以0开始);第二个整数表示value在地图矢量切片所属的图层values列表中的索引号(以0开始)。通过比较可以发现,在存储大量的重复字段名称和属性值的要素信息时,PBF格式能够很好地避免重复信息。

  • 环绕顺序:环绕顺序是指地图矢量切片绘制环的方向
    • 为了让渲染器能够正确区分哪些多边形是洞,哪些多边形是单独的几何对象,要求所有多边形都是有效的。
    • 任何多边形内环的方向都必须与其父外环的环绕顺序相反,并且所有内环都必须直接从属于其所属的外环。
    • 外环必须采用顺时针方向,内环必须采用逆时针方向(屏幕坐标)。

image.png
(3)地图矢量切片的裁剪
当已有的地图矢量要素被切片后,在地图的构建过程中必然会涉及地图矢量图层的裁剪,裁剪的关键在于地图矢量切片范围内点、线、面要素的坐标信息的分割。
对于矢量对象的裁剪,最基本的是点要素的裁剪,因为点是构成线要素和面要素的基本单位。
**最重要的是线要素的裁剪,**无论面要素如何复杂,最终都要归结到以线要素的裁剪方式去处理。

  • 点要素的裁剪。点要素由坐标(x,y)构成。点要素的裁剪比较容易,只需要判断该点是否位于当前地图矢量切片范围之内,若在则将该点写入地图矢量切片即可。
  • 线要素的裁剪。线要素的裁剪略复杂一些,线要素与地图矢量切片之间的关系可以分为无交点、有一个交点、有两个交点和线要素与地图矢量切片多次相交4种情况。

对于线要素的裁剪,不能单纯以点的位置来判断线要素与裁剪窗口是否相交,因为这种做法可能会错误地判断线要素与裁剪窗口的位置关系。
具体就是要一个端点一个端点的判断。

image.png

  • 面要素的裁剪。面要素与地图矢量切片范围之间的关系主要有4种,面要素的裁剪过程更加复杂,需要对面要素的顶点逐个进行处理,然后重新构造面。

image.png

(4)地图矢量切片的合并
因为在地图矢量切片的裁剪过程中,地图矢量要素的完整性被破坏,如果不预先合并,直接绘制地图矢量数据,会出现许多原始数据中不存在的新增节点和地图矢量切片边界线。
合并的过程就是要重建地图矢量要素在可视区域的完整性,并且保证可视区域的地理要素是合理、无歧义的。

  • 点要素的合并。点要素的数据结构比较简单,它与地图矢量切片的关系仅有被包含和位于地图矢量切片边界两种,仅需要将地图矢量切片中的点要素复制到合并区域中即可。
  • 线要素的合并。线要素的合并是基于地图矢量切片内唯一的要素ID来实现的。将地图矢量切片内两个要素ID相同的线要素按顺序复制到合并区域中即可,在合并过程中可能出现两种情况。
    • 被分割的线要素具有相同的要素ID,并且在相邻的两个地图矢量切片边界线中存在2个(或4个)相同位置的点,则在合并区域中,geometry的属性要设置为LineString类型。
    • 被分割的线要素虽然具有相同的要素ID,但在相邻的地图矢量切片中并不存在相同位置的点,在合并区域中,geometry的type属性要设置为MultiLineString类型。

image.png

  • 面要素的合并。面要素的合并与线要素的合并方法基本一致,同样是基于地图矢量切片内唯一的要素ID来进行的,只是面要素的合并还存在内部填充问题,所以考虑的情况还要更复杂一些。
    • 主要原因就是在面要素裁剪过程中产生的新增点,这些新增点在面要素渲染过程中会形成边界线,破坏面要素的完整性,影响显示效果。
    • 在面要素的裁剪过程中要考虑面要素在地图矢量切片内的完整性,要存储边界线。

多余边界线对面要素完整性的破坏

  • 不存储边界在面要素填充过程中引起的歧义

地图栅格切片与地图矢量切片的对比

地图栅格切片对客户端性能、硬件要求不高。
地图矢量切片需要在客户端渲染,对客户端性能、硬件等要求较高。

对比指标地图栅格切片地图矢量切片
无级缩放不支持,固定缩放级别支持
客户端灵活显示不支持支持,客户端可定制渲染规则
在底图上完美显示一般情况下不支持,地图栅格切片通常作为底图,可以多层叠加支持
是否可以添加标签不可以可以
交互性良好
数据大小较大较小
客户端是否需要进行额外处理不需要需要
在客户端对切片进行再次投影不支持支持
原始地图数据是否安全安全不安全
传输带宽要求较大较小

参考资料:

WebGIS的Web服务概述
2.5. 对WMTS服务的初步认识和解读 — Open Source WebGIS v 0.15 文档
Web地图服务规范(WMS、WMTS、TMS)简析_wms wmts-CSDN博客
《WebGIS原理及开发:基于开源框架的WebGIS技术》-张发勇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1940123.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

set(集合),multiset容器及pair队组的创建

1.set的基本概念:所有元素再插入时自动按升序排序,set/multiset属于关联式容器,底层结构是用二叉树实现的 set与multiset区别: set中不允许容器中有重复的元素 multiset允许容器中有重复的元素 2.set的构造函数 3.set的大小和…

【Linux】进程间通信之-- 共享内存与信号量的介绍(下)

前言 上一篇,我们由进程间通信,引入并讲述了管道、匿名管道和命名管道,本节,将继续学习进程间通信的另一种方式之,共享内存。还要学习几个系统调用接口,并演示两个进程通过共享内存来进行通信。。。 目录 1…

数据结构——队列(链式结构)

一、队列链式结构定义 队列的链式存储结构是一种用链表实现的队列,它不像顺序存储结构那样需要预先分配固定大小的空间。链式存储结构的队列由节点组成,每个节点包括数据和指向下一个节点的指针。队列的链式存储结构可以动态地分配内存,更灵活地处理数据。在链式存储结构中…

【07】LLaMA-Factory微调大模型——微调模型导出与微调参数分析

上文介绍了如何对微调后的模型进行使用与简单评估。本文将介绍对微调后的模型进行导出的过程。 一、llama-3微调后的模型导出 首先进入虚拟环境,打开LLaMA-Factory的webui页面 conda activate GLM cd LLaMA-Factory llamafactory-cli webui 之后,选择…

SQL39道常见题型

SQL1 查询所有列 现在运营想要查看用户信息表中所有的数据,请你取出相应结果。 select * from user_profile 结果: SQL2 查询多列 还是上面那个输入,题目换成:现在运营同学想要用户的设备id对应的性别、年龄和学校的数据&#…

TIM基本定时器

TIM基本定时器 文章目录 TIM基本定时器1.定时器的分类2.定时器运行流程3.基本定时器的配置流程4.中断配置 1.定时器的分类 以STM32F1系列为例,它的定时器可以根据其特性和功能被分为三大类: 基本定时器: 包括:TIM6和TIM7。特点&a…

数据结构全部知识-----第一 关于数据结构的介绍

数据结构是计算机存储、组织数据的方式。它是计算机科学中的一个重要概念,主要目的是使数据的存储和访问更高效、更方便。常见的数据结构包括: 线性结构: 1. **数组(Array)** :一种基础的数据结构&#xf…

【BUG】已解决:AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘

AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 目录 AttributeError: ‘WindowsPath‘ object has no attribute ‘rstrip‘ 【常见模块错误】 【错误原因】 【解决方案】 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页&…

C++中的多路转接技术之epoll

epoll 是干什么的?举个简单的例子 epoll的相关系统调用**epoll_create**和epoll_create1区别 epoll_ctl参数解释 **epoll_wait**参数说明返回值 epoll的使用 **epoll**工作原理epoll的优点(和 **select** 的缺点对应)epoll工作方式**水平触发**Level Triggered 工作…

针对汽车应用而设计的SCT4026D、SCT4062K、SCT3105K、SCT3080A、SCT3060A全新系列碳化硅 (SiC) MOSFET

全新系列碳化硅 (SiC) MOSFET SCT4026DWAHRTL SCT4062KWAHRTL SCT3105KRC15 SCT3080ALHRC11 SCT3080ARC15 SCT3060ARC15 ——明佳达 AEC-Q101 SiC功率MOSFETs是汽车和开关电源的理想选择。SiC功率MOSFETs可以提高开关频率,减少所需的电容、电抗器和其他元件的体积…

react开发-配置开发时候@指向SRC目录

这里写目录标题 配置开发时候指向SRC目录VScode编辑器给出提示总体1.配置react的 2.配置Vscode的1.配置react的2,配置VSCode的提示支持 配置开发时候指向SRC目录VScode编辑器给出提示 总体1.配置react的 2.配置Vscode的 1.配置react的 1. 我么需要下载一个webpack的插件 这样…

【闲谈】我的创作纪念日(CrowdStrike、无人驾驶)

感谢地心引力 ,有幸再次遇见你: 还记得 2020 年 07 月 22 日吗?你撰写了第 1 篇技术博客:《遗传算法实例解析》在这平凡的一天,你赋予了它不平凡的意义。也许是立志成为一名专业 IT 作者、也许是记录一段刚实践的经验。…

【iOS】——探究isKindOfClass和isMemberOfClass底层实现

isKindOfClass 判断该对象是否为传入的类或其子类的实例 // 类方法实现,用于检查一个类是否属于另一个类或其父类链上的任何类。(BOOL)isKindOfClass:(Class)cls {// 从当前类开始,tcls将沿着元类的继承链向上遍历。for (Class tcls self->ISA(); …

MySQL:库表操作

MySQL:库表操作 库操作查看创建字符编码集 删除修改备份 表操作创建查看删除修改 库操作 查看 查看存在哪些数据库: show databases;示例: 查看自己当前处于哪一个数据库: select database();示例: 此处由于我不处于任…

Unity UGUI 之 Input Field

本文仅作学习笔记与交流,不作任何商业用途 本文包括但不限于unity官方手册,唐老狮,麦扣教程知识,引用会标记,如有不足还请斧正 1.Input Field是什么? 给玩家提供输入的输入框 2.重要参数 中英文对照着看…

JSONNode树形解析或流式解析

哈喽,大家好,我是木头左! 什么是JSONNode? JSONNode是一个用于处理JSON数据的数据结构,它提供了一种简单、灵活、高效的方式来操作JSON数据。JSONNode可以看作是一个树形结构,其中每个节点都可以包含一个值…

MongoDB自学笔记(四)

一、前文回顾 上一篇文章中我们学习了MongoDB中的更新方法&#xff0c;也学了一部分操作符。今天我们将学习最后一个操作“删除”。 二、删除 原始数据如下&#xff1a; 1、deleteOne 语法&#xff1a;db.collection.deleteOne(< query >,< options >) 具体参…

OpenCV 像素操作—证件照换底色详细原理 C++纯手写实现

文章目录 总体步骤1.RGB转HSV2.找出要换的底色3.取反&#xff0c;黑白颠倒4.将原图像的非背景部分复制到新背景上 完整代码1.C纯手写版2.官方API版本 总体步骤 1.RGB转HSV 为什么一定要转为HSV 颜色空间&#xff1f; 将图像从BGR颜色空间转换为HSV颜色空间是因为HSV颜色空间更…

vscode 文件颜色变绿色

解决&#xff1a;关闭git功能 在设置中搜索Git:Enabled&#xff0c;取消Decorations: Enabled的勾选

内网渗透隧道构建,使用github项目联动msf绕uac,使用简单的spp来进行操作icmp隧道

在我们需要木马上线的时候&#xff0c;发现上线不了&#xff0c;我们一般就想到建立隧道&#xff0c;来解决问题&#xff0c;或者是说我们直接还一种连接的操作来进行上线。比如说我们正向连接上不了&#xff0c;我们可以还成反向连接的操作。或者我们使用隧道直接硬刚waf来进行…