发布 mbtiles 存储的矢量瓦片
之前我们分享过如何 在本地发布OSM矢量瓦片地图,里面介绍了生成的矢量瓦片会存放在 .mbtiles 文件中,然后用 tileserver-gl 软件发布。
mbtiles 是基于sqllite数据库存储地图瓦片数据的标准规范,
.mbtiles文件就是实现了这个规范的sqllite数据库。
最近遇到个相关的问题,项目上需要将这份.mbtiles格式的矢量瓦片部署到客户服务器上并发布。
之前分享过我在用的 开源GIS解决方案,里面将 postgis、geoserver、tomcat 都搞成了绿色版,并且可以通过批处理脚本将它们一键注册成系统服务,这样就形成了一个套开源GIS的绿色版安装包,部署时会很方便。
这套安装包的整体技术架构是偏 java 的,而这次发布矢量瓦片用到的 tileserver-gl 是基于 nodejs 开发的,按上面的思路,需要将 nodejs 也搞成绿色版的,并且可以使用批处理注册成系统服务。
因为不想把安装包搞的太大,也不想用太多的技术体系,让后期维护变得复杂,所以就想能不能在现有的技术体系下搞定 .mbtiles 发布的问题。
按这个思路,需要去研究有没有相关的geoserver插件,或是 java 的软件或项目。
下面是我研究的具体过程,不想看过程的同学可以直接跳到末尾看总结。
geoserver插件
先研究了geoserver插件,还真有。
geoserver有个mbtiles的扩展插件(https://docs.geoserver.org/latest/en/user/community/mbtiles/index.html),支持对.mbtiles文件的读写。
geoserver 安装 mbtiles 插件的教程可以参考这篇:https://blog.csdn.net/dyxcome/article/details/98375453
从官网下载插件,安装测试后,发现跟想的有点不一样。
geoserver安装完插件后,新建数据源的界面多了两个 mbtiles 相关的选项,如下图,上面的是发布矢量瓦片,下面的是发布栅格瓦片。

我用第二个红框,发布栅格瓦片的选项,发布了下矢量瓦片,会报错。
用第一个红框,发布矢量瓦片的选项,可以走的通,但就是过程有点曲折,需要把 pbf 中的图层再挨个发布一遍。

.mbtiles 文件中存的是处理好的 pbf 文件,按说插件只需要根据请求参数,从 sqllite 数据库中查询 pbf 文件,返回给前台就 ok 了。
但 geoserver 不是这么做的,它是将 .mbtiles 文件中的 pbf 瓦片作为矢量数据源来使用,类似于读取 .mdb 文件。
可以推理出,geoserver 内部的处理方式大概是:
- 先将
pbf瓦片拼起来,读取拼接后的各图层原始数据 - 把图层原始数据发布成 geoserver 的矢量瓦片服务
- 前台调用矢量瓦片服务时,geoserver 把数据处理成
pbf文件返回给前台
怎么说呢,这么做和把 pbf 文件直接扔给前台相比,结果是一样的,但就是感觉 geoserver 的戏太足,内耗太严重,还有就是这个发服务的操作过程也很麻烦。
只能说,这个插件针对矢量瓦片的设计,仅是用来读取原始数据的,不适合用来发布数据。
java项目
再看 java 这边。
在 github上搜了一下,找到了这个项目:mbtiles4j(https://github.com/jtreml/mbtiles4j)。
是个现成的 java 工程,拉取下来研究了一下,逻辑很简单,就是直接读取 mbtiles 中的瓦片返回给前台,这一点很符合要求,美中不足的是,这个项目是针对栅格瓦片的,默认只支持 .png 文件,不支持 .pbf 。
这个好说,有源码,改改就是了。
改完后发现,前端地图不显示,瓦片请求地址报 404 ,
将请求地址中的瓦片编号和 mbtiles 库中的瓦片编号对了一下,确实没有。
为啥呢?
哈哈,这个我有经验,持续关注我们的同学还记不记的,我之前分享过关于 如何让 maputinik 支持 geoserver的问题,里面最关键的一点就是设置 mapboxgl 请求瓦片的模式 scheme,模式包括 xyz 和 tms,默认使用 xyz 。
难道 openmaptile 生成的这个 mbtiles 文件是按 tms 存储的?试一下就知道了
果然 ~ 没那么简单,地图还是没有出来,但瓦片可以请求到了,看来确实是 tms 的。
事后简单翻了一下 mbtiles 规范,里面有明确写到,数据源是以 tms 格式来存储的。
看来还是要多研究标准规范和说明文档。
但为啥地图还是没有出来呢?
对比了下 tileserver-gl(下图左) 和 mbtiles4j(下图右) 的返回参数,发现了问题所在。

pbf 文件是采用 gzip 压缩过的,需要在返回参数中明确告知返回内容的类型是 gzip,而刚才将 mbtiles4j 中的png 改成 pbf 后,没有加这个设置。
加上试试,哈哈,搞定。

这个通了,剩下的就简单了,工程编译成 war 包,直接扔到tomcat下就可以了。
大比例时地图显示
本来以为可以收工了,但浏览地图时发现了另一个问题。
我的地图只切到了14级,因为在矢量瓦片中,14级包含的内容就已经很细了,所以没有必要再往下切。
但用地图浏览时,超过14级后,因为后台没有对应的瓦片,前台就请求不到数据,地图就不显示了。
用 tileserver-gl 发布同样的 mbtiles 文件,再用它的默认地图查看器浏览地图,就没有这个问题。
看来后台需要把超过14级的请求参数处理一下,超过14级时,直接返回14级的瓦片。
翻了翻 tileserver-gl 的代码,并没有找到相关的逻辑。
在同事的提醒下,发现 tileserver-gl 的默认地图查看器,它的前台请求在超过14级时,是按14级来请求的,这说明我要找的逻辑是在前台完成的。
去翻 tileserver-gl 的地图样式配置,和我自己的配置对比后发现,对数据源设置 maxzoom 就可以解决这个问题。

看一下官网的解释,大概意思是,如果你设置maxzoom=14,那么当地图缩放超过14级时,地图仍然会使用14级的瓦片。

这个设置正是我要的。
我把改完后的后台代码上传到了github,方便以后遇到同样问题的同学使用。
源码:
地址:http://gisarmory.xyz/blog/index.html?source=OSMMbtiles
总结:
本地发布的OSM矢量瓦片地图,生成的矢量瓦片存放在 mbtiles 文件中
发布mbtiles 中的矢量瓦片,目前主流的方式是 tileserver-gl ,它基于nodejs开发的
geoserver有个读取 mbtiles 的插件,但它针对矢量瓦片的设计是用来读取 pbf 中原始数据的,不适合用来发布数据。
github上有个 mbtiles4j 的项目,java 开发的,稍加修改后,可以用来直接发布 mbtiles
mapboxgl 使用发布的地图瓦片时,需要设置数据源的 maxzoom 属性。
原文地址:http://gisarmory.xyz/blog/index.html?blog=OSMMbtiles。
关注《GIS兵器库》公众号, 第一时间获得更多高质量GIS文章。

本文章采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名《GIS兵器库》(包含链接: http://gisarmory.xyz/blog/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。
发布 mbtiles 存储的矢量瓦片的更多相关文章
- 如何让矢量瓦片配图神器maputnik支持 geoserver
关键词:maputnik.geoserver.矢量地图.矢量瓦片.mapbox.mapboxgl.地图配图.地图配色 一直想搞一个类似百度.高德地图那样的矢量地图配图工具 百度个性化地图配图工具: 高 ...
- geotrellis使用(三十四)矢量瓦片技术研究——矢栅一体化
前言 本文所涉及技术与Geotrellis并无太大关系,仅是矢量瓦片前端渲染和加载技术,但是其实我这是在为Geotrellis的矢量瓦片做铺垫.很多人可能会说,Geotrellis为什么要搞矢量瓦片, ...
- geoserver矢量瓦片发服务前端展示偏移问题解决
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/. 在之前的<项目角度谈矢量切片运用以及Geoserver处理自定义 ...
- leaflet-webpack 入门开发系列六矢量瓦片(附源码下载)
前言 leaflet-webpack 入门开发系列环境知识点了解: node 安装包下载webpack 打包管理工具需要依赖 node 环境,所以 node 安装包必须安装,上面链接是官网下载地址 w ...
- Mapbox矢量瓦片标准(mapbox vector-tile-spec)
目录 1. 目标 2. 文件格式 2.1. 文件后缀 2.2 MIME类型 3. 投影和范围 4. 内部结构 4.1. 图层 4.2. 要素 4.3. 几何图形编码 4.4. 要素属性 4.5. 示例 ...
- openlayers6结合geoserver实现地图矢量瓦片(附源码下载)
内容概览 1.基于openlayers6结合geoserver实现地图矢量瓦片2.源代码demo下载 效果图如下: 实现思路:利用Geoserver发布矢量切片服务,然后openlayers调用矢量瓦 ...
- CAD/DWG图Web网页可视化技术之栅格和矢量瓦片
背景 在上一篇博文中CAD图DWG解析WebGIS可视化技术分析总结提到,实现CAD/DWG图形Web展示的思路一般为解析AutoCAD图形格式,然后转成html5所能绘制的格式如svg,geojso ...
- cesium 入门开发系列矢量瓦片加载展示(附源码下载)
前言 cesium 入门开发系列环境知识点了解:cesium api文档介绍,详细介绍 cesium 每个类的函数以及属性等等cesium 在线例子 内容概览 cesium 实现矢量瓦片加载效果 源代 ...
- iNeuOS工业互联网操作系统,发布实时存储方式:实时存储、变化存储、定时存储,增加设备振动状态和电能状态监测驱动,v3.6.2
目 录 1. 概述... 1 2. 平台演示... 2 3. 存储方式... 2 4. 设备状态和用电状态监控驱动... 3 1. 概述 本次升 ...
随机推荐
- 高德纳/Donald Ervin Knuth
丸了丸了这位就是我人生的第一位爱豆了owo 感觉他的经历,气质都是我期望的类型呀. 即使没有人家的智商和绝顶天赋,也不断向彼努力吧. 从小喜欢音乐,会多种乐器(管风琴) 其实长得人高马大,高中校篮球队 ...
- 关于hashcode和equals方法说明
一.前言 我们都知道,要比较两个对象是否相等时需要调用对象的equals()方法,即判断对象引用所指向的对象地址是否相等,对象地址相等时,那么与对象相关的对象句柄.对象头.对象实例数据.对象类型数据等 ...
- SSM框架,在Html界面利用ajax,json,jQuery实现省市区下拉框联动
1.先生成省市区表格 2.建立实体类 3.在html画出下拉框 <select id="province"> <option value="" ...
- 痞子衡嵌入式:深扒i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRTxxx系列ROM中集成的串行NOR Flash启动SW Reset功能及其应用场合. 在串行 NOR Flash 热启动过程 ...
- 如何生成effective-pom
effective-pom是什么?我们知道任何一个项目的pom都至少继承了maven内置的超级pom,有些项目中的用户还会配置自己的继承层次,也就是说,但从当前的pom是无法全面了解项目信息的,你必须 ...
- VUE SpringCloud 跨域资源共享 CORS 详解
VUE SpringCloud 跨域资源共享 CORS 详解 作者: 张艳涛 日期: 2020年7月28日 本篇文章主要参考:阮一峰的网络日志 » 首页 » 档案 --跨域资源共享 CORS 详解 ...
- 正则:支持6-20位数字、字母和特殊字符(仅限!@#$%^&*())
checkpwd(newpsd); function checkpwd() { var newpsd = $(":input[name='newpsd']").val(); var ...
- Hadoop 3.1.1 - 概述 - 集群安装
Hadoop 集群安装 目标 本文描述了如何从少数节点到包含上千节点的大规模集群上安装和配置 Hadoop 集群.如果只是为了尝试,你可以先从单台机器上安装开始(参阅单节点安装). 本文并不包含诸如安 ...
- Vulnhub -- DC3靶机渗透
@ 目录 信息收集 尝试攻击 获取shell方法1 获取shell方法2 获取shell方法3 拿到root权限 拿FLAG 总结 信息收集 kali的ip为192.168.200.4,扫描出一个IP ...
- 洛谷P3067题解
题面 首先,对于每个数,有三种状态:选入集合A,选入集合B,或者不选入集合.暴力枚举的时间复杂度是 \(O(n\times3^n)\) ,显然跑不过去. 因此考虑 \(\text{Meet in Mi ...