在地图可视化领域,矢量瓦片(Vector Tiles)已成为现代 Web 地图的标准格式。面对海量地理数据的实时发布需求,Martin 应运而生------这是一个用 Rust 语言编写的瓦片服务器,专为速度和重负载场景优化,能够从多种数据源动态生成并服务矢量瓦片。
核心能力
Martin 的设计目标是"开箱即用"与"极致性能"的平衡。它支持三种主流瓦片数据源,并允许将它们动态合并为统一的瓦片服务:
1. PostGIS 数据库(动态生成)
连接大型 PostgreSQL/PostGIS 数据库后,Martin 能够自动发现兼容的空间表和返回 MVT(Mapbox Vector Tile)的函数,实时将空间查询结果编码为矢量瓦片。这意味着你的数据更新可以即时反映在地图上,无需预先生成瓦片。
2. PMTiles(本地与远程)
PMTiles 是一种专为 HTTP 范围请求优化的单文件云原生格式。Martin 不仅支持本地 PMTiles 文件,还能通过 HTTP 直接访问远程 PMTiles(如托管在 S3 上的文件),实现无需预部署的轻量级瓦片服务。
3. MBTiles(SQLite 归档)
对于已预生成的静态瓦片包,Martin 可以直接读取 MBTiles 文件(基于 SQLite 的单文件数据库),提供高效的瓦片检索服务。
不止于瓦片:完整的地图资源服务
除了核心的瓦片服务,Martin 还内置了地图样式生态所需的辅助资源生成能力:
- 样式服务(Styles):直接提供 MapLibre 兼容的 JSON 样式文件
- 精灵图生成(Sprites):将 SVG 图标动态合成为 PNG 精灵图
- 字体字形(Font Glyphs):实时生成 PBF 格式的字体切片,支持中文等复杂字符集
这些资源全部按需生成,无需预构建步骤,简化了部署流程。
配套工具链:martin-cp 与 mbtiles
Martin 不仅是服务器,更是一套完整的瓦片工具集:
martin-cp:批量瓦片生成器
需要从动态数据源(如 PostGIS)生成离线可用的瓦片包?martin-cp 可以将任何 Martin 支持的源批量导出为 MBTiles 文件。它支持:
- 指定边界框(BBox)和缩放级别范围
- 多源合并到一个 MBTiles 中
- 并发控制和压缩编码优化(gzip/brotli)
- 自动更新元数据(min/max zoom)
mbtiles:瓦片归档管理工具
mbtiles 命令行工具提供了对 MBTiles 文件的完整生命周期管理:
summary/meta-get:查看文件统计和元数据copy:带边界过滤的瓦片复制diff/apply-patch:生成和应用瓦片差异(增量更新)validate:基于哈希验证瓦片完整性- 支持三种内部 Schema 转换:
flat、flat-with-hash、normalized
架构亮点
Martin 采用 Rust 的异步优先架构(基于 Actix-Web),能够处理数十万并发连接而不阻塞数据库查询。其核心设计包括:
- 模块化 Crate 结构 :
martin-core(核心逻辑)、mbtiles(独立工具)、martin-tile-utils(底层瓦片操作),可嵌入其他 Rust 项目作为库使用 - 连接池管理 :针对 PostgreSQL 使用
deadpool-postgres,避免每次请求新建连接 - 内存缓存:内置基于 Moka 的 LRU 缓存(默认 512MB),显著减少重复瓦片的生成开销
- 零配置发现:启动时自动扫描 PostGIS 表、函数以及目录中的 MBTiles/PMTiles 文件
适用场景
| 场景 | 推荐方案 |
|---|---|
| 实时交通/物流追踪 | PostGIS + Martin 动态服务 |
| 离线野外作业地图 | martin-cp 生成 MBTiles + 本地 Martin 服务 |
| 全国基础底图分发 | PMTiles 远程文件 + CDN 缓存 |
| 多源数据融合展示 | Martin 多源合并为单一端点 |
快速开始
Martin 提供单二进制文件、Docker 镜像和 AWS Lambda 适配器等多种部署方式。作为 MapLibre 生态的核心基础设施之一,它采用 Apache-2.0/MIT 双协议开源,社区活跃,文档完善。
如果你正在构建一个需要同时处理实时动态数据 和静态基础底图的现代地图应用,Martin 凭借其 Rust 级别的性能表现和灵活的多源架构,值得作为瓦片服务层的首选方案。