Vector tile specification
规范是设置有关如何存储和编码数据的标准的重要手段。就像应用程序假设数据库中存在哪些信息一样,Mapbox工具也假设矢量图块如何存储地理信息。Mapbox矢量图块规范明确提供了有关文件格式和扩展名,投影和范围以及矢量图块的内部结构的信息。该页面包括:
- 版本区别的说明
- 几何编码示例
- 属性编码的例子
- 绕线顺序重要性的解释
- 规范中未包含的概念列表
版本控制
该规范是根据 major.minor
符号进行版本控制的。该 major
版本将与任何技术变革,以规范的格式递增或方式,它应该被解释。对minor
版本的更改将保留,以便澄清或纠正与规范语言相关的笔误。
major
规范名称中的版本与“ version
Mapbox矢量图块”图层中的字段同义。有关3.1. Layers
更多详细信息,请参见本部分。
版 | 发布日期 | 更新 |
---|---|---|
2 .1 |
2016年1月19日 | 对2.0规范中某些位置的措辞进行了更正。 |
2.0 |
2015年12月4日 | 2.0 Mapbox Vector Tile规范版本的重点是阐明规范初始版本的意图以及定义多边形内的内外环。在此版本的规范中,更清楚地定义了原型缓冲区中的字段,并且更明确地声明了解码器和编码器的步骤。 |
1.0.1 |
2014年7月28日 | 更新.proto 文件以匹配协议缓冲区样式指南,更改命名空间 |
1.0.0 |
2014年4月13日 | 初版 |
格式
矢量图块编码为Google Protobufs(PBF),可用于序列化结构化数据。为了清楚起见,Mapbox矢量图块使用.mvt
文件后缀。规范详细信息主要围绕基本.proto
文件中实现的规则构建。
OpenStreetMap PBF文件与Mapbox Vector Tiles有何关系?
它们根本不相关。PBF是一种格式,很像XML,可以采用多种形式。Mapbox矢量图块和OpenStreetMap PBF是protobuf文件,但遵循完全不同的规范,并以不同的方式使用。
编码几何
要将地理信息编码为矢量图块,工具必须将地理坐标(例如纬度和经度)转换为矢量图块网格坐标。矢量图块不包含地理信息的概念。它们以相对于网格左上角的右下方式将点,线和多边形编码为x
/ y
对。
这是一个分步示例,显示了单个矢量图块如何在网格中编码几何图形。它遵循“笔”的命令来编码两个环。
右侧的向量图块是带有2个单元缓冲区的10x10网格。让我们以蓝色多边形。以下命令将相对于钢笔 (黑点)。
编码属性
属性tag
以向量中的特征中存在的一系列s 编码,这些s具有整数值,这些整数值引用keys
并values
指定来自几何的原始key:value对。对于大型几何,这将删除具有相同键和相似值的属性的冗余。
看一下FeatureCollection
左边的原始GeoJSON ,看看它的各个部分如何被编码到tags
矢量图块protobuf 的正确中。
将鼠标悬停在GeoJSON的功能和属性上。
原始geojson
{
"type": "FeatureCollection",
"features": [
{
"geometry": { ... },
"type": "Feature",
"properties": {
"hello": "world",
"h": "world",
"count": 1.23
}
},
{
"geometry": { ... },
"type": "Feature",
"properties": {
"hello": "again",
"count": 2
}
}
]}
最终矢量拼贴
layers {
version: 2
name: "points"
features: {
id: 1
tags: 0
tags: 0
tags: 1
tags: 0
tags: 2
tags: 1
type: Point
geometry: ...
}
features {
id: 2
tags: 0
tags: 2
tags: 2
tags: 3
type: Point
geometry: ...
}
keys: "hello"
keys: "h"
keys: "count"
values: { string_value: "world" }
values: { double_value: 1.23 }
values: { string_value: "again" }
values: { int_value: 2 }
extent: 4096
}
Winding order
缠绕顺序是指矢量拼贴画顺时针或逆时针绘制环的方向。许多几何形状是带有“孔”的多面体,也表示为多边形环。重要的是,能够推断出缠绕顺序,以便从矢量图块中提取源数据,并了解其几何形状是多多边形还是唯一多边形的一部分。
过去在地图上很难从图像中提取原始数据,因为从几何图形中丢失了可能用于创建图像的基础元数据。然而,随着通过GL技术对矢量图块的客户端渲染的引入,原始几何数据对于渲染之外的信息源已变得有用。
为了使渲染器能够正确地区分哪些多边形是孔以及哪些多边形是唯一的几何体,该规范要求所有多边形都是有效的(OGC有效性)。任何多边形内圈的缠绕顺序必须与其父外圈的缠绕顺序相反,并且所有内圈都必须直接跟随其所属的外圈。外环必须按顺时针方向定位,而内环必须按逆时针方向定位(从屏幕坐标中查看时)。
以下示例几何图形显示了如何对环的缠绕顺序进行编码会如何影响渲染结果。每个示例均假定所有环均是同一多面体的一部分。
注意:该Y
轴在矢量图块坐标中为正向下!
按顺时针顺序将单个环呈现为单个实心多边形。
Ring 1: Clockwise
具有相同缠绕顺序的两个环将作为两个唯一的多边形重叠而呈现。
Ring 1: Clockwise Ring 2: Clockwise
两个环,第一个(外部)环是按顺时针顺序排列的,而第二个是逆时针环。这在最终渲染中导致“孔”。
Ring 1: Clockwise Ring 2: Counter-Clockwise
一个多面体中的三个环,它们交替缠绕顺序。
Ring 1: Clockwise Ring 2: Counter-Clockwise Ring 3: Clockwise
实作
Mapbox矢量图块规范的实现方式非常广泛。其中许多属于以下类别之一:
- 解析器和生成器:读取和/或编码矢量切片的库,有些还具有命令行实用程序
- 客户:基于Web的工具,可渲染符合规范的矢量图块
- 应用程序:用于创建和可视化矢量图块的基于浏览器的工具
- 服务器:支持渲染并提供矢量图块(注意:该规范未涉及如何明确执行此操作)
访问Mapbox矢量图块以获取实现矢量图块的工具列表。
规范未涵盖的内容
该规范在矢量图块应打包数据的方式中是明确的。但是,本规范未涵盖一些相关概念。
如何使用矢量图块作为数据集
本规范无意于解释如何使用矢量图块作为数据集。这是将来考虑的问题,但可能会成为单独的规范。本规范未涵盖如何存储,请求或共享矢量切片。像PNG规范如何解释如何打包数据一样考虑此规范。
如何编码不是字符串或数字的属性
几何数据中的属性(例如properties
GeoJSON中的对象)可以包含的不仅是字符串和数字。它们可以是数组或对象。该规范不涉及如何对这些值进行编码,而是由编码器决定。诸如Mapnik之类的工具会将数组和对象转换为字符串,这需要解码器对其进行解析。例如,如果您有一个名为GeoJSON的属性,categories
并且它是一个数组:
"categories": ["one", "two", "three"]
它将被转换为字符串并存储在protobuf中,如下所示:
keys: "categories" values: {string_value: "[\"one\",\"two\",\"three\"]" }
剪裁
该规范没有说明应如何在矢量图块之间裁剪地理数据,因为裁剪可以像简化一样以多种方式执行。Mapbox专门在图块周围的缓冲区中剪切要素(请参见上面的编码示例)。假定此缓冲区内的任何几何图形都可以继承到另一个图块。这是将来版本考虑的问题。
注意:矢量图块中的编码几何形状可以扩展到图块的边界之外。这意味着不需要裁剪功能。
关于裁剪的一个常见问题是“渲染器如何知道要裁剪的几何连接哪些线?”。这就是Mapbox为矢量切片和修剪的几何体添加缓冲区的原因。当需要渲染时,Mapbox会将画布设置为确切的图块大小,从而将边缘设置为可视框架之外的边缘,从而使图块全部对齐。因此,出于渲染目的,无需知道哪些节点是其他节点的一部分。虽然,您可以使用id
protobuf中的字段存储重建多边形所需的信息。
简化版
从地理坐标(纬度和经度)到矢量图块坐标(x,y)的转换是重要的步骤,但是可以在矢量图块编码之前以许多不同的方式实现。它未包含在本规范中,但是有一些重要的GOTCHA值得注意。
通过将多边形环过度简化到边缘重叠的位置,简化会导致根据OGC标准的无效多边形 。参见下文,通过简化内线如何将内环推到外环之外来改变多边形的渲染。
将空间坐标转换为图块坐标时,会将它们四舍五入为整数。简化(四舍五入)坐标可以反转缠绕顺序。考虑简化为矢量图块网格的三角形多边形。圆角点可以越过多边形并将其“翻转”,从而使其缠绕顺序相反。