一、什么是栅格瓦片地图服务
这四种地图服务都是通过网络传输的栅格瓦片地图服务,这里有三个名词需要解释:
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地图切片加载
如有不足之处,欢迎大家批评指正。