Skip to content

TMS ​

平台按 OSGeo Tile Map Service Specification 1.0.0 提供切片,适合 GDAL、Leaflet、OpenLayers 等按 TMS 编号取瓦片的客户端。TMS 与 WMTS、OGC API Tiles、MapServer 切片共用同一份缓存,同一位置取到的内容相同。启用方式、API Key 与异常的通用规则见 OGC 服务概览。

地址与启用 ​

  • 发布时勾选 TMS(不默认勾选)。矢量图层、栅格图层与切片包都可以。
  • 未启用时返回 404,正文为 TileMapServerError「服务未启用 TMS」;服务已停止返回 503。
  • 下表中 $T 为 https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/<服务路径>/MapServer/tms,只有 GET。
地址说明
$TServices 文档(只有 1.0.0)
$T/1.0.0TileMapService:列出全部 TileMap(标题、坐标系、profile、地址)
$T/1.0.0/<TileMap>TileMap:坐标系、范围、原点、瓦片格式与每级的分辨率
$T/1.0.0/<TileMap>/{z}/{x}/{y}.<扩展名>瓦片

TileMap ​

  • 名称为 <服务名>@<矩阵集>@<格式>,如 city-basemap@WebMercatorQuad@png、city-basemap@WorldCRS84Quad@jpg、city-roads@WebMercatorQuad@pbf(矢量瓦片)。jpeg 与 jpg、mvt 与 pbf 等价。
  • 别名:global-mercator(WebMercatorQuad 的第一种格式)、global-geodetic(WorldCRS84Quad 的第一种格式)。
  • 矩阵集与格式同 OGC API Tiles:
    • 按需出图的服务:WebMercatorQuad、WorldCRS84Quad、CGCS2000Quad,PNG 与 JPEG;
    • 预切服务:与其网格一致的内置矩阵集,格式为切片配置的格式;
    • 开启了 VectorTileServer 的矢量服务另有 WebMercatorQuad 的矢量瓦片(pbf)。
  • profile:WebMercatorQuad 为 global-mercator,WorldCRS84Quad 为 global-geodetic,其余为 local。
  • BoundingBox 与 Origin 为瓦片网格的范围与左下角(如 global-geodetic 为 −180,−90,180,90),客户端据此计算瓦片编号。

行号自下而上

TMS 的 y 从下往上数:y = 该级行数 − 1 − row(row 为 XYZ / WMTS 的行号,自上而下;Web 墨卡托与经纬度网格第 z 级都有 2^z 行)。在 XYZ 客户端中使用 TMS 地址时要设置翻转,见下文。

API Key ​

请求在查询参数中带了 token 时,TileMapService 与 TileMap 文档之间的链接会带上 token,但 TileMap 中每级的 href 不带——客户端会在它后面直接追加 /{x}/{y}.<扩展名>,带了查询串会拼出错误的地址。所以「API Key」级别的服务:

  • 能用请求头的客户端(MapLibre 的 transformRequest、GDAL 的 GDAL_HTTP_HEADERS、自己的程序)用 X-GeoBridge-Token;
  • 不能用请求头的,在瓦片地址模板后自己加 ?token=gb_xxx…。

客户端示例 ​

GDAL:直接打开 TileMap 地址。

bash
gdalinfo 'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/tms/1.0.0/city-basemap@WorldCRS84Quad@png'
# API Key 级别(GDAL 3.6 及以上)
GDAL_HTTP_HEADERS='X-GeoBridge-Token: gb_xxx…' gdalinfo '…/tms/1.0.0/city-basemap@WebMercatorQuad@png'

MapLibre:数据源写 scheme: 'tms'。

js
map.addSource('tms', {
  type: 'raster',
  scheme: 'tms',
  tileSize: 256,
  tiles: ['https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/tms/1.0.0/city-basemap@WebMercatorQuad@png/{z}/{x}/{y}.png'],
})
map.addLayer({ id: 'tms', type: 'raster', source: 'tms' })

OpenLayers:XYZ 源用 {-y}。

js
import TileLayer from 'ol/layer/Tile'
import XYZ from 'ol/source/XYZ'

const layer = new TileLayer({
  source: new XYZ({
    url: 'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/tms/1.0.0/city-basemap@WebMercatorQuad@png/{z}/{x}/{-y}.png',
  }),
})

Leaflet:L.tileLayer(url, { tms: true }),地址写法同 MapLibre。

JS SDK 的 services.tmsUrl() 生成上面的瓦片模板。

错误 ​

一律为 <TileMapServerError><Message>…</Message></TileMapServerError>(text/xml),用 HTTP 状态表示类别:400 参数错误,404 不存在、范围外或扩展名与 TileMap 的格式不符,503 暂不可用,500 内部错误;访问被拒绝时为 401、403。

已知限制 ​

  • 预切服务按切片方案推导的矩阵集(WMTS 中的 default028mm)各级底边不一致,不在 TMS 中列出,请用同网格的内置矩阵集,或用 WMTS。
  • TileMap 只描述瓦片网格的范围,数据的实际范围请看 OGC API 瓦片集的 tileMatrixSetLimits。