MBTiles 是由 MapBox 制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范。该规范由MapBox制定,详见http://mapbox.com/mbtiles-spec/。
SuperMap iServer为了满足自身应用的需求,不仅支持生成和使用满足MBTiles规范的瓦片地图数据,并且基于原规范对MBTiles中的内容进行了扩展。扩展后的.mbtiles文件支持任意坐标系,支持任意分辨率,支持JPG和PNG混合格式的地图瓦片数据。
扩展后的.mbtiles文件仍然使用元数据表”metadata”和瓦片数据表”tiles”来对瓦片地图数据进行管理。
metadata元数据表采用键值对的形式来存储地图瓦片数据的相关设置,包括两个文本类型的字段”name”和”value”,与MBTiles 1.1规范一致。表结构如图1所示:
图1 元数据表的表结构
元数据表的内容举例如表1所示:
表1 元数据表举例
name
|
value
|
name |
World |
type |
baselayer |
version |
1.1 |
description |
World created on 2012-12-17 16:51:22 by SuperMap iServer |
format |
PNG |
bounds |
-180.0,-90.0,180.0,90.0 |
axis_origin |
-180.0,90.0 |
axis_positive_direction
|
RightDown |
crs_wkid
|
4326 |
crs_wkt |
GEOGCS["WGS 84",
DATUM["WGS_1984",
SPHEROID["WGS 84", 6378137, 298.257223563, AUTHORITY["EPSG", "7030"]],
AUTHORITY["EPSG", "6326"]],
PRIMEM["Greenwich", 0, AUTHORITY["EPSG", "8901"]],
UNIT["degree", 0.0174532925199433, AUTHORITY["EPSG", "9122"]],
AUTHORITY["EPSG", "4326"]]
|
tile_height |
256 |
tile_width |
256 |
resolutions |
78271.516964,529.1666666666666 |
scales |
5.0E-7 |
map_parameter |
{"scale":0.00101610071425,"clipRegion":{"center":null,"id":0,"style… |
compatible |
false |
|
元数据表的各字段(keys)说明如表2所示:
表2 元数据表各字段描述
字段名称 |
是否必须 |
是否 iServer 扩展 |
说明 |
name |
是 |
否 |
地图的英文名称,如果地图名称为中文会自动转换为中文名称的拼音。 |
type |
是 |
否 |
地图类型,其值可以是overlay 或 baselayer。 |
version |
是 |
否 |
地图瓦片数据的版本,MBTiles 规范的版本是 1.1。 |
description |
是 |
否 |
描述信息。 |
format |
是 |
否 |
瓦片数据的格式:png、jpg或jpg_png,其中jpg_png是V5缓存支持的混合格式。 |
bounds |
否 |
否 |
地图的切图范围,其单位与地图单位保持一致。iServer中bounds的格式为:左,下,右,上,例如:-180,-85,180,85。 |
axis_origin |
否 |
是 |
切图原点的位置。 |
axis_positive_direction |
否 |
是 |
坐标系中坐标轴的正方向的枚举类型(RightDown, RightUp, LeftDown, LeftUp),例如:x轴向右y轴向下RightDown。 |
crs_wkid |
否 |
是 |
坐标系的EPSG Code(-1000为用户自定义坐标系,0为普通平面坐标系)。 |
crs_wkt |
否 |
是 |
用wkt表示的地理坐标系信息。(wkt:由开放地理空间联盟(OGC)制定的一种文本标记语言,详见:http://docs.geotools.org/stable/javadocs/org/opengis/referencing/doc-files/WKT.html) |
tile_height |
否 |
是 |
瓦片高度,通常为256。 |
tile_width |
否 |
是 |
瓦片宽度,通常为256。 |
resolutions |
否 |
是 |
分辨率集合,各级瓦片对应的分辨率。 |
scales |
否 |
是 |
各级分辨率对应的比例尺集合。 |
map_parameter |
否 |
是 |
地图默认参数的 json 字符串,地图默认参数包含了地图的所有特征信息,如地图的名称 name、地图的比例尺 mapScale等。 |
compatible |
否 |
是 |
是否兼容MBTiles规范,仅当wkid字段为3857并且分辨率集合中所有分辨率均属于MBTiles规范分辨率时为true,否则为false。 |
|
tiles 瓦片数据表包括所有的瓦片数据和用于定位瓦片数据的一些值。除MBTiles1.1规范的zoom_level, tile_colum, tile_row, tile_data四个字段外,增加了resolution字段,支持任意比例尺、任意分辨率。表结构如图2所示:
图2 瓦片数据表的表结构
瓦片数据的表内容举例如图3:
图3 瓦片数据表的表内容举例
注:当瓦片对应的地面分辨率与表 3 中的地面分辨率无法对应时,zoom_level值为-1。
根据resolution值或对应比例尺读写对应瓦片数据。
表3 MBTiles各显示级别参数列表
显示级别 |
地图宽高 (像素) |
切片数量 |
地面分辨率(米 / 像素) |
地图比例尺(96 dpi) |
0 |
256 |
1 |
156543.033928 |
1:591658710.909131 |
1 |
512 |
4 |
78271.516964 |
1:295829355.454566 |
2 |
1024 |
16 |
39135.758482 |
1:147914677.727283 |
3 |
2048 |
64 |
19567.879241 |
1:73957338.863641 |
4 |
4096 |
256 |
9783.939621 |
1:36978669.431821 |
5 |
8192 |
1024 |
4891.969810 |
1:18489334.715910 |
6 |
16384 |
4096 |
2445.984905 |
1:9244667.357955 |
7
|
32768 |
16384 |
1222.992453 |
1:4622333.678978 |
8 |
65536 |
65536 |
611.496226 |
1:2311166.839489 |
9 |
131072 |
262144 |
305.748113 |
1:1155583.419744 |
10 |
262144 |
1048576 |
152.874057 |
1:577791.709872 |
11 |
524288 |
4194304 |
76.437028 |
1:288895.854936 |
12 |
1048576 |
16777216 |
38.218514 |
1:144447.927468 |
13 |
2097152 |
67108864 |
19.109257 |
1:72223.963734 |
14 |
4194304 |
268435456 |
9.554629 |
1:36111.981867 |
15 |
8388608 |
1073741824 |
4.777314 |
1:18055.990934 |
16 |
16777216 |
4294967296 |
2.388657 |
1:9027.995467 |
17 |
33554432 |
17179869184 |
1.194329 |
1:4513.997733 |
18 |
67108864 |
68719476736 |
0.597164 |
1:2256.998867 |
19 |
134217728 |
274877906944 |
0.298582 |
1:1128.499433 |
20 |
268435456 |
1099511627776 |
0.149291 |
1:564.249717 |
21 |
536870912 |
4398046511104 |
0.074646 |
1:282.124858 |
22 |
1073741824 |
17592186044416 |
0.037323 |
1:141.062429 |
|
tiles瓦片数据表中resolution存储时保留11位有效数字(四舍五入)。有效数字:从近似数的左边第一个不为0的数字起,到精确到的数为止,所有的数字叫这个近似数的有效数字(0.00123的有效数字是1,2,3,有效位数是3)。示例如表4所示:
表4 resolution近似值计算示例
resolution实际值 |
数据库存储的近似值 |
156543.03392804097 |
156543.03393 |
0.00029158412279196264 |
0.00029158412279 |
1.19432856695587 |
1.1943285670 |
|
Java中计算resolution的参考代码如下:
public static String getResolutionString(double resolution) {
int n = (int) Math.log10(resolution);
int precision = 11;
if (resolution < 1.0) {
n--;
}
int scale = precision - 1 - n;
return new BigDecimal(resolution).setScale(scale, BigDecimal.ROUND_HALF_UP).toString();
}