原文地址https://github.com/mapbox/mbtiles-spec/blob/master/1.3/spec.md
MBTiles 1.3
在此文档中, 关于关键词【必须】、【禁止】、【必要的】、【应当】、【不应】、【推荐的】、【可以】与【可选的】的解释, 见RFC 2119 中的 描述。
概述
MBTiles是一个在SQLite 数据库存储瓦片地图数据的标准,该标准的目的是即时传输和使用数据。
MBTiles 文件,即tilesets,必须实现下面的规范来确保 设备兼容性。
兼容性
本节提供信息,不会向实现添加要求。
因为视图可以作为MBTiles schema, 所以有两种不同的方式来存储瓦片,这意味着一种实现方式不能被加入到文档中。
作为一个容器格式,MBTiles可以存储任何瓦片数据, 因为用来存储数据 ,所以不能对其做任何修改。
依赖于未在规范中定义的元数据关键字可能导致兼容性问题。
数据库兼容性
Tilesets应当是有效的SQLite3.0.0 及以上版本的数据库。
仅使用SQLite的核心功能; tilesets不应需要扩展功能.
为了容易识别MBTiles,MBTiles数据库可以用 官方指定的 magic number。
数据库
注意: schemas概述是遵循接口的。
也可以用SQLite视图代替。
方便起见,本规范中把表(tables),虚拟表(virtual tables ),视图(views) 都称作tables.
字符集
tileset表中 text
类型的列必须使用UTF-8编码。
元数据Metadata
Schema
数据库必须有一个名为 metadata
的表或者视图。
这个表或视图必须有name
和value
两列,且类型为 text
。
下边是一个创建metadata
表的语句:
CREATE TABLE metadata (name text, value text);
Content
元数据表以键值对的形式存储设置信息。它必须包含以下两行:
-
name
(string): tileset名字,具有可读性. -
format
(string): 瓦片数据的文件格式,例如:pbf
,jpg
,png
,webp
, 或一个符合 IETF media type 标准的格式.
pbf
是Mapbox Vector Tile内一个通过gzip压缩的矢量瓦片数据格式(format
) 。
元数据表 metadata
应当包含以下四行:
-
bounds
(逗号分隔的数字字符串): 地图呈现的最大区域。Bounds 定义的必须是所有缩放级别下的区域。bounds以WGS 84
经纬度值表示, 在 OpenLayers Bounds 格式为
(左, 下, 右, 上).。距离来说, 出去南北极的全球范围表示为:
-180.0,-85,180,85
. -
center
(逗号分隔的数字字符串): 地图默认视图的经度,维度,缩放级别。
例如:-122.1906,37.7599,11
-
minzoom
(数字): 瓦片集提供数据的最低缩放级别 -
maxzoom
(数字): 瓦片集提供数据的最高缩放级别
元数据表 metadata
可以包含以下四行:
-
attribution
(HTML string): 属性字符串,用来描述数据资源和/或地图样式。 -
description
(string): 瓦片集内容的描述. -
type
(string):overlay
或者baselayer
-
version
(number): 瓦片集的版本.
指的的是瓦片集的版本,不是MBTiles规范的版本.
如果是 pbf
格式, 元数据表必须 包含这一行:
-
json
(JSON字符串): 列出矢量瓦片中出现的层,和名字, 和层中出现的特性所包含属性的类型。 详情请看下方 。
元数据表 metadata
可以包含额外的行,以实现UTFGrid-based interaction 或者其他目的.
瓦片
Schema
数据库必须包含名为 tiles
的表。
tiles
表 必须有三列 integer
类型数据, 分别是 zoom_level
, tile_column
,
tile_row
, 一列 blob
类型数据, tile_data
.
可用以下create
语句创建 tiles
表:
CREATE TABLE tiles (zoom_level integer, tile_column integer, tile_row integer, tile_data blob);
数据库可以包含索引,来提高访问效率:
CREATE UNIQUE INDEX tile_index on tiles (zoom_level, tile_column, tile_row);
Content
tiles表包含瓦片数据和用来定位他们的值。
zoom_level
, tile_column
, tile_row
列必须根据
Tile Map Service Specification进行编码,
且必须用global-mercator (aka Spherical Mercator) 配置文件.
注意,在TMS平铺方案中,Y轴与url中常用的“XYZ”坐标系统相反,如果请求一个单独的瓦片,在通常情况下11/327/791则需要用
zoom_level
11, tile_column
327, tile_row
1256 来表示,因为1256 = 2^11 - 1 - 791。
tile_data 列必须包含数据二进制图像或者矢量数据,blob
类型.
网格Grids
网格交互和本身元数据的实现细节参见 UTFGrid specification : MBTiles规范只涉及存储。
Schema
数据库可以包含 grids
grid_data
两张表。
grids
表必须包含三列integer类型数据,分别是
zoom_level,
tile_column,
tile_row, 一列
blob类型数据, 名为
grid`。
grids
表可以通过以下语句创建:
CREATE TABLE grids (zoom_level integer, tile_column integer, tile_row integer, grid blob);
grid_data
表必须包含三列integer类型数据,分别是
zoom_level,
tile_column,
tile_row,
, 两列类型为 text
的数据, 分别是key_name
, and key_json
.
grid_data
表可以通过以下语句创建:
CREATE TABLE grid_data (zoom_level integer, tile_column integer, tile_row integer, key_name text, key_json text);
Content
grids
表,如果存在,必须包含UTFGrid数据,以' gzip '格式压缩。
grid_data
表,如果存在,必须包含网格键到值的映射,并将值编码为JSON对象。
矢量瓦片集元数据Vector tileset metadata
如上所属, Mapbox Vector Tile tilesets metadata
表必须 包含一行 json
来说明哪些层是可用的,哪些属性是可用的和这些层的功能。
此 json
如果存在,必须用json对象的UTF-8字符串表示。
Vector_layers
json
行中的JSON对象必须包含vector_layers
键, 它的值是一个JSON对象数组。
每一个 JSON 对象描述 一层矢量瓦片数据, 必须包含以下键值对:
-
id
(string): 层ID, 它指的是Mapbox Vector Tile spec中层的’name
。 -
fields
(object):一个 JSON 对象,它的键和值是这层中可见的属性的名字和类型。
每个类型必须是字符串"Number",
"Boolean", or
"String"`.
属性的类型在不同的特性之间不同,应该被列为' "String" '。
每一层对象可以包含以下键值对:
-
description
(string): 关于层内容的描述。
每一层对象可以包含以下键值对:
-
minzoom
(number): 此图层出现的最低缩放级别。 -
maxzoom
(number): 此图层出现的最高缩放级别。
minzoom
必须大于等于tileset的 minzoom
,
maxzoom
必须小于等于tileset的 maxzoom
。
这些键用来描述在同一个瓦片集下不同矢量层级在不同缩放等级出现的情况。比如:“次要道路”层只出现在高缩放级别。
Tilestats
json
行的 JSON 对象也可以包含 tilestats
键, 它的值是一个"geostats"格式的对象,具体文档在 mapbox-geostats
仓库. 和 vector_layers
一样, 它列出了 tileset 的 层 和和每一层的数量, 还提供了每个属性的样例值和数字类型的取值范围。
示例
一个来自 TIGER 包含美国的县和主要道路的矢量瓦片集应该包含以下元数据表:
-
name
:TIGER 2016
-
format
:pbf
-
bounds
:-179.231086,-14.601813,179.859681,71.441059
-
center
:-84.375000,36.466030,5
-
minzoom
:0
-
maxzoom
:5
-
attribution
:United States Census
-
description
:US Census counties and primary roads
-
type
:overlay
-
version
:2
-
json
:
{
"vector_layers": [
{
"id": "tl_2016_us_county",
"description": "Census counties",
"minzoom": 0,
"maxzoom": 5,
"fields": {
"ALAND": "Number",
"AWATER": "Number",
"GEOID": "String",
"MTFCC": "String",
"NAME": "String"
}
},
{
"id": "tl_2016_us_primaryroads",
"description": "Census primary roads",
"minzoom": 0,
"maxzoom": 5,
"fields": {
"FULLNAME": "String",
"LINEARID": "String",
"MTFCC": "String",
"RTTYP": "String"
}
}
],
"tilestats": {
"layerCount": 2,
"layers": [
{
"layer": "tl_2016_us_county",
"count": 3233,
"geometry": "Polygon",
"attributeCount": 5,
"attributes": [
{
"attribute": "ALAND",
"count": 6,
"type": "number",
"values": [
1000508839,
1001065264,
1001787870,
1002071716,
1002509543,
1003451714
],
"min": 82093,
"max": 376825063576
},
{
"attribute": "AWATER",
"count": 6,
"type": "number",
"values": [
0,
100091246,
10017651,
100334057,
10040117,
1004128585
],
"min": 0,
"max": 25190628850
},
{
"attribute": "GEOID",
"count": 6,
"type": "string",
"values": [
"01001",
"01003",
"01005",
"01007",
"01009",
"01011"
]
},
{
"attribute": "MTFCC",
"count": 1,
"type": "string",
"values": [
"G4020"
]
},
{
"attribute": "NAME",
"count": 6,
"type": "string",
"values": [
"Abbeville",
"Acadia",
"Accomack",
"Ada",
"Adair",
"Adams"
]
}
]
},
{
"layer": "tl_2016_us_primaryroads",
"count": 12509,
"geometry": "LineString",
"attributeCount": 4,
"attributes": [
{
"attribute": "FULLNAME",
"count": 6,
"type": "string",
"values": [
"1- 80",
"10",
"10-Hov Fwy",
"12th St",
"14 Th St",
"17th St NE"
]
},
{
"attribute": "LINEARID",
"count": 6,
"type": "string",
"values": [
"1101000363000",
"1101000363004",
"1101019172643",
"1101019172644",
"1101019172674",
"1101019172675"
]
},
{
"attribute": "MTFCC",
"count": 1,
"type": "string",
"values": [
"S1100"
]
},
{
"attribute": "RTTYP",
"count": 6,
"type": "string",
"values": [
"C",
"I",
"M",
"O",
"S",
"U"
]
}
]
}
]
}
}
未来规划方向
在这个规范的未来版本中, metadata
表将会包含 compression
行来表示压缩类型。
在这个规范的未来版本中,metadata
表中的 bounds
, minzoom
,
和 maxzoom
行将是强制性的。
该规范的未来修订版将委托外部规范描述来描述metadata
表的json
行。