Geo Atlas,用于构建矢量切片服务的Java基础库
Geo Atlas 是什么? Geo Atlas,译为地理地图册(地理地图集),就像小时候买到的纸质的地理地图册书本,里面填充着各式各样的地图。所以, 我也希望有那么一个东西,同样可以对外提供各种各样的地图以供使用。 目前来说,他还只是一个基于Java的开发的,可用于快速构建矢量切片服务的基础库。 本例中基于Geo Atlas实现了一个精简版本的矢量切片服务,从结果来看,可以将其看作为仅实现了矢量切片功能的GeoServer的精简提升版本。 背景与动机 首先,我是一个主做服务端开发的GIS开发工程师,平时接触最多的就是管网地图服务发布。此前的工作中没有使用任何平台技术,比如:ArcGIS、超图等,而是使用开源技术。技术栈大体可以总结为:SpringBoot + GeoServer + Mapbox + 空间数据库。 其次,目前在业务应用上,二维地图还是主流。而二维地图技术里面,属Mapbox Vector Tile的体验最好。所以,目前的技术路线是通过 GeoServer 来发布Vector Tile。 然后,在 GeoServer 使用中,我发现了这个几个问题: 受限于其开源协议(GPL 2.0)的约束,你无法通过修改部分源代码的方式,将其直接集成到系统内部。只能是单独部署,通过其提供的REST接口进行交互。基于此,部署方式同样受限。 GeoServer 是一个大而全的东西,同时他是一个单体项目。也就是说,哪怕我只需要提供MWTS+MVT服务,我也需要部署一个全功能的节点,无法按需使用(这里不得不提一下GeoServer Cloud项目,但是它提出得要求更多了,需要一套微服务的环境) 从公谨《WebGIS数据不切片或是时代必然》一文推论,GeoServer中提供的MVT技术(指数据切片过程)已经算是切片起源时代的产物了,而今已经跨过了矢量切片时代(数据还是预切),进入了动态矢量切片时代了 GeoServer中Vector Tile与GeoWebcache中的Tile Meta技术有冲突,瓦片清理存在BUG。可以理解为,GeoServer对于矢量瓦片的支持并不是很好。 不能很好的处理瓦片缓存与动态业务数据的矛盾,即使GeoWebcache提供缓存清理的策略。(Layer中Boundingbox范围问题) GeoServer完全是栅格金字塔技术的实现,不过是将栅格金字塔技术同时应用在栅格数据和矢量数据上,同时他并没有很好的针对不同层级对数据进行抽稀简化(其尝试从服务端配图SLD中获取数据分级规则,我没有测试过,但反对,理由参见: 关于矢量瓦片技术支持前端渲染带来的思考),那么就出现了一个pbf有近20M的情况。同时也回答了为什么现在大家都直接在数据库层面实现矢量瓦片(或者说是在数据源中),一是可以无视数据传递的时间损耗;二是可以直接做抽稀简化,这样出去的数据少了,传输速度自然也快了;三是数据库空间支持已经很成熟了;四是门槛高啊(护城河) 最后,我也想对我目前的状态做一次总结。那么,Geo Atlas应该就是我最好的总结方式。因为它既可以丰富我的简历🫣,又可以帮助我绘制技能树,完成这一次的总结。 ps: 当然,还有当下信创的背景原因。就当,抛砖引玉了😧,哈哈哈😬 特性 遵循 OGC Two Dimensional Tile Matrix Set and Tile Set Metadata Standard 2.0 [并不完全遵循] 尝试遵循 NEW OGC API 提供矢量切片能力 支持自定义数据属性分级规则 支持Google瓦片坐标系(原点在左上角, 默认即为Google瓦片坐标系) 支持3857(900913), 4490投影(即默认提供相应的TileMatrixSet) 支持自定义坐标系及自定义坐标转换行为(源数据坐标系) 支持自定义数据范围(OGC TileMatrixSet Limits,拒绝范围外请求) 提供全局统一的,可快速集成的瓦片缓存组件, 支持基于内存和文件系统的缓存 支持使用GeoPackage进行缓存 支持Seed, Reseed, Truncate三种瓦片缓存处理策略 提供Namespace, Datastore, FeatureLayer元数据管理模块,并提供一个可视化操作界面(Geo Atlas Dashboard) 提供栅格数据切片能力 提供地形数据切片能力 提供按需快速集成能力(将常用功能封装为各种stater) 截图 快速开始 以下说明旨在基于Docker技术快速搭建一个矢量切片服务示例。...