Web地图服务规范之栅格瓦片地图服务:WMTS(WebMapTileService,网络地图瓦片服务)、TMS(TileMapService,瓦片地图服务)和XYZ

一、什么是栅格瓦片地图服务

这四种地图服务都是通过网络传输的栅格瓦片地图服务,这里有三个名词需要解释:

1、什么是栅格?

遥感影像、Dem等,就是图片。

2、什么是地图服务?

实际上,地图服务就是一个url,且这个url满足一定条件:基于这个url拼上固定参数或路由地址可以获取地图服务的元数据信息(返回结果是xml或者json);也能获得栅格瓦片地图服务的瓦片,其实就是图片。
以天地图的wmts服务为例,一般我们使用时只需要“http://t0.tianditu.gov.cn/vec_c/wmts?tk=您的密钥”这个url即可,但是通过这个url拼上固定参数即可获得这个地图服务的元数据信息:http://t0.tianditu.gov.cn/img_w/wmts?request=GetCapabilities&service=wmts,也可以获得地图瓦片:http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}
为什么查询元数据信息的时候要拼上“request=GetCapabilities&service=wmts”参数而获取地图瓦片的时候要拼上”SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}&tk=您的密钥“参数,这是OGC的规定(关于OGC,后文会有详细解释),其实就是大家约定俗称的一种规则,所有的wmts服务都要满足:查元数据信息的时候就使用”request=GetCapabilities&service=wmts“,获取地图瓦片的时候就使用”SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}“,当然你也可以使用不同的参数名但是实现相同的功能,但是地图引擎时加载不了的(别人实现的是OGC的规则,不是你自己定义的规则),除非你自己改源码。
同理,xyz、tms也是一样的。

二、什么是瓦片?为什么使用栅格瓦片地图服务?

瓦片这个词其实源自于遥感影像处理或图像处理的瓦片金字塔,熟悉Arcgis的人应该会知道,当使用Arcgis打开遥感影像数据时,软件会询问你是否构建影像金字塔,那为什么要构建影像金字塔呢?要回答这个问题,首先要理解什么是影像金字塔。影像金字塔实际上就是将影像数据分层分块,比如我将一个1tb的影像数据分为5层,第一层把原始数据分成一块,这里的块就是瓦片,其实就是图片,只用一张图片表示整个影像数据,但是这张图片的分辨率远低于原始数据;第二层把原始数据分为4块,用四张图片表示整个影像数据,这4张图片的分辨率高于第一层的分辨率但是还是低于原始数据的分辨率;第二层把原始数据分为16块,用16张图片表示整个影像数据,这16张图片的分辨率高于第2层的分辨率但是还是低于原始数据的分辨率…依次类推,直至到第五层,此时将原始影像分为1024块,所有块组合到一起表示整个影像数据,此时这些块的分辨率和原始影像分辨率一致。
![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/b1da747f92aa473fa810f86db07a5d29.png
在这里插入图片描述
下面让我们回到之前的问题,为什么构建影像金字塔,如果不构建影像金字塔,什么样配置的电脑可以直接显示1tb的影像数据?通过构建影像金字塔,我们得到了分层分块的影像数据集,这个时候再加载影像数据的时候,我们也可以分层分块加载,比如我们总览这个影像数据的时候,可以只加载第一层的数据,前文说到它的分辨率远低于原始数据,但是当你总览的时候,实际上你也看不清影像数据的细节的,所以此时的低分辨率是没有影响的;当你缩放时,即加载更高层级的相应块的影像数据,即可看到更高分辨率的影像数据,直至达到最高分辨率,但是当你达到最高分辨率时,你的观察区域肯定也是很小的,即你同时加载的最高层级的影像块的数量是很少的,这样就能流畅显示这个影像数据。
实际上,这也是栅格瓦片地图服务的原理,因为浏览器的显示能力远不如桌面端的软件,桌面端软件都不能直接显示1tb的影像数据,何况浏览器了,但是通过瓦片(影像)金字塔技术,预先在服务器上生成瓦片金字塔,可以轻松的显示整个影像数据。(这是使用栅格瓦片地图服务的原因之一)。
这种分层分块思想不仅仅用于栅格瓦片地图服务,在mapbox的矢量瓦片、cesium的terrain服务和3dtiles服务、unreal和unity的HLOD等等,都使用了这种思想。
其实在栅格瓦片地图服务(tms和wmts)之前,为了解决影像数据的显示,大家使用的都是WMS服务(Web Map Service),在前端渲染地图时,会把当前显示的地理范围传递给服务器,然后服务器去影像数据上搜索这个范围并导出为合适分辨率的图片,然后返回给前端进行显示,但是这种策略耗时不稳定,有时长有时短,因而促生了栅格瓦片地图服务。(使用栅格瓦片地图服务的另一个原因)。

三、为什么有三种栅格瓦片地图服务?

正如前文所述,wmts是OGC定义的地图服务标准,tms是OSGeo定义的。
1)OGC中文名为开放地理空间信息联盟,这个组织就和前端的W3C一样,是一个标准制定组织。它定义了wmts、wfs、wms、3dtiles等等地图服务标准,其官网地址:https://www.ogc.org/
OGC的wmts服务标准地址:https://www.ogc.org/standard/wmts/ (我的评价是:垃圾,贼难看,不如百度看网页博客)
2)OSGeo中文名为开源空间信息基金会,是一个全球性非营利性组织,目标是支持全球性的合作,建立和推广高品质的空间信息开源软件。GIS领域的许多知名软件和库比如:GDAL、PostGIS、QGIS等等都是这个组织搞出来的,其官网地址:https://www.osgeo.org/,那为啥它要定义一个tms呢,因为当年还没有wmts,其实就和前端一样,某个特性或者”标准“大家已经约定俗成了,但是标准制定组织还没想好怎么定义呢或者还没纳入它的标准中呢,标准指定组织落后了拖后腿,那你没有我就自己定义了,当你定义的栅格瓦片地图服务标准wmts出现以后,我的标准tms已经广为流传了,就导致了今天的局面:tms和wmts并存。
OSGeo的tms服务标准地址:https://wiki.osgeo.org/wiki/Tile_Map_Service_Specification (哎呦,不错哦)
3)XYZ并不是某个组织定义的,而是大家约定俗成的一种风格,像wmts和tms,它们不仅仅提供了地图瓦片,同时还提供元数据信息等查询服务,但XYZ不是,它只提供地图瓦片,实际上把wmts的地图瓦片文件拷贝到任何一台服务器上,按照XYZ风格给出地图瓦片的地址,这就是一个XYZ风格的地图瓦片服务;把TMS的地图瓦片拷贝到任何一台服务器上,按照XYZ风格给出地图瓦片的地址,这也是一个XYZ风格的地图瓦片服务。

四、异同点

1、相同点

1)瓦片尺寸相同

实际上,WMTS定义的瓦片尺寸是矩形,TMS定义的是正方形,但是绝大多数的瓦片尺寸都是256x256,少数是512x512,我没见过不是正方形的瓦片,我觉得这也是一种约定俗成的标准:无论哪种栅格瓦片地图服务都使用正方形瓦片。原因(来自ChatGPT):
在这里插入图片描述

2)两者的地图切片原理是相同的(都是瓦片金字塔),下面介绍两种地图切片方案:

a)WGS84(4326,经纬度坐标系)方案(把4490带入也是一样的)

坐标范围:经度[-180,180],纬度[-90,90]
切片方式:在地理坐标系中,瓦片是根据经纬度划分的,每个瓦片代表一个经度范围和纬度范围,即一个矩形区域(正方形是特殊的矩形)。按照四叉树分割:第一层:切分为两个瓦片,经度范围为[-180,0]、经度范围为[-90,90]和经度范围为[0,180]、纬度范围为[-90,90];第二层:把第一层的瓦片再进行切分成八块,以此类推。

b)Web-Mercator(3857,投影坐标系)方案

坐标范围:3857 坐标系中的平面直角坐标范围是 x : [-20037508.34 , 20037508.34],y : [-20037508.34 , 20037508.34],对应的经纬度范围:经度[-180°,180°],纬度[-85.051129°, 85.051129°]。可以看到这种投影方案并没有覆盖全球区域,这样设置有两个好处:1、避免将极点投影到无穷远,2、将整个投影地图变为正方形
切片方式:在Web墨卡托投影中,瓦片是根据平面直角坐标系划分的。同样是采用四叉树分割:第一层:切分为一个瓦片,x范围为 [-20037508.34 , 20037508.34],y范围为 [-20037508.34 , 20037508.34];第二层:在第一层的基础上切分为四块,以此类推。
这里多说一点,天地图的经纬度的栅格瓦片地图服务的坐标系是4490的,但是很多时候我们都会听到说:啊,4490和4326差不多,可以按照4326加载。可这是为什么呢?原因就是两者的切片方式和坐标范围是一样的,所以能加载4326的地图引擎一般都能加载4490(Cesium不行,是因为它加载的时候判断元数据信息中坐标系是不是4326或者3857,不然不给你加载,自己改源码一样可以加载);但是为什么又说差不多呢,4490和4326的参考椭球体的扁率有所差别,我们使用的地图引擎的地图引擎的扁率都是按照4326指定的,如果你使用4490的瓦片,肯定会有偏差(设想一下:你有个单位立方体,把它的表面贴图扒下来贴在一个长宽高为0.9999999的立方体上,你说能不能贴上去,贴肯定能贴,但是和原来的肯定不一样)。

3)格式

png或jpeg

2、不同点

1)协议

XYZ、TMS是Restful风格的,而WMTS可以有三种:KVP、SOAP、Restful。
KVP:key-value-pair,查询字符串风格,例如:http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}
SOAP:简单对象访问协议,以xml作为数据传送的格式(没人用了)。
Restful就不说了。

2)原点和轴向

TMS:原点在左下角,Y轴自下向上,X轴自左向右
WMTS:原点在左上角,Y轴自上向下,X轴自左向右
XYZ:原点不固定(可能在左上角也可能在左下角),Y轴方向不固定(取决于原点位置,可能自下而上,也可能自上而下),X轴自左向右

3)url模板

WMTS:http://t0.tianditu.gov.cn/img_w/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=img&STYLE=default&TILEMATRIXSET=w&FORMAT=tiles&TILEMATRIX={z}&TILEROW={y}&TILECOL={x}
其中,TileMatrixSet代表坐标系,TileMatrix代表瓦片层级,TileRow和TileCol代表瓦片在TileMatrix层级下的行列号
TMS:https://tile.openstreetmap.org/{z}/{x}/{y}.png
其中,{z}代表瓦片层级,{x}{y}代表瓦片在z层级下的位置
XYZ:https://ip:port/{z}/{x}/{y}.png
其中,{z}代表瓦片层级,{x}{y}代表瓦片在z层级下的位置

4)元数据

WMTS:GetCapabilities接口,用于获取元数据
TMS:一般来说,TMS的地址会指向一个名称是tilemapresource.xml的文档
XYZ:无

5)要素查询

WMTS:GetFeatureInfo接口,用于获取要素位置及属性信息。
TMS:无
XYZ:无

五、个人观点

个人认为这三种地图服务的主要的不同点就是瓦片编号的方案不同,主要有以下几种流派:
1)谷歌XYZ:Z表示缩放层级,Z=zoom;XY的原点在左上角,X从左向右,Y从上向下。
2)TMS:Z的定义与谷歌相同;XY的原点在左下角,X从左向右,Y从下向上。
3)QuadTree:微软Bing地图使用的编码规范,Z的定义与谷歌相同,同一层级的瓦片不用XY两个维度表示, 而只用一个整数表示,该整数服从四叉树编码规则。(别人都是y轴方向不同,就它特殊,呸)
4)百度XYZ:Z从1开始,在最高级就把地图分为四块瓦片;XY的原点在经度为0纬度位0的位置,X从左向右,Y从下向上。
5)天地图4490的WMTS服务:Z从1开始。(但是它的web墨卡托的wmts服务的Z是从0开始的)

六、各种标准的地图厂商

1)xyz:osm、mapbox、google maps
2)tms:osm、mapserver、mapnik
3)wmts:arcgis online、osm、google maps

参考资料:

1、Web地图服务规范(WMS、WMTS、TMS)简析
2、几种互联网地图服务背后的解读(WMS,WFS,WMTS,TMS)
3、TMS, XYZ & WMTS的不同
4、WMTS以及TMS地图切片方案详述和比对
5、WMS、WFS、WCS、WPS、WMTS、WMSC、TMS等常见地图服务的区别
6、WMTS服务及地图瓦片原理
7、TMS和WMTS大概对比
8、OGC WebGIS 常用服务标准(WMS/WMTS/TMS/WFS)速查
9、OGC标准WMTS服务概念与地图商的瓦片编号流派-web地图切片加载
如有不足之处,欢迎大家批评指正。

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

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

相关文章

如何在jmeter中把响应中的数据提取出来并引用

jmeter做接口测试过程中,经常遇到请求需要用到token的时候,我们可以把返回token的接口用后置处理器提取出来,但是在这种情况下,只能适用于当前的线程组,其他线程组无法引用到提取的token变量值,所以必须要生…

windows ubuntu子系统,单细胞篇 1.cellranger安装与分析

这几天,我将单细胞测序在windows ubuntu子系统中跑了一遍,将过程分享給大家。 单细胞测序conda create -n 10xdb #创建环境 conda activate 10xdbconda install -c bioconda cellranger -y #失败,可能源中没有 wget -O cellranger-7.…

使用深度学习集成模型进行乳腺癌组织病理学图像分类

基于预训练的VGG16和VGG19架构训练了四种不同的模型(即完全训练的 VGG16、微调的 VGG16、完全训练的 VGG19 和微调的 VGG19 模型)。最初,我们对所有单独的模型进行了5倍交叉验证操作。然后,我们采用集成策略,取预测概率…

说说你对链表的理解?常见的操作有哪些?

一、是什么 链表(Linked List)是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的,由一系列结点(链表中每一个元素称为结点)组成 每个结点包括两个部分&…

如何编写易于访问的技术文档 - 最佳实践与示例

当你为项目或工具编写技术文档时,你会希望它易于访问。这意味着它将为全球网络上的多样化受众提供服务并可用。 网络无障碍旨在使任何人都能访问网络内容。设计师、开发人员和撰写人员有共同的无障碍最佳实践。本文将涵盖一些创建技术内容的最佳实践。 &#xff0…

JS-30-async函数

上一节说,JavaScript异步操作需要通过Promise实现,一个Promise对象在操作网络时是异步的,等到返回后再调用回调函数,执行正确就调用then(),执行错误就调用catch()。 虽然异步实现了,不会让用户感觉到页面“…

07 SQL进阶 -- 集合运算 -- 表的加减法

1. 表的加减法 1.1 什么是集合运算 集合在数学领域表示“各种各样的事物的总和”, 在数据库领域表示记录的集合. 具体来说,表、视图和查询的执行结果都是记录的集合, 其中的元素为表或者查询结果中的每一行。 在标准 SQL 中, 分别对检索结果使用 UNION, INTERSECT, EXCEPT 来…

【企业场景】设计模式重点解析

设计模式 在平时的开发中,涉及到设计模式的有两块内容: 我们平时使用的框架(比如spring、mybatis等)我们自己开发业务使用的设计模式。 在平时的业务开发中,其实真正使用设计模式的场景并不多,虽然设计号…

OpenHarmony实战开发-MpChart图表实现案例。

介绍 MpChart是一个包含各种类型图表的图表库,主要用于业务数据汇总,例如销售数据走势图,股价走势图等场景中使用,方便开发者快速实现图表UI。本示例主要介绍如何使用三方库MpChart实现柱状图UI效果。如堆叠数据类型显示&#xf…

C#基础|数据类型、变量

哈喽,你好啊,我是雷工! 01 数据类型 数据类型是为了方便存储数据的,为了将数据按照不同的分类存储,所以引入数据类型。这个在PLC中已经很熟悉了。 数据类型的作用:就是为了更好地管理内存,为…

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记13:RTC实时时钟

系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…

基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析

原文链接:基于Python长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析、生物量估算与趋势分析https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601336&idx4&sn143be5669da8ad336a455a4cca3d4b6a&chksmfa820d5fcdf584491…

【机器学习】机器学习创建算法第6篇:线性回归,学习目标【附代码文档】

机器学习(算法篇)完整教程(附代码资料)主要内容讲述:机器学习算法课程定位、目标,K-近邻算法定位,目标,学习目标,1 什么是K-近邻算法,1 Scikit-learn工具介绍,2 K-近邻算法API。K-近邻算法,1.4 …

【七 (1)指标体系建设-构建高效的故障管理指标体系】

目录 文章导航一、故障概述1、故障:2、故障管理: 二、指标体系概述1、指标2、指标体系 三、指标体系构建难点1、管理视角2、业务视角3、技术视角 四、指标体系构建原则1、与战略目标对齐2、综合和平衡3、数据可获得性4、可操作性5、具体和可衡量6、参与和…

lua学习笔记20(lua中一些自带库的学习)

print("*****************************lua中一些自带库的学习*******************************") print("*************时间***************") --系统时间 print(os.time()) --自己传入参数得到时间 print(os.time({year2011,month4,day5})) --os.data(&qu…

00 【哈工大_操作系统】Bochs 汇编级调试方法及指令

本文将介绍一下哈工大李治军老师《操作系统》课程在完成Lab时所使用到的 Bochs 调试工具的使用方法。这是一款汇编级调试工具,打开调试模式非常简单,只需在终端下输入如下指令: 1、bochs 调试基本指令大全 功能指令举例在某物理地址设置断点…

Xxl-job执行器自动注册不上的问题

今天新建的项目要部署xxl-job,之前部署过好多次,最近没怎么部署,生疏了。部署完之后,服务一直没有注册到执行器管理里面,找了半天也没找到原因,看数据库里的xxl_job_registry表也是一直有数据进来。 后来看…

小白也能看懂的BEV感知(一)

1. 引言 随着人工智能技术的不断发展,自动驾驶越来越多地出现在我们的视野中,智能化和电动化已经成为汽车行业的主旋律。无论是从研究的角度还是从工程的角度来看,它都像是一个巨大的宝藏,等待着我们去探索。本文将介绍这一技术的…

从51到ARM裸机开发实验(009)LPC2138 中断实验

一、场景设计 中断的概念在《从51到ARM裸机开发实验(007) AT89C51 中断实验》中已经介绍过,LPC2138的Keil工程创建在《从51到ARM裸机开发实验(005)LPC2138 GPIO实验》中已经介绍过。本次使用LPC2138来实现一个这样的场景:四个LED依次亮灭,时间…

测试人必看,小程序常见问题

小程序是一种轻盈的存在,用户无需为了使用它而下载和安装。它依附于微信这个强大的平台,只需轻轻一扫或一搜,它便跃然屏上,随时服务。小程序为我们带来更多前所未有的惊喜和便利,以下分享关于小程序相关的热门问题。 …