一、矢量瓦片的基本原理和相关格式
现阶段,电子地图瓦片主要使用两种方式,一种是传统的栅格瓦片,另外一种是新出的矢量瓦片(Vector Tiles),前者是采用四叉树金字塔模型的分级方式,将地图切割成无数大小相等的矩形栅格图片,由这些矩形栅格图片按照一定规则拼接成不同层级的地图显示。
矢量瓦片类似栅格瓦片,是将矢量数据用多层次模型分割成矢量要素描述文件存储在服务器端,再到客户端根据指定样式进行渲染绘制地图,在单个矢量瓦片上存储着投影于一个矩形区域内的几何信息和属性信息。当客户端通过分布式网络获取矢量瓦片、地图标注字体、图标、样式文件等数据后,最终在客户端进行渲染输出地图。
矢量瓦片没有统一数据标注,mapbox基于Google protocol buffers制定了MAPBOX CECTOR TILE SPECIFICATION通用的矢量瓦片数据标准,被许多公司和组织采用。
矢量瓦片数据组织分成两层,一层是地图表达范围内的瓦片数据集组织模型,另一层是单个瓦片内要素的组织模型。
矢量瓦片数据集的组织模型类似栅格瓦片金字塔模型,包含坐标系、投影方式、瓦片编号已实现任意精度、空间位置与矢量瓦片的对应关系,并被栅格瓦片规范相互兼容,这样方便将矢量瓦片转换成栅格瓦片,毕竟两者采用相似的投影方式和瓦片编号方式。
单个瓦片要素的组织模型将几何信息和属性信息分开存储,几何信息主要包括点、线、面和未知要素类,元数据信息包含了图层属性和要素属性。
用于描述矢量瓦片属性信息和几何信息的文件格式主要有GML/Cesium Vector Tiles/GeoJson(.json)/TopoJSON(.topjson)/Google Protocol Buffers(PBF),其中GeoJSON是一种基于Javascript对象表示法的地理空间信息数据交换格式,通用性强,易读取,几乎所有的GIS引擎都支持该格式的动态渲染电子地图数据,但该格式还是容易有信息冗余的情况。TopoJSON是在GeoJSON上共享几何要素拓扑编码,减少冗余信息的数据格式,但它的读取性较差,支持该格式的软件不多,所有每次读取需要使用专门的工具进行转换才可以,支持该格式的软件有著名的Web三维软件Cesium JS(该产品是有AGI公司开发的一款开源三维地图的JS库,主要是可以用于时空数据领域的一些三维开发,它在github上已经有6.2K个star了,github地址如下:https://github.com/CesiumGS/cesium),PBF是一种更高效轻便的结构化数据存储格式,将矢量瓦片数据打包成矢量瓦片包可以便于网络传输和数据库存储,常见的矢量瓦片有VTPK格式(用于ArcGIS)、MBTiles格式(用于SQLite数据库存储)等。
虽然矢量瓦片也采用金字塔的方式进行存储数据,但是由于其默认网格数较高,以PBF为例,单个矢量瓦片的网格是4096*4096,所以在视网膜屏等设备上也显示地很清楚,而不会出现锯齿,同时这个网格数可以随时进行修改调整,以更精确的方式来记录几何位置信息从而适应不同屏幕的要求。同时,在矢量瓦片中,会将其几何信息转换成指令集表达,再将指令存储到32位无符号整数进行存储。而在存储属性信息是,则是以不同的是表示,geojson直接标注,PBF则是用索引号进行标注。
矢量瓦片之所以能够在客户端进行快速渲染,主要得益于客户端图形渲染技术的发展,推动了地图渲染引擎的快速发展,常见的图形渲染技术有OpenGL/WebGL等,而OpenGL和WebGL是底层3D绘图技术标注,根据这些标准衍生出了许多地图渲染引擎,例如使用OpenGL 图形API的开源3D渲染引擎Tangram(包括用于浏览器渲染引擎Tangram-JS和移动终端渲染引擎Tangram-ES,该产品有mapzen开源提供,github地址为https://github.com/tangrams/tangram,具有1.7K个star)、Mapbox使用的Mapbox GL地图渲染引擎(包含浏览器渲染引擎Mapbox GL JS和移动端渲染引擎Mapbox GL Native,github地址为https://github.com/mapbox/mapbox-gl-js,具有6.4k个star)。
矢量瓦片所使用的样式文件是用来在客户端定义绘制地图数据源、绘制顺序和绘制样式等规则的文件,比如Mapbox使用的json样式文件可以让用户利用Mapbox GL JS地图引擎实时渲染出互动性强的3D场景地图。
二、矢量瓦片和栅格瓦片的优劣势
使用矢量瓦片地图来提供地图比栅格瓦片地图由更好的显示效果,互动性也强,实现二三维一体化,更新速度快,地图样式快速切换,占用空间少,无极缩放显示等特点。
其中占用空间少是和栅格瓦片进行的对比,传统的栅格瓦片每一张瓦片大小在十几KB左右,虽然看上去每张瓦片的大小不大,但是若放到全国或世界范围内来看的,需要的瓦片数据量极大,按照四叉树金字塔切割的栅格瓦片的上一级的某张瓦片可以切割成下一级的四张瓦片,因此,瓦片的总量也是极快的增加,甚至最终所需存储空间可以达到TB级别,而矢量瓦片就相对小很对,以全国数据的切图来看,最终所需的切图所需存储空间也仅需要GB级别的就可以了。同时,由于矢量瓦片的渲染是在客户端进行的,它仅需要将请求到的数据按照样式文件进行渲染即可,这让矢量瓦片在不改变切图比例与地图内容的情况下,可以很快的调整地图样式,而不用为调整地图样式而重新进行切图,并且矢量瓦片和栅格瓦片虽然都需要对矢量数据进行切图预处理,但实际上由于矢量瓦片切图仅是针对几何信息和属性信息进行分层处理,所以它相对于栅格瓦片需要对图像分割来说速度要快很对,全国数据的栅格切图工作基本上是以周为单位的处理,而矢量瓦片可能仅需几天时间,这对于某些需要快速处理的项目来说具有先天优势,简单的将矢量瓦片和栅格瓦片的优劣势进行比较后,可以得到以下表格内容:
优势劣势
矢量瓦片瓦片占用空间低,瓦片切图效率高,渲染地图效果快,可以随时动态调整地图样式,地图分辨率高。对客户端性能要求比较高,对旧设备兼容性存在问题。
栅格瓦片瓦片提前渲染,对客户端性能要求低,性能稳定。瓦片占用空间高,瓦片切图效率低,无法随时动态调整地图样式,地图分辨率低,加载速度比较慢。
鉴于矢量瓦片的优势以及各方面的考虑,现在大部分互联网地图服务提供商都开始在其网站上提供的地图服务换成矢量瓦片进行地图展示,这里面就包括百度地图、高德地图、腾讯地图、谷歌地图等,但是依然会有不少互联网地图服务提供商依据在提供栅格瓦片地图,这里有搜狗地图、Bing Map、天地图·北京等。(以上信息是截止本次文章撰写时统计的,不排除后来存在变动。)
三、矢量瓦片切片的主要技术流程
虽有现在矢量瓦片已经逐步成为一张地图瓦片的主流方式,但是各大厂商的切片工具和运行环境却还是各不相同,常用的矢量瓦片切片工具有Mapbox的Mapbox Studio和Tippecanoe(前者需要访问Mapbox的在线服务,后者为Mapbox的开源产品)、OGC的开源产品GeoServer、Esri的ArcGIS Pro、Osgeo的开源产品MapServer等,这些工具都可以对矢量数据按照矢量瓦片要求进行切图,虽然这些工具不一致,但它们都需要遵循矢量四叉书金字塔模型的原理,将矢量数据发布成各自格式的矢量瓦片数据包,同时,它们的主要技术方法是一致,基本按照以下流程进行:
①获取矢量数据;
1.1、获取矢量文件(.shp/.tab等);
1.2、矢量数据入库形成矢量数据表格;
②矢量瓦片制作;
2.1、获取切图范围、切图方式、切图等级等信息,确保切片后能满足使用;
2.2、获取多层矢量瓦片数据表;
2.3、将矢量瓦片文件(Geojson/Topojson/PBF等)放入到不同图层下;
③服务发布与展示
3.1、以服务的形式将矢量瓦片发布出来,并提供给客户端;
3.2、客户端按照一定调用规则调用矢量瓦片服务,并按照样式文件进行前端渲染展示。
基本上大部分的切片工具都是按照这一流程对矢量数据进行的切片工作,即使是不同的厂商和切片工具,只需要按照类似过程进行处理即可完成切片工作,另外在2018年,OGC也参与到矢量瓦片这一技术的研究中,验证了相关信息, 并形成了相关报告,详见https://www.ogc.org/projects/initiatives/vt-pilot-2018。
另外,不同切片工具按照不同的切片方案产生的矢量瓦片数据占用存储大小也不一致,主要原因是在于其保留的矢量瓦片的属性信息不同导致的,在瓦片几何信息一致的情况下,切片方案内制定的矢量瓦片属性信息规则不一样,其最终产生的矢量瓦片规则也会存在差异,这种差异最终影响的不仅仅是矢量瓦片占用的存储空间,也会影响切片工具在进行切图工作所需要耗费的时间上,例如ArcGIS Pro在进行切片是会按照一定抽稀策略来对矢量数据的属性信息进行抽稀,仅保留有用的属性信息,而使用GeoServer的切片工具则会保留全部的属性信息,这就导致两种最终切片的存储空间的巨大差异,例如一个城市的地图,用ArcGIS Pro切片会有几百MB的矢量瓦片包,而用GeoServer则会需要几百GB的矢量瓦片包,因此在使用不同切片工具生产矢量瓦片的时候需要考虑到这些内容。
四、跨平台调用矢量瓦片数据
由于矢量瓦片没有统一标准,因此我们在互联网上常见的使用矢量瓦片的互联网地图在制作矢量瓦片的时候只需要遵循矢量四叉树金字塔模型的原理即可,因此,高德地图、百度地图等互联网地图提供商在使用矢量瓦片的时候纷纷按照自己的矢量瓦片原则进行地图切片,这就导致了你在使用它的地图瓦片时,必须按照它制定的规则进行渲染才能将地图显示出来,那么不同切图工具切出来的矢量瓦片是否够相互调用了,答案是肯定的,但是你在调用它的瓦片时还是需要遵守它的切图规则来进行。
跨平台调用的时候,可以通过架设一套微服务来将请求的矢量瓦片数据规格转成被请求的矢量瓦片数据规格,通过微服务将客户端的请求进行重新编码后发送至服务器端进行请求,再将服务器端的返回的数据按照客户端的请求规格再次进行编码后返回给客户端进行渲染展现。
具体如何实现跨越参考不同平台的的开发文档进行设置,这里就不在细聊了,再聊下去就不是常识了。
另外附上一些可以参考的开发文档的访问链接:
①GeoServer开发文档:https://docs.geoserver.org/
②MapServer开发文档:https://www.osgeo.cn/mapserver/documentation.html
③tippecanoe开发文档:https://github.com/mapbox/tippecanoe
④Mapbox GL JS开发文档:https://docs.mapbox.com/mapbox-gl-js/api/
⑤Mapbox Vector Tiles API 开发文档:https://docs.mapbox.com/api/maps/#vector-tiles
⑥ArcGIS Pro快速入门教程:https://pro.arcgis.com/zh-cn/pro-app/get-started/introducing-arcgis-pro.htm
⑦Cesium开发手册:https://cesium.com/docs/
原文地址:
聊一聊矢量瓦片的常识 - JackSirius的文章 - 知乎
https://zhuanlan.zhihu.com/p/272203128