一、MBTiles数据格式
MBTiles格式是指由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用、管理和分享的规范,是一种用于即时使用和高效传输的规范。MBTiles既可以用作栅格输入数据存储,也可以用作WMSGetMap输出格式。规范有1.0,1.1,1.2,1.3现在最新执行的是1.3标准。
MBTiles 格式的瓦片要求瓦片的地图坐标系统为:Web Mercator,即 PCS_WGS_1984_WORLD_MERCATOR ,EPSG Code:3857。MBTiles 规范按照 OSGeo 的 TMS 规范来生成和组织地图瓦片,仅支持 Web Mercator 坐标系下的固定比例尺集合。如表1所示,这种比例尺定义的初始化显示级别0中包含了1张覆盖全球的256*256大小的切片,并且定义原点坐标为(-20037508.34,-20037508.34),即全球范围的左下角。MBTiles 格式的地图瓦片,支持的图片存储类型为 PNG 和 JPG。
- 遵循TMS规范。即原点坐标为左下角,向北,向东增长。
- 只支持WebMercator投影(EPSG:3857或EPSG:900913)。
- 瓦片尺寸为256X256。支持格式:pbf、jpg、png、webp(MBTiles1.3标准)。
- 通过建立视图,减少重复瓦片的存储,减少数据大小。
- 后缀名为.mbtiles,可以通过一般的SQLite查看器查看,也可通过GIS软件(如GlobalMapper、QGIS(支持矢量的mbtiles))。
- 瓦片比例尺固定。
MBTiles存储格式通过元数据表metadata和tiles视图,map数据表,image数据表一起管理地图瓦片数据。其中metadata和tiles是必须包含的表格。
metadata元数据表采用键值对的形式来存储地图瓦片数据的相关设置,包括两个文本类型的表name和value。metadata表必须包含name和format字段。
tiles视图包括所有的瓦片数据和用于定位瓦片数据的一些值。zoom_level、tile_column和tile_row列必须按照瓦片地图服务规范对瓦片的位置进行编码。tile_data列必须包含作为blob的关联瓦片的原始二进制图像或矢量瓦片数据。
地图覆盖大面积的纯蓝色像海洋或空的土地,造成成千上万的重复、冗余的瓦片数据,例如,4/2/8的瓦片在太平洋中间,可能看起来就是一张蓝色图片。虽然它可能是一些处于第3级,但在16级可能存在数以百万计的蓝色图片,他们都完全一样。MBTiles通过视图使用这些冗余瓦片数据可以减少占用的空间,而不是一个单一的、文字表,MBTiles实现者经常把瓦片表分成两种:一个用来存储原始图像和一个存储瓷砖坐标对应那些图片。
表1 MBTiles各显示级别参数列表
显示 级别 | 地图宽高(像素) | 切片数量 | 地面分辨率 (米/像素) | 地图比例尺 (96dpi) |
0 | 256 | 1 | 156543.03 | 1:591657527.591555 |
1 | 512 | 4 | 78271.517 | 1:295828763.795777 |
2 | 1024 | 16 | 39135.758 | 1:147914381.897889 |
3 | 2048 | 64 | 19567.879 | 1:73957190.948944 |
4 | 4096 | 256 | 9783.9396 | 1:36978595.474472 |
5 | 8192 | 1024 | 4891.9698 | 1:18489297.737236 |
6 | 16384 | 4096 | 2445.9849 | 1:9244648.868618 |
7 | 32768 | 16384 | 1222.9925 | 1:4622324.434309 |
8 | 65536 | 65536 | 611.49623 | 1:2311162.217155 |
9 | 131072 | 262144 | 305.74811 | 1:1155581.108577 |
10 | 262144 | 1048576 | 152.87406 | 1:577790.554289 |
11 | 524288 | 4194304 | 76.437028 | 1:288895.277144 |
12 | 1048576 | 16777216 | 38.218514 | 1:144447.638572 |
13 | 2097152 | 67108864 | 19.109257 | 1:72223.819286 |
14 | 4194304 | 268435456 | 9.554629 | 1:36111.909643 |
15 | 8388608 | 1.074E+09 | 4.777314 | 1:18055.954822 |
16 | 16777216 | 4294967296 | 2.388657 | 1:9027.977411 |
17 | 33554432 | 17179869184 | 1.194329 | 1:4513.988705 |
18 | 67108864 | 68719476736 | 0.597164 | 1:2256.994353 |
19 | 134217728 | 274877906944 | 0.298582 | 1:1128.497176 |
20 | 268435456 | 1099511627776 | 0.149291 | 1:564.248588 |
21 | 536870912 | 4398046511104 | 0.074646 | 1:282.124294 |
22 | 1073741824 | 17592186044416 | 0.037323 | 1:141.062147 |
二、MBTiles数据集存储结构设计
GeoServer通过扩展插件可实现MBTiles文件的发布,但是GeoServer只能支持单个MBTiles文件的发布,无法支持全球栅格瓦片数据集的发布。全球栅格瓦片数据量巨大,无法存储在一个MBTiles文件中,需要按照一定组织结构将全球栅格数据分块存储在多个MBTiles文件,因此需要设计一个全球瓦片数据集的存储结构。
MapBox制定的MBTiles格式规范中,没有定义瓦片数据集的存储结构。因此,本项目制定了一个存储全球栅格瓦片数据集的存储结构MBTiles数据集。MBTiles数据集采用分级分块存储结构,默认的投影是WebMercator(EPSG:3857),默认的瓦片编号方式Googletilescheme(原点在左上角,起始级别为0级)。以下是MBTiles数据集组织结构:
Global_Raster_MBTiles/:根文件夹,用于存放所有与全球影像瓦片数据存储相关的文件和文件夹。文件夹名称以区域+数据类型+MBTiles命名。根文件夹下的每个子文件夹代表一个缩放级别(zoom),级别文件夹下是“列号_行号”文件夹该文件夹下是数据库文件,每个mbtiles文件最多存储256*256=65536个瓦片。(因为单个文件大小受系统磁盘限制),数据集从0-8级,每级目录下只有一个0_0_0. mbtiles文件。例如:1\0_0\0_0_0. mbtiles。
|0/:第一个缩放级别文件夹。
0_0/:第1列的第1行文件夹。
z_x_y.mbtiles:mbtiles数据库文件,存储瓦片数据和元数据。
z_x_y.mbtiles:另一个瓦片数据库文件。
...
0_1/:第1列的第2行文件夹。
z_x_y.mbtiles:mbtiles数据库文件,存储瓦片数据和元数据。
z_x_y.mbtiles:另一个瓦片数据库文件。
...
1_0/:第2列的第1行文件夹,以此类推。
1/:第2个缩放级别文件夹,以此类推。
metadata.json:数据集的元数据文件。
表2 瓦片数据集目录组织结构表
文件存储路径:z(层级)\m(列号)_n(行号)\z(层级)_x(列号)_y(行号).mbtiles
z层级 | m 列号 | n行号 | x 列号 | y 行号 | 瓦片 列数 | 瓦片 行数 | 瓦片 总数 | 文件存储路径 |
0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 0\0_0\0_0_0.mbtiles(只有1个文件) |
1 | 0 | 0 | 0 | 0 | 2 | 2 | 4 | 1\0_0\1_0_0.mbtiles(只有1个文件) |
2 | 0 | 0 | 0 | 0 | 4 | 4 | 16 | 2\0_0\2_0_0.mbtiles(只有1个文件) |
3 | 0 | 0 | 0 | 0 | 8 | 8 | 64 | 3\0_0\3_0_0.mbtiles(只有1个文件) |
4 | 0 | 0 | 0 | 0 | 16 | 16 | 256 | 4\0_0\4_0_0.mbtiles(只有1个文件) |
5 | 0 | 0 | 0 | 0 | 32 | 32 | 1024 | 5\0_0\5_0_0.mbtiles(只有1个文件) |
6 | 0 | 0 | 0 | 0 | 64 | 64 | 4096 | 6\0_0\6_0_0.mbtiles(只有1个文件) |
7 | 0 | 0 | 0 | 0 | 128 | 128 | 16384 | 7\0_0\7_0_0.mbtiles(只有1个文件) |
8 | 0 | 0 | 0 | 0 | 256 | 256 | 65536 | 8\0_0\8_0_0.mbtiles(只有1个文件) |
9 | 0 | 0 | 0-1 | 0-1 | 512 | 512 | 65536*4 | z\m_n\z_x_y.mbtiles等共4个文件 |
10 | 0 | 0 | 0-3 | 0-3 | 1024 | 1024 | 65536*16 | z\m_n\z_x_y.mbtiles等共16个文件 |
11 | 0-1 | 0-1 | 0-7 | 0-7 | 2048 | 2048 | 65536*16*2*2 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
12 | 0-3 | 0-3 | 0-15 | 0-15 | 4096 | 4096 | 65536*16*4*4 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
13 | 0-7 | 0-7 | 0-31 | 0-31 | 8192 | 8192 | 65536*16*8*8 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
14 | 0-15 | 0-15 | 0-63 | 0-63 | 16384 | 16384 | 65536*16*16*16 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
15 | 0-31 | 0-31 | 0-127 | 0-127 | 32768 | 32768 | 65536*16*32*32 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
16 | 0-63 | 0-63 | 0-255 | 0-255 | 65536 | 65536 | 65536*16*64*64 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
17 | 0-127 | 0-127 | 0-511 | 0-511 | 131072 | 131072 | 65536*16*128*128 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
18 | 0-255 | 0-255 | 0-1023 | 0-1023 | 262144 | 262144 | 65536*16*256*256 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
19 | 0-511 | 0-511 | 0-2047 | 0-2047 | 524288 | 524288 | 65536*16*512*512 | z\m_n\z_x_y.mbtiles,分为m*n个路径,每个文件夹下16个文件 |
表3 metadata元数据
name | value(示例) | 说明 |
name | globleImage | 数据集英文名称名称(根文件夹名称) |
format | png | 瓦片数据的格式:png、jpg 或 pbf。 |
bounds | -180,-85,180,85 | 图的切图范围,单位为度。bounds 的格式(逗号分隔数字字符串):左,下,右,上。 |
center | 122.1906,37.7599,11 | 地图默认视图的经度、纬度和缩放级别。逗号分隔数字字符串) |
minzoom | 0 | 图块集为其提供数据的最低缩放级别 |
maxzoom | 18 | 图块集为其提供数据的最高缩放级别 |
attribution | (HTML 字符串):一个属性字符串,用于解释 地图的数据和/或样式。 | |
description | 描述信息 | |
type | baselayer | 地图类型,其值可以是 overlay 或 baselayer。 |
version | 1.3 | 数据集的版本 |
EPSG | 3857 | 坐标系的 EPSG Code,EPSG:4326 、EPSG:3857或EPSG:900913 |
tile_height | 256 | 瓦片高度,通常为256。 |
tile_width | 256 | 瓦片高度,通常为256。 |
scheme | tms | 瓦片编号规则,tms或xyz |
三、MBTiles数据集展示
1、mbtiles目录
2、metadata.json
{"name": "ESRI ArcGIS.Imagery","type": "baselayer","version": "1.2","description": "","format": "jpg","bounds": "-180.00000000,-85.05112878,180.00000000,85.05112878","attribution": "","scheme": "xyz","minzoom": "14","maxzoom": "14","center": "0.00000000, 0.00000000, 14","EPSG": "3785","tile_height": "256","tile_width": "256"
}
3、mbtiles数据查看
mbtiles文件其实就是一个简单的sqlite数据文件,所以可以用navicat、heidisql等数据连接工具打开查看。
每一行数据其实就是一张瓦片图,这样存储的好处是可以突破单文件夹最大文件数的限制。
但是相应也需要有算法去取出逐个对应的z-x-y的图片。
下一篇就讲一下Mbtiles数据文件的解析和提取对应瓦片的算法。