关于gis:发布-mbtiles-存储的矢量瓦片

70次阅读

共计 3019 个字符,预计需要花费 8 分钟才能阅读完成。

之前咱们分享过如何 在本地公布 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 外部的解决形式大略是:

  1. 先将 pbf 瓦片拼起来,读取拼接后的各图层原始数据
  2. 把图层原始数据公布成 geoserver 的矢量瓦片服务
  3. 前台调用矢量瓦片服务时,geoserver 把数据处理成 pbf 文件返回给前台

怎么说呢,这么做和把 pbf 文件间接扔给前台相比,后果是一样的,但就是感觉 geoserver 的戏太足,内耗太重大,还有就是这个发服务的操作过程也很麻烦。

只能说,这个插件针对矢量瓦片的设计,仅是用来读取原始数据的,不适宜用来公布数据。

java 我的项目

再看 java 这边。

在 github 上搜了一下,找到了这个我的项目:mbtiles4j(https://github.com/jtreml/mbtiles4j)。

是个现成的 java 工程,拉取下来钻研了一下,逻辑很简略,就是间接读取 mbtiles 中的瓦片返回给前台,这一点很符合要求,美中不足的是,这个我的项目是针对栅格瓦片的,默认只反对 .png 文件,不反对 .pbf

这个好说,有源码,改改就是了。

改完后发现,前端地图不显示,瓦片申请地址报 404,

将申请地址中的瓦片编号和 mbtiles 库中的瓦片编号对了一下,的确没有。

为啥呢?

哈哈,这个我有教训,继续关注咱们的同学还记不记的,我之前分享过对于 如何让 maputinik 反对 geoserver 的问题,外面最要害的一点就是设置 mapboxgl 申请瓦片的模式 scheme,模式包含 xyztms,默认应用 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

总结:

  1. 本地公布的 OSM 矢量瓦片地图,生成的矢量瓦片寄存在 mbtiles 文件中
  2. 公布 mbtiles 中的矢量瓦片,目前支流的形式是 tileserver-gl,它基于 nodejs 开发的
  3. geoserver 有个读取 mbtiles 的插件,但它针对矢量瓦片的设计是用来读取 pbf 中原始数据的,不适宜用来公布数据。
  4. github 上有个 mbtiles4j 的我的项目,java 开发的,稍加批改后,能够用来间接公布 mbtiles
  5. mapboxgl 应用公布的地图瓦片时,须要设置数据源的 maxzoom 属性。

原文地址:http://gisarmory.xyz/blog/index.html?blog=OSMMbtiles。

关注《GIS 兵器库》公众号,第一工夫取得更多高质量 GIS 文章

本文章采纳 常识共享署名 - 非商业性应用 - 雷同形式共享 4.0 国内许可协定 进行许可。欢送转载、应用、从新公布,但务必保留文章署名《GIS 兵器库》(蕴含链接:http://gisarmory.xyz/blog/),不得用于商业目标,基于本文批改后的作品务必以雷同的许可公布。

正文完
 0