Cesium加載MBTiles矢量切片

MBTiles 是由 MapBox 制定的一種將瓦片地圖數據存儲到SQLite數據庫中並可快速使用,管理和分享的規範。該規範由MapBox制定,詳見http://mapbox.com/mbtiles-spec/。 透過數據庫索引的方式提高瓦片索引的效率,比通過瓦片文件方式的讀取要快的多。MBTiles其實只是一個SQLite數據庫文件,優點在於小,方便遷移,可以存在於移動端。
MBTiles切分後的文件格式爲pbf格式,切片座標形式爲z/x/y,在SQLite中存儲形式如下:
sqlite> SELECT * FROM tiles;

zoom_level | tile_column | tile_row | tile_data
5 | 13 | 23 | [PNG data]
5 | 13 | 24 | [PNG data]
5 | 14 | 23 | [PNG data]
5 | 14 | 24 | [PNG data]
5 | 15 | 25 | [PNG data]

cesium加載矢量文件通過加載geojson(或者czml等格式,大多通過geojson)來實現。如果geojson數據量太大,會造成繪製緩慢,影響用戶體驗,並且繪製數量有限度,太大瀏覽器容易崩潰,所以需要對大數據量geojson進行分級分塊。

首先將geojson轉換成mbtiles文件,mbtiles文件可以用mapbox的mbview在線查看https://github.com/mapbox/mbview;將mbtiles文件放在examples文件下,執行try.sh,之後瀏覽器會自動打開一個端口號3000的網址,可以看到mbtiles的切分效果。其實try.sh裏面只有兩條命令,一個是用npm下載mbview模塊,另一條是執行切分命令,所以爲了避免每次都要執行下載mbview命令,可以先下載全局mbview模塊,以後就可以只執行mbview xxx.mbtiles。

先取第一級的4個pbf文件進行cesium加載,第一級文件分別命名爲1.0.0.pbf,1.0.1.pbf,1.1.0.pbf,1.1.1.pbf.然後用nodejs寫一個接口服務,解析pbf轉成geojson發送到前端。主要解析代碼如下:

var dic = 'data/isoline/1.'+i+'.'+j+'.pbf';
            var pbf = fs.readFileSync(dic);
            var tile = new VectorTile(new Protobuf(pbf));
            for (var key in tile.layers) {
                //console.log(key);
                var lyr = tile.layers[key];
                lyr.parsedFeatures = [];
                var features = lyr._features;
                for (var k = 0, len = features.length; k < len; k++) {
                    var vtf = lyr.feature(k);
                    var geojson = vtf.toGeoJSON(i, j, 1);
                    coorArray.push(geojson);
                }
            }

之後在前端通過ajax請求geojson進行分級分塊繪製即可。

主要流程爲:大geojson->mbtiles->小geojson,通過mbtiles來實現分割。由於cesium的矢量瓦片計劃仍在進行中, 目前只能通過這種方式迂迴實現,期待能有更好的方式來實現加載大數據矢量。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章