MBTiles 是由 MapBox 制定的一種將瓦片地圖數據存儲到SQLite數據庫中並可快速使用,管理和分享的規範。該規範由MapBox制定,詳見http://mapbox.com/mbtiles-spec/。html
SuperMap iServer爲了知足自身應用的需求,不只支持生成和使用知足MBTiles規範的瓦片地圖數據,而且基於原規範對MBTiles中的內容進行了擴展。擴展後的.mbtiles文件支持任意座標系,支持任意分辨率,支持JPG和PNG混合格式的地圖瓦片數據。java
擴展後的.mbtiles文件仍然使用元數據表」metadata」和瓦片數據表」tiles」來對瓦片地圖數據進行管理。數據庫
metadata元數據表採用鍵值對的形式來存儲地圖瓦片數據的相關設置,包括兩個文本類型的字段」name」和」value」,與MBTiles 1.1規範一致。表結構如圖1所示:json
圖1 元數據表的表結構緩存
元數據表的內容舉例如表1所示:spa
表1 元數據表舉例orm
namehtm |
valueip |
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_directionci |
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();
}