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

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

现阶段,电子地图瓦片主要使用两种方式,一种是传统的栅格瓦片,另外一种是新出的矢量瓦片(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、客户端按照一定调用规则调用矢量瓦片服务,并按照样式文件进行前端渲染展示。

b76b58680d5146514fc86ef966987b3b.png

矢量瓦片切片的主要技术流程

基本上大部分的切片工具都是按照这一流程对矢量数据进行的切片工作,即使是不同的厂商和切片工具,只需要按照类似过程进行处理即可完成切片工作,另外在2018年,OGC也参与到矢量瓦片这一技术的研究中,验证了相关信息, 并形成了相关报告,详见https://www.ogc.org/projects/initiatives/vt-pilot-2018 。

另外,不同切片工具按照不同的切片方案产生的矢量瓦片数据占用存储大小也不一致,主要原因是在于其保留的矢量瓦片的属性信息不同导致的,在瓦片几何信息一致的情况下,切片方案内制定的矢量瓦片属性信息规则不一样,其最终产生的矢量瓦片规则也会存在差异,这种差异最终影响的不仅仅是矢量瓦片占用的存储空间,也会影响切片工具在进行切图工作所需要耗费的时间上,例如ArcGIS Pro在进行切片是会按照一定抽稀策略来对矢量数据的属性信息进行抽稀,仅保留有用的属性信息,而使用GeoServer的切片工具则会保留全部的属性信息,这就导致两种最终切片的存储空间的巨大差异,例如一个城市的地图,用ArcGIS Pro切片会有几百MB的矢量瓦片包,而用GeoServer则会需要几百GB的矢量瓦片包,因此在使用不同切片工具生产矢量瓦片的时候需要考虑到这些内容。

四、跨平台调用矢量瓦片数据

由于矢量瓦片没有统一标准,因此我们在互联网上常见的使用矢量瓦片的互联网地图在制作矢量瓦片的时候只需要遵循矢量四叉树金字塔模型的原理即可,因此,高德地图、百度地图等互联网地图提供商在使用矢量瓦片的时候纷纷按照自己的矢量瓦片原则进行地图切片,这就导致了你在使用它的地图瓦片时,必须按照它制定的规则进行渲染才能将地图显示出来,那么不同切图工具切出来的矢量瓦片是否够相互调用了,答案是肯定的,但是你在调用它的瓦片时还是需要遵守它的切图规则来进行。

跨平台调用的时候,可以通过架设一套微服务来将请求的矢量瓦片数据规格转成被请求的矢量瓦片数据规格,通过微服务将客户端的请求进行重新编码后发送至服务器端进行请求,再将服务器端的返回的数据按照客户端的请求规格再次进行编码后返回给客户端进行渲染展现。

05ebf7134f0f1b5eadbd14a8a76e9a37.png

跨平台调用矢量瓦片数据示意图

具体如何实现跨越参考不同平台的的开发文档进行设置,这里就不在细聊了,再聊下去就不是常识了。

另外附上一些可以参考的开发文档的访问链接:

①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.

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

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

相关文章

python生成器与迭代器。

生成器 在python 中一边循环一边计算的机制,叫做生成器(generator)。 通过列表生成式,我们可以直接创建一个列表。但是,收到内存的限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用…

python怎样将list转化成字典_在python 中如何将 list 转化成 dictionary

原标题:在python 中如何将 list 转化成 dictionary 问题1:如何将一个list转化成一个dictionary? 问题描述:比如在python中我有一个如下的list,其中奇数位置对应字典的key,偶数位置为相应的value解决方案: 1…

vscode gcc debug dbg gdb c cpp c++ cuckoo monitor

为什么80%的码农都做不了架构师?>>> 装cygwin 或者mingGW,装gcc工具链,并将cygwin的bin目录加入环境变量PATH中。 ctrlshiftb {// See https://go.microsoft.com/fwlink/?LinkId733558// for the documentation about the tasks…

python爬取知网论文关键词_Python爬虫根据关键词爬取知网论文摘要并保存到数据库中...

由于实验室需要一些语料做研究,语料要求是知网上的论文摘要,但是目前最新版的知网爬起来有些麻烦,所以我利用的是知网的另外一个搜索接口 搜索出来的结果和知网上的结果几乎一样 在这个基础上,我简单看了些网页的结构,…

网页中查看pdf文档

2019独角兽企业重金招聘Python工程师标准>>> 介绍&#xff1a; PDFObject 是一个 JavaScript 库&#xff0c;用来在HTML中动态嵌入 PDF 文档。 实现代码&#xff1a; <script type"text/javascript" src"pdfobject.js"></script>…

python opencv 读取视频流不解码_python + opencv: 解决不能读取视频的问题

博主一开始使用python2.7和Opencv2.4.10来获取摄像头图像&#xff0c;程序如下&#xff1a; cap cv2.VideoCapture(0) ret, frame cap.read()使用这个程序能够打开摄像头并获取图像&#xff0c;一切正常。 接着想使用OpenCv播放视频&#xff0c;按照官方教程只要将VideoCaptu…

jmeter提取mysql返回值_jmeter连接数据库和提取数据库返回值

一、在MySQL命令行中&#xff0c;验证MySQL是否能正常登陆。若不能登陆&#xff0c;则重置MySQL的密码。二、下载mysql-connector-java-5.1.45-bin.jar&#xff0c;将其放入Jmeter安装目录的lib目录下。完成MySQL数据库的驱动。三、右键“线程组”->“配置元件”->“JDBC…

用python画雨滴_Python编程从入门到实践练习(雨滴)

雨滴&#xff1a;寻找一幅雨滴图像&#xff0c;并创建一系列整齐排列的雨滴。让这些雨滴往下落&#xff0c;直到到达屏幕后消失。 先说今天的问题&#xff1a; 1.在更改函数形参时&#xff0c;调用的时候也要修改&#xff0c;否则会出现AttributeError 值得注意的是&#xff1a…

Hive文件格式

Hive有四种文件格式&#xff1a;TextFile&#xff0c;SequenceFile&#xff0c;RCFile&#xff0c;ORC TextFile 默认的格式&#xff0c;文本格式。 SequenceFile 简介 见&#xff1a;http://blog.csdn.net/zengmingen/article/details/52242768 操作 hive (zmgdb)>cre…

learnpythonthehardway下载_Python【十一】:阶段小结

今天来将前一段时间学习的Python的知识系统地梳理一遍&#xff0c;接下来开始实际的编程实践了。 一、Python实验环境搭建 使用Python编程&#xff0c;首先要有一个开发环境&#xff0c;如同C/C上又VS2008家族一样&#xff0c;Linux/MacOS上的部署情况这里不再详述&#xff0c;…

Django 博客教程(三):创建应用和编写数据库模型

创建 django 博客应用 在上一章节中我们创建了 django 博客的工程&#xff0c;并且成功地运行了它。然而这一切都是 django 为我们创建的项目初始内容&#xff0c;django 不可能为我们初始化生成我们需要的博客代码&#xff0c;这些功能性代码都得由我们自己编写。 django 鼓励…

python将16进制字符串转换为整数_Python 16进制与字符串的转换

电脑上装了Python2.7和3.3两个版本&#xff0c;平时运行程序包括在Eclipse里面调试都会使用2.7&#xff0c;但是由于某些原因在cmd命令行中输入python得到的解释器则是3.3, 一直没对此做处理&#xff0c;因为这样可以对两个版本的差异有一个测试&#xff0c;而且虚拟机里面是2.…

华为读取版本exe_关于esrv_svc.exe和SurSvc.exe疑似泄露用户信息的猜测

封面图片来源&#xff1a;https://www.weibo.com/1885454921/GpBhR3vpk?typerepost#_rnd1573301201348抱歉&#xff0c;写网页文章的次数不多&#xff0c;排版没研究过&#xff0c;请原谅。下面是正题&#xff1a;由来&#xff1a;最初是借由火绒的自定义防护规则&#xff0c;…

flask 部署_只需10分钟!就能用Flask,Docker和Jenkins部署机器学习模型

摘要&#xff1a; 一杯茶的功夫部署完成机器学习模型&#xff01;在生产环境中部署机器学习模型是数据工程中经常被忽视的领域。网上的大多数教程/博客都侧重于构建、训练和调整机器学习模型。如果它不能用于实际的预测&#xff0c;那么它又有什么用呢&#xff1f; 接下来了解一…

Hive 导入CSV文件

SerDe 介绍 Hive 使用如下FileFormat 类读写 HDFS files: TextInputFormat/HiveIgnoreKeyTextOutputFormat: 读写普通HDFS文本文件. SequenceFileInputFormat/SequenceFileOutputFormat: 读写SequenceFile格式的HDFS文件. Hive 使用如下SerDe 类(反)序列化数据: MetadataTyp…

腾讯云mysql架构_一个数据库存储架构的独白

本文由云社区发表本文作者&#xff1a;许中清&#xff0c;腾讯云自研数据库CynosDB的分布式存储CynosStore负责人。从事数据库内核开发、数据库产品架构和规划。曾就职于华为&#xff0c;2015年加入腾讯&#xff0c;参与过TBase(PGXZ)、CynosDB等数据库产品研发。专注于关系数据…

groupby索引有效吗_SQL IN 一定走索引吗?

摘要IN 一定走索引吗&#xff1f;那当然了&#xff0c;不走索引还能全部扫描吗&#xff1f;好像之前有看到过什么Exist,IN走不走索引的讨论。但是好像看的太久了&#xff0c;又忘记了。哈哈&#xff0c;如果你也忘记了MySQL中IN是如何查询的&#xff0c;就来复习下吧。问题问题…

推荐系统之 BPR 算法及 Librec的BPR算法实现【1】

【推荐系统之 BPR 算法】 1、关于BPR的论文原文&#xff1a; BPR: Bayesian Personalized Ranking from Implicit Feedback 2、参考1&#xff1a;论文快读 - BPR: Bayesian Personalized Ranking from Implicit Feedback &#xff08;该博主的网站不错&#xff0c;尤其论文快…

ios 筛选_万千网友让quot;低调使用quot;的软件!居然还支持iOS

点击蓝字关注我们昨天的耳朵神器大家感觉怎么样&#xff1f;享受了耳朵今天我们享受一下眼睛~可能很多同学对漫画是情有独钟但是&#xff0c;之前小黑一直介绍的都是安卓端的软件今天要给大家介绍的这款软件是IOS安卓都有终于可以不被IOS的同学吐槽了而且经过测试小黑真的想说一…

CentOS7:JDK1.7.0_80安装

一、安装前检查 执行以下命令&#xff1a; rpm -qa | grep jdk 查看系统是否已经自带openjdk,如果存在 执行以下命令&#xff1a; yum -y remove files files为查出的、系统自带的openjdk相关文件&#xff0c;运行以上命令将相关文件卸载 执行命令 java -version[rootlocalhost…