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技术快速搭建一个矢量切片服务示例。
-
Geospatial Data Source(With some data)
💡 提供下载的是矢量数据,不是最终地图,与符号化后的地图再可视化表达上存在一定差异。用户利用此数据编制地图,应当严格执行《地图管理条例》有关规定;编制的地图如需向社会公开的,还应当依法履行地图审核程序。
💡 数据仅供学习研究使用
-
Tiles API Service(Backend)
-
Geo Atlas Dashboard(Frontend)
请确保你已经安装好了Java, Maven, Docker以及Docker Compose。 我测试使用Wsl2(Windows11) + Docker Desktop(4.30.0) + Apache Maven 3.8.7 + Oracle jdk 11.0.20
-
克隆代码
git clone --recursive https://github.com/geoatlas-cloud/geo-atlas.git cd geo-atlas/
-
配置环境变量
cp .env.production.local.template .env.production.local
然后手动修改配置文件, 将其中的配置项修改为你自己的配置,如:
- HOST_IP:宿主机IP
- POSTGRES_PASSWORD:PostgreSQL数据库初始化密码
- JASYPT_ENCRYPTOR_PASSWORD:用于加密数据库账户信息的密钥
- CACHE_ENABLED:是否开启缓存
- NEXT_PUBLIC_BASE_MAP_TYPE:地图类型, osm|tianditu
- NEXT_PUBLIC_BASE_MAP_TILE_KEY:当使用天地图时需要填写key,4490经纬度投影默认使用天地图,如果需要进行4490经纬度投影预览还请填写天地图Key
-
执行构建脚本, 拉起服务
chmod +x ./build2run.sh ./build2run.sh
等待服务启动完成后访问: http://localhost:11003
, 而后按照GeoServer的使用习惯, 逐步创建
- namespace
- datastore
- feature layer 可通过预览的方式检查瓦片服务是否正常
默认给出的数据为我国的境界与政区数据, 来自省市县数据CTAmap, 源自1:100万公众版基础地理信息数据(2021) 其实我也曾提取过境界与政区数据(全国1:100万基础地理信息数据-境界与政区提取), 不过与上述数据相比而言比较粗糙, 后由于时间关系没有进行细化, 所以没有使用
在提供境界与政区数据的同时, 还支持切换为OSM China的数据。 OSM-China数据的处理过程大致为: 将源数据通过Osm2pgsql入库, 而后使用pg_dump制作转储文件, 并基于此转储文件制作PostGIS镜像, 在容器初始化的时候会自动恢复数据。 但是转储后的文件比较大, 导致镜像也比较大, 同时数据比较多导致恢复的时候比较慢。如果将其作为示例中的数据源的话, 那么三个服务全部启动完成耗时估计得有5分钟了, 所以并未将其作为默认得数据源。
如果你想要使用OSM的数据测试, 可以将其作为额外的数据源进行连接, 这样就不会影响示例应用的初步体验了
指南
点击图片跳转B站
技术概览
基于GeoTools、GeoWebCache进行Geo Atlas构建,基于Spring Boot Framework对外提供快速集成能力。
- GeoTools提供矢量数据读取以及坐标转换能力
- 在此对GeoWebCache进行了拆分为两个部分:分别是金字塔(pyramid, 提供瓦片索引与瓦片生成能力)与瓦片缓存(tile-cache, 提供瓦片缓存能力)
Mapbox Vector Tile Generator 由 java-vector-tile 提供支持
系统架构概述
下图描述了系统的总体架构。
此处更多的表达了内部结构与层次关系,无关部署
组件概述
-
APP
- Geo Atlas Dashboard: 可视化操作界面
- Tiles API Application: 提供矢量切片服务的应用程序(同时支持Dashboard)
-
Boot
- Tiles API Boot Stater: 对Tiles API的快速集成封装, 约定大于配置
-
Component
- Metadata Mgmt: 提供Namespace, Datastore, FeatureLayer元数据管理模块
- Tile Cache: 提供瓦片缓存能力, 目前支持基于内存, 文件系统两种缓存方式, 可任意组合
- OGC APIS: 提供OGC APIs, 目前仅支持Tiles API
-
Library
- Base References: 基础依赖声明
- Pyramid Model: 金字塔模型, 用于构建瓦片金字塔结构索引, 同时提供切片管道
- Tile Generator: 瓦片生成器, 目前仅支持Mapbox Vector Tile Generator
-
External Data Sources
- Config Storage: 用于存储Namespace, Datastore, FeatureLayer等元数据
- Geospatial Data Source: 用于存储矢量数据, 如PostGIS、SQLServer
构建
-
克隆代码
git clone --recursive https://github.com/geoatlas-cloud/geo-atlas.git cd geo-atlas/
-
要构建应用程序,请从根项目目录运行以下命令, 或者使用IDEA的Maven插件
mvn clean install -DskipTests
运行调试
-
配置环境变量, 默认使用dev环境(当然,你可以直接修改dev.yml文件, 而不是通过环境变量控制)
-
自行用IDEA打开项目,然后运行Application类。
支持
声明与致谢
- Geo Atlas现版本参照GeoServer应用模式构建,并参考了GeoServer以及GeoServer Cloud的实现方式
- Pyramid、IO(in Library)、Tile Cache模块均来自GeoWebCache, 是对其进行了拆解和少量变更
- 矢量数据的读取与坐标转换使用GeoTools
- Mapbox Vector Tile Generator由 java-vector-tile 提供支持