之前咱们分享过如何 在本地公布 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/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。