一、矢量瓦片的基本原理和相关格式

现阶段,电子地图瓦片主要使用两种方式,一种是传统的栅格瓦片,另外一种是新出的矢量瓦片(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/

参考文献:

[1]胡振彪, 赵军, 韩磊,等. 矢量电子地图瓦片制作性能评估与应用[J]. 测绘科学, 2020, v.45;No.260(02):142-148+169.

[2]翁世杰, 朱雪坚, 黄婷,等. 基于Mapbox矢量切片在线配图平台的设计与实现[J]. 地理信息世界, 2018, v.25;No.130(04):72-76.

[3]陈举平,丁建勋.矢量瓦片地图关键技术研究[J].地理空间信息,2017,15(08):44-47+10.

[4]ESCAGE.【GISER && Painter】矢量切片(Vector tile)[EB/OL].https://www.cnblogs.com/escage/p/6387529.html,2017-02-13.

delphi bmp绘制矢量文件效率慢_聊一聊矢量瓦片的常识相关推荐

  1. 【利用Arcpy快速检索矢量文件和栅格文件并进行统计和删除工作】

    这里写目录标题 场景分析 解决思路和方法 解决思路 代码 拓展的知识及应用分析 快速获取文件夹中的所有矢量文件和栅格文件名称 矢量文件 栅格文件 快速数据库中的矢量文件和栅格文件名称 快速读取每个矢量 ...

  2. ArcGIS小知识(十)——ArcMap新建并绘制矢量文件(shp和gdb数据库格式)

    写一个arcgis中最基础的操作--新建矢量:包括.shp文件和数据库gdb文件 前言 如果完全的新手,安装arcgis可以参考百度经验.安装的教程有很多,就不单独写了. 1.打开arcgis,我用的 ...

  3. eps倾斜摄影矢量化采集毕业设计_干货 | 6款倾斜摄影裸眼3D采集软件推荐给大家...

    原标题:干货 | 6款倾斜摄影裸眼3D采集软件推荐给大家 导读: 作为国际测绘领域一项高新技术,倾斜摄影测量因其能快速.高效获取地面高分辨率.高重叠度及全视角的影像数据信息,近年来测绘领域对其进行诸多 ...

  4. 超图桌面版打开外部矢量文件

    可以打开两种类型的外部矢量文件: SDX For Files:*.shp.*.mif.*.tab.*.dwg.*.dxf.*.dgn.*.kml.*.kmz.*.gml.*.wal.*.wan.*.w ...

  5. 图片重命名,命名方式为:文件夹名字 + _ 顺序 + .jpg

    图片重命名,命名方式为:文件夹名字 + _ 顺序 + .jpg import ospath = "C:/Users/123/Desktop/111/"i = 1 j = 1 for ...

  6. xsd文件转图片_图片转换成PDF格式怎么转?图片转换成PDF的软件哪个好?

    图片转换成PDF格式怎么转?经验丰富的设计师在完成图片格式的设计作品后都会将图片转成PDF格式文件,这样方便保存以及参加一些设计比赛.同时我们在保存大量图片的时候也可以将图片转换成PDF文件.但是还有 ...

  7. Delphi从Internet下载文件

    Delphi从Internet下载文件 今天在做拍卖系统的时候,因考虑到网络状况问题,需要将拍品所有信息下载到本机,包括拍品图片,因此需要实现从Internet下载文件的功能.       下面是代码 ...

  8. 一键清除Delphi中无用的文件

    delphi确实好用,但它生成的各种文件,有时对我们来说基本没用,随着我们做的项目越来越多,其中无用的文件有时能占到三分之一.今晚写了个小工具,可以递归清理 delphi文件夹下无用的文件. 代码如下 ...

  9. Python绘制PDF文件~超简单的小程序

    Python绘制PDF文件 项目简介 这次项目很简单,本次项目课,代码不超过40行,主要是使用 urllib和reportlab模块,来生成一个pdf文件. reportlab官方文档 http:// ...

最新文章

  1. 科学解释超级计算机,超级计算机:彻底“改变”科学
  2. 如何订阅Form的自定义事件
  3. 纯数学教程 Page 203 例XLI (1)
  4. JB的测试之旅-上传的mp3文件播放不了
  5. android表格布局最后一个组件,Android布局之TableLayout表格布局
  6. 汇编:ZF(zero flag)标志位
  7. python求corr_Python dataframe 算相关系数用corr(),算不出结果
  8. maven引用servlet_解决Maven 项目报错 java.httpservlet和synchronized使用方法
  9. WinUSB Component for .Net WinForm
  10. 关于Matlab的MEX技术 10分钟教会你简单的matlab和C/C++混合编程(mex文件)
  11. TMS320C64x DSP L1 L2 Cache架构(1)——C64x Cache Architecture
  12. 分析11年21部漫威电影,一览导演、主演、口碑票房最佳......
  13. VproC#混合编程,加载图片
  14. OS - 浅谈操作系统的内存管理
  15. 关于pip 下载从清华源或者豆瓣源下载的命令总结
  16. 安卓APP安装兼容性[应用是非正式发布版本, 当前设备不支持安装。]
  17. win10系统护眼色,word2016页面显示仍是白色
  18. 我的 Docker 卡死了,怎么办?在线等
  19. cocos2d-x 粒子效果
  20. 易优插件-易优CMS必备插件免费

热门文章

  1. (三)linux之根文件系统的制作
  2. linux查看队列 msg,linux第10天 msg消息队列
  3. distinct返回null报错_C#之集合常用扩展方法与Linq
  4. android 远程桌面连接闪退,远程桌面一点连接就闪退,不能弹出输入账号密码窗口...
  5. python怎样安装模块_python中如何安装模块
  6. linux grub rescue 光盘,Ubuntu9.10用安装光盘如何进入linux rescue方式?
  7. android studio 跨进程,Android IPC机制(三)在Android Studio中使用AIDL实现跨进程方法调用...
  8. iphone怎样关闭副屏_小米新设计专利曝光:“Z”型折叠屏手机
  9. python mockito arg_that_wqingxiao
  10. 创造型模式——抽象工厂模式