基於 MBTiles 規範擴展的緩存文件格式說明

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

metadataArch.png

圖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所示:

tilesArch.png

圖2 瓦片數據表的表結構

瓦片數據的表內容舉例如圖3:

tilesSamp.png

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

    }

相關文章
相關標籤/搜索