# MBTiles
MBTiles是指由MapBox制定的一种将瓦片地图数据存储到SQLite数据库中并可快速使用,管理和分享的规范。它使得数以百万的瓦片数据存储在一个文件中,而且SQLite数据库支持多种平台,所以使用MBTiles在移动设备上浏览瓦片数据是比较理想的方式。
MBTiles 既可以用作栅格输入数据存储,也可以用作WMS GetMap 输出格式。
MBTiles 单个文件比较容易迁移,搜索效率也更高(透过数据库索引的方式提高瓦片索引的效率)。
## 特点
- 遵循 TMS 规范。即原点坐标为左下角,向北,向东增长。
- 只支持 Web Mercator 投影(EPSG:3857 或 EPSG:900913)。
- 瓦片尺寸为 256 X 256。支持格式:
pbf、
jpg、png、webp
或其他格式的 IETF 媒体类型(
MBTiles 1.3标准)
。 - 通过建立视图,减少重复瓦片的存储,减少数据大小。
- 后缀名为.mbtiles,可以通过一般的 SQLite 查看器查看,也可通过GIS软件(如GlobalMapper、QGIS(支持矢量的mbtiles))。
- 瓦片比例尺固定。参照下表。
💡 MBTiles原则上仅支持Web墨卡托投影,但如果一定要存储WGS84坐标系的地图瓦片,在GlobalMapper、QGIS中一样可以打开,只是在显示地图时会动态投影为Web墨卡托 [来源]
# SQLite中的MBTiles
## 一、原理
MBTiles格式的地图瓦片是通过元数据表Metadata(必需)和tiles视图(必需),map数据表,images数据表一起管理地图瓦片数据。
Metadata元数据表是采用键值对的形式来存储地图瓦片数据的相关设置,如瓦片名称、版本号、地理范围、坐标系等。
map数据表包含了用于定位瓦片数据的值和瓦片id
images数据表包含瓦片id和瓦片数据。
tiles视图包括所有的瓦片数据和用于定位瓦片数据的一些值,MBTiles 通过拆分瓦片索引和瓦片原始图像的存储,使用视图的方式来关联二者,这样成千上万的瓦片索引就可以指向同一个瓦片图像,从而大大减少纯色瓦片的冗余存储,提升磁盘利用率以及瓦片检索效率。
## 二、案例
在SQLite中导入一个mbtiles文件,各表情况如图所示:
![](https://i-blog.csdnimg.cn/blog_migrate/54451d696ead4a758c5c0399cee7f389.png)
![](https://i-blog.csdnimg.cn/blog_migrate/d4a90b4d5f7f8696e7cd825077f2da51.png)
![](https://i-blog.csdnimg.cn/blog_migrate/5b2b145f358a99097c7096bc65e6a4e3.png)
该数据中共有2688张图片,map表有2688行,images表有1411行,tiles视图有2688行(即颜色完全相同的瓦片只存储一次,避免数据的冗余存储
MBTiles通过新建视图表的方法,在不影响地图瓦片显示效果的前提下,有效地解决了数据的冗余存储问题。
# 数据生成
## 一、QGIS
用途:影像 / 矢量 数据 → 散列式文件、mbtiles(pbf / png / jpg)
注:矢量数据——pbf(可以通过栅格工具切成png、jpg);影像数据——png、jpg;
## 二、tippecanoe
用途:矢量数据 → 散列式文件、mbtiles
GitHub:GitHub - mapbox/tippecanoe
输入数据格式:GeoJSON、Geobuf 或 CSV
Windows 安装教程:windows下使用tippecanoe把GeoJSON制作成矢量切片vectortile
## 三、MBUtil
用途:散列式文件 ⇋ mbtiles
mapbox的mbutil 支持把本地散列式瓦片打包为 mbtiles 格式(反过来也可以)。
Step 1:下载 GitHub - mapbox/mbutil: Importer and Exporter of MBTiles
Step 2:cmd进入文件夹,安装 python setup.py install
Step 3:在该文件夹下使用命令
# 散列式文件 → mbtiles (指定不存在的文件路径 D:\mbtiles\MyTileData.mbtiles
python mb-util D:\MyTileData\ D:\mbtiles\MyTileData.mbtiles
# mbtiles → 散列式文件(指定不存在的文件夹路径 D:\newTileData\
python mb-util D:\mbtiles\MyTileData.mbtiles D:\newTileData\
命令的参数选项:
Options:
-h, --help Show this help message and exit
--scheme=SCHEME Tiling scheme of the tiles. Default is "xyz" (z/x/y),
other options are "tms" which is also z/x/y
but uses a flipped y coordinate, and "wms" which replicates
the MapServer WMS TileCache directory structure "z/000/000/x/000/000/y.png"''',
and "zyx" which is the format vips dzsave --layout google uses.
--image_format=FORMAT
The format of the image tiles, either png, jpg, webp or pbf
--grid_callback=CALLBACK
Option to control JSONP callback for UTFGrid tiles. If
grids are not used as JSONP, you can
remove callbacks specifying --grid_callback=""
--do_compression Do mbtiles compression
--silent Dictate whether the operations should run silently
注:默认未压缩,如果数据中有较多同样的冗余图片,使用压缩才有用。
教程:MBUtil实现mbtiles文件和地图切片之间的格式转换
# 发布
## 一、GeoServer
用途:发布 矢量/ 栅格 mbtiles
所需安装插件: 1、WPS插件; 2、MBTiles插件
1️⃣ WPS插件
下载地址:http://geoserver.org/release/2.20.0/ (根据版本号修改url即可
将下载后的jar包放入/webapps/geoserver/WEB-INF/lib(有重复的文件选择跳过),重启geoserver即可
2️⃣ MBTiles插件
下载地址:https://build.geoserver.org/geoserver/(选择相应版本后进入community文件夹
注:该网站现在只提供 2.18.x —— 2.23.x
(1)如果只是想读取MBTiles文件,则下载 mbtiles-store-plugin;
(2)如果还想使用WMS输出MBTiles格式,则下载 mbtiles-plugin ;(注:请确保在安装此插件之前为GeoServer实例安装相应的WPS扩展,否则GeoServer将不会启动
Linux数据绝对/相对路径:file:///home/mydata/xxx.mbtiles 或 file:data/xxx.mbtiles
Windows数据绝对/相对路径:file:W:\mydata\xxx.mbtiles 或 file:data/xxx.mbtiles
其它
注意:在使用wms访问发布的mbtiles数据时,在缩放等级比较高,范围比较大的情况下,Geoserver不会返回数据,应该是内部有处理切片数量的显示 [链接]
## 二、mbtiles-server(by DenisCarriere)
用途:发布 mbtiles(png / jpg / pbf)
GitHub:https://github.com/DenisCarriere/mbtiles-server
Step 1:以管理员方式进行cmd,运行 npm install -g mbtiles-server [链接](nodejs版本:8.x
Step 2:运行命令( --verbose 表示可以在控制台看到执行结果
# 注:只能获取F:\mbtiles文件夹下的mbtiles,无法获取其下子文件夹的mbtiles
mbtiles-server --cache F:\mbtiles --port 6677 --verbose
启动后,可在浏览器输入 http://localhost:6677/
Step 3:前端访问路径
http://localhost:6677/data1/{z}/{x}/{y}.png
http://localhost:6677/data1/{z}/{x}/{y}
注:使用cesium能加载png格式的、但jpg似乎有点问题;
教程:栅格瓦片转mbtiles文件离线部署_栅格转mbtile
## 三、mbtiles-server(by chelm)
用途:发布 mbtiles(仅png格式)
GitHub: https://github.com/chelm/mbtiles-server
示例:mbtiles-server将mbtiles或地图切片发布成地图服务
Step 1:下载解压包,以管理员方式打开cmd,运行 npm install(nodejs版本:8.x
Step 2:cmd 运行命令
# 似乎不支持绝对路径,只支持发布一个mbtiles
node server.js ./myTestData.mbtiles 6677
Step 3:前端访问路径
http://localhost:6677/{z}/{x}/{y}.png
## 四、TileServer GL
GitHub:GitHub - maptiler/tileserver-gl
# 客户端调用
## 一、leaflet
leaflet提供了专门在客户端打开mbtiles的引用库
代码参考:Leaflet加载MBTiles离线瓦片数据_做GIS梦的人-CSDN博客
## 二、openlayers
以WMTS、TMS服务形式调用,可参考:OpenLayers:加载GeoServer发布的WMTS、TMS服务。
## 三、cesium
以WMTS、TMS、WMS等服务形式调用
/* Geoserver发布,以WMTS形式加载*/
const matrixIds = new Array(19);
for (let z = 0; z < 19; ++z) {
matrixIds[z] = "EPSG:900913:" + z;
}
let wmtsImageryProvider = viewer.imageryLayers.addImageryProvider(
new Cesium.WebMapTileServiceImageryProvider({
url : 'http://localhost:8080/geoserver/gwc/service/wmts',
layer : 'workSpace:tianhe',
style : 'raster',
format : 'image/png',
tileMatrixSetID : 'EPSG:900913',
tileMatrixLabels : matrixIds
})
);
/* Geoserver发布,以TMS形式加载 */
let tmsLayer = viewer.imageryLayers.addImageryProvider(
new Cesium.TileMapServiceImageryProvider({
url : 'http://localhost:8080/geoserver/gwc/service/tms/1.0.0/workSpace:tianhe@EPSG:900913@png'
})
);
# SMTiles格式数据
由于MBTiles格式数据限制性较多,超图推出了一种MBTiles的扩展格式SMTiles,下面是SMTiles与MBTiles格式的区别:
(1) SMTiles支持任意坐标系、任意比例尺,切片的起算原点为任意指定点,行列号的方向为原点开始向左下递增;
(2) SMTiles格式的地图瓦片的存储类型不仅支持PNG、JPG,还支持PNG和JPG混合格式的瓦片;
SMTiles 格式的地图瓦片存储形式 *.smtiles 文件,命名由地图名、Hashcode、瓦片的宽和高、瓦片格式,T(表示透明)及 .smtiles 后缀组成,如:China_69470548_256X256_PNG_T.smtiles,China_69470548_256X256_PNG.smtiles。
MBTiles与SMTiles 格式的地图瓦片的存储机制基本相同,都是通过元数据表”metadata”,和 tiles 视图,map 数据表,image 数据表一起管理地图瓦片数据,仅在 tiles 视图中略有不同。
# 参考
## MBTiles介绍
MBTiles离线包生成和使用_SuperMap技术控-CSDN博客
瓦片数据MBTiles存储简介_halljoe的博客-CSDN博客
MBTiles 与 SMTiles 格式的地图瓦片_跃然实验室-CSDN博客
MBTiles栅格地图瓦片存储规范说明(图文案例说明
## GeoServer与MBTiles
Geoserver发布mbtiles文件_跃然实验室-CSDN博客_geoserver mbtiles
GeoServer之安装mbtiles插件(reload band definitions
## 报错
BUG GeoServer服务器状态:Could not initialize class sun.awt.X11GraphicsEnvironment