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();
}