瓦片地图和矢量地图的优缺点

瓦片地图和矢量地图的优缺点,第1张

    矢量瓦片和栅格瓦片的优劣势漏瞎

​ 使用矢量瓦片地图来提供地图比栅格瓦片地图由更好的显示效果,互动性也强,实现二三维一体化,更新速度快,地图样式快速切换,占用空间少,无极缩放显示等特点。

​ 其中占用空间少是和栅格瓦片进行的对比,传统的栅格瓦片每一张瓦片大小在十几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也参与到矢量瓦片这一技术的研究中,验证了相关信息

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

原文链接 https://github.com/mapbox/vector-tile-spec/tree/master/2.1/

在此文档中, 关于关键词【必须】、【禁止】、【必要的】、【应当】、【不应】、【推荐的】、【可以】与【可选的】的解释, 见 RFC 2119 中的描述。

此文档为矢量瓦片地理数据指定了一种节省空间的编码格式。 它被设计用于浏览器或服务器端应用程序,用于快速呈现或查找特征数据。

矢量瓦片格虚伍猛式使用 Google Protocol Buffers 编码格式. Protocol Buffers是一种与语言无关、与平台橘册无关的可扩展序列化机制。

矢量瓦片文件的扩展名 应该 为 mvt . 例如 vector.mvt .

When serving Vector Tiles the MIME type SHOULD be application/vnd.mapbox-vector-tile .

矢量瓦片表示一个整正方形范围内投影的数据。矢量瓦片 不应 包含关于边界和投影的信息。这个文件格式假定解码器在解码之前就已经知道投影和边界信息。

Web Mercator 是一个投影的参考, the Google tile scheme 是一个常见的范围参考. 它们一起提供了特定地理区域、特定细节级别和路径之间的一对一关系 ,例如https://example.com/17/65535/43602.mvt .

矢量瓦片可以用任何投影和瓦片范围方案来表示数据。

这个规范描述了矢量瓦片的数据结构。 读者应该了解 矢量瓦片的protobuf的数据文档 及其定义的结构。

矢量瓦片由一组命名的层组成。每一层包含地理特征和它的元数据。层格式的设计使一层所需的数据在内存中是连续的,因此层可以添加到矢量瓦片中而不需要修改现有的数据。

一个实例瓦片 应该 至少包含一层。一层 应该 至少包含一个特征。

必须 包含 version 字段,此字段为图层所依赖矢量瓦片规范版本号的主版本号。例如,一个符合2.1版本规范的图层包含一个整数值为' 2 '的 version 字段。 version 字段 应该 是层中的第一个字段。 解码器 应该 首先解析 version ,以确保他们能够解码每一层。 当矢量瓦片用户遇到一个矢量瓦片层的未知版本时,它 可能 会尽最大努力尝试解释该层,或者跳过该层。 无论哪种情况,它都 应该 继续处理矢量瓦片中的后续图层 。

一个图层必须包含一个 name 字段. 一个实例瓦片 禁止 有两个或两个以上名字完全一样的图层.。在添加一个图层到现有的矢量瓦片之前,编码器 必须 检查现有的 name 字段,以防止重复。

层中的每个特征(见下文)都可以有一个或多个键值对作为元数据。 键和值是两个列表 keys 和 values 的索引,这两个列表是跨层特征共享的。

图层中 keys 字段中的每个元素为字符串。 keys 包含图层所用到的特征,每个键都可以通过它在这个集合中的位置来索引,索引从0开始。 keys 不应 包含两个完全一样的值。

图层中 values 字段中的每个元素为以下几种类型. values 表示图层中用到的所有特征的值,每个值都可以通过它在这个集合中的位置的来索引,索引从0开始。 values 不应 包含两个完全一样的值。

为了支持不同的string, boolean, integer, 和浮点型类型, value 字段的protobuf编码由一组 optional 字段组成。一个值必须包含这些可选字段中的一个。

一个图层必须包含一个 extent , extent 通差桥过整数坐标描述贴图的宽度和高度。通过定义 extent 瓦片内的几何图形 可以 延展出瓦片的范围,这样做通常是为了渲染一个跨越多个相邻瓦片的特征。

举例说明,如果一个瓦片的 extent 为 4096,这个瓦片的坐标单位为瓦片尺寸的1/4096。包含0的坐标在瓦片左侧或上侧的边缘。包含4096的坐标在瓦片右侧或下方的边缘。 1-4095的坐标完全在瓦片范围内,小于0或者大于4096的坐标完全在瓦片之外。 (1,10) 或 (4095,10) 完全在瓦片内,(0,10) 或 (4096,10) 在瓦片范围的边缘, (-1,10) 或 (4097,10)` 则完全在瓦片之外.

feature 必须 包含一个 geometry 字段。

feature 必须 包含一个 type 字段,如果几何类型(Geometry Types)部分所属

feature 必须 包含一个 tags 字段,如果存在Feature-level metadata,他们 应该 存储在 tags 字段。

feature 必须 包含一个id 字段。 如果feature包含 id 字段, id 的值 应该 在其所在的图层内保证唯一。

矢量瓦片的几何数据定义在一个屏幕坐标系中。瓦片的左上角为坐标系的原点(默认显示)。X轴正方向朝右,Y轴正方向朝下。几何 坐标 必须为整数。

每个几何图形被编码为32位无符号整数序列并存储在feature的 geometry 字段中。每个整数要么是 命令整数 CommandInteger 要么是参数整数 ParameterInteger . 解释器把它们解析为一系列有序 *** 作,来生成模型。

命令中的位置是相对"cursor"的,"cursor"是一个可以重定义的点。 feature执行第一个命令时 cursor 在 坐标系的 (0,0) 位置。其他命令有可能移动cursor,去影响后续命令。

CommandInteger 中command ID,用来表示要执行的命令,command count 表示命令要执行的次数。

command ID 存储在 CommandInteger 的最低3位,取值范围为[0,7],command count 存储在 CommandInteger 中剩下的29位, 取值范围[ 0 , pow(2, 29) - 1 ].

command ID, command count, CommandInteger 三者关系可由以下位 *** 作表示:

command ID用来表示以下命令:

命令用到的参数在 ParameterInteger 后面。 ParameterIntegers 的数量等于命令的参数个数乘以 CommandInteger 的command count。 比如, CommandInteger 有一个 MoveTo 命令,command count 为 3,那么在后面根6个 ParameterIntegers 。

ParameterInteger 采用 zigzag 编码,所以小的正数或者负数都会被编码成小整数。 parameter value转 ParameterInteger 公式为:

Parameter values不支持 大于 pow(2,31) - 1 或者小于 -1 * (pow(2,31) - 1) 的值。

解码 ParameterInteger 的公式:

对所有命令的描述中,初始坐标记作 (cX, cY) ,即 cursor 的坐标。

MoveTo 命令的 command count 为 n , 那么它后边必须跟随 n 对 ParameterInteger 。每对为 (dX, dY) :

LineTo 命令的 command count 为 n , 那么它后边必须跟随 n 对 ParameterInteger 。每对为 (dX, dY) :

任何 (dX, dY) 中 dX 和 dY 禁止 同时为 0 .

ClosePath 命令command count 必须为 1 且不带 ParameterInteger 。此命令创建一个从cursor (cX, cY) 开始到起始点结束的线段,来完成POLYGON 几何图形中当前的线性环的绘制。

此命令不改变 cursor位置。

在feature中 type 字段来描述 geometry 的类型 ,其值为取自枚举 GeomType 。以下几何类型被支持:

不支持几何图形集合。

该规范有意留下一个未知的几何类型作为选项。 这种几何类型对编码器可以选择实现的实验几何类型进行编码。 这种几何类型可以作为实验性的类型被某些编码器所执行。解码器可能会忽略这种几何类型的任何特征。

POINT 类型,表示一个或多个点的几何图形。此类型的命令序列 必须 是一个command count大于0的 MoveTo 的命令。

如果 POINT 类型的 MoveTo 命令的command count 等于 1,那么该几何图形 一定 是一个单点,否则,几何图形必须被解释为多点几何图形,其中每一对 ParameterInteger 为一个单点。

LINESTRING 类型表示 单个线条的 linestring 或多线条组合的 multilinestring 几何图形。此类型的命令序列必须由以下一个或者多个重复的序列组成 :

如果 LINESTRING 的命令序列只包含一个 MoveTo 命令,那么该图形一定被解释为单条线段的几何图形 ;否则,该几何图形一定被解释为多条线段组合的图形,每一个 MoveTo 命令表示新线条的起始点。

POLYGON 类型用来表示 单个多边形或这个组合多边形的几何图形, 每个多边形仅由一个外环组成,而外环又包含零个或多个内环。 此类型的命令序列必须由以下一个或者多个重复的序列组成 :

每一个 ExteriorRing 和 InteriorRing 必须由以下序列组成:

exterior ring 被定义为线性环,通过 计算公式 计算其面积为正数,在瓦片坐标系中(Y 轴正向朝下, X 轴正向朝右) 外环为顺时针顺序。

interior ring 被定义为线性环,通过 计算公式 计算其面积为负数,在瓦片坐标系中(Y 轴正向朝下, X 轴正向朝右) 外环为逆时针顺序。

如果一个 POLYGON 类型的命令序列中只有一个外环那么它一定被解释为一个多边形,否则它 一定 是一个多边形组合的图形,其每一个内环标示着一个新多边形的起点。如果一个多边形有内环,它们 必须 跟在它们所属的多边形的外环之后。

线性环 必须 是没有异常几何点的几何物体,如自交或自切。 在调用线性环的 ClosePath 命令之前,cursor的位置 不应 与线性环的第一个点重复,因为这会创建一个长度为0的线段。 线性环的面积 不应 为零,因为这意味着环上有异常的几何点。

多边形几何形状 不应 有任何内环相交,内环 必须 由外环包围。

表示一个点:

仅需要一条命令:

表示两个点分别位于:

这需要两条命令:

表示由以下点组成的Linestring:

这需要三条命令:

表示两个Linestring:

需要以下命令:

表示由以下点组成的多边形:

需要以下命令:

下边的示例 由两个多边形组成 ,其中一个有一个洞。多边形的顶点如下所示。多边形的顺序在这个例子中是 非常 重要的,因为它表示内环和新多边形之间的区别。

此多边形需要以下命令:

特征属性位于feature的 tag 字段,为成对的整数。每一对中的第一个整数为 layer 中 keys 的索引(从0开始),用来表示它属于此特征, 每一对中的第二个整数为 layer 中 values 的索引(从0开始),用来表示它属于此特征。每个键索引在该特性中 必须 是唯一的,这样该特性中的其他属性对就不会有相同的键索引。 一个特性必须有偶数个 tag 字段。特性 tag 自动中的键和值分别不能大于等于 keysvalues 集合元素的数量。

例如, 一个 GeoJSON 特征:

可以被构造为这样:

记住,几何形状的精确值会根据贴图的投影和范围而不同。

一、 前言

在古代,地图主要用军事和水利勘测,随着科技的发展,现如今地图已应用于各行各业,融入到百姓的生活当中。目前,地图包含的内容越来越丰富,范围也越来越广,并且常用在WebGIS中,每次前端请求出图,都需要服务器出图,导致服务器压力大,出图慢等问题,而利用瓦片地图技术可以很好的解决这个问题。那什么是地图瓦片呢?地图瓦片是包含了一系列比例尺、一定地图范围内的地图切片文件伏皮。地图裂厅段瓦片按照金字塔结构组织,每张瓦片都可通过级别、行列号唯一标记。在平移、缩放地图时,浏览器根据金字塔规则,计算出所需的瓦片,从瓦片服务器获取并拼接。地图瓦片,是一种改善地图浏览用户体验的优化策略。地图瓦片金字塔结构示意图如下:

二、 切地图瓦片

  在iDesktop中支持生成地图瓦片,若在执行切图过程中意外中断切图,可以进行续传瓦片;另外,在使用地图瓦片的过程中,如果地图服务数据发生变更,支持通过更新/追加功能更新地图服务中的变更的数据。为了使体量大的数据高效切地图瓦片,iDesktop不仅支持单任务生成地图瓦片,还是支持多任务生成地图瓦片。切地图瓦片的过程如下:

1、 配置地图

  在切地图瓦片之前需要准备好地图数据,即可以在iDesktop中配置好地图并保存。

2、 单任务生成地图瓦片

是指在一台机器上只启动单个进程完成切图任务,适用于数据量较小的切图情况,具体 *** 作步骤如下:

(1) 新建切图任务

  在工作空间管理器中选择需要生成地图瓦片的地图,右键鼠标,在右键菜单中选择“生成肆誉地图瓦片(单任务)”项。d出“生成地图瓦片(单任务)”对话框。可选择三种单任务切图方式:新建切图任务、更新/追加瓦片、续传/恢复瓦片。此处选择“新建切图任务”项。

(2) 设置切图参数

  在“单任务:生成地图瓦片”对话框中设置生成瓦片的比例尺、名称、存储类型、瓦片范围、索引范围等参数。如下图所示:

三、 结语

在地图的使用过程中,地图瓦片能很大的提升地图性能,而在地图的数据量大时,多机多线程切瓦片对于项目的进程也很重要。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12244777.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-22
下一篇 2023-05-22

发表评论

登录后才能评论

评论列表(0条)

保存