Appearance
WMTS
平台在每个服务的 MapServer 之下提供 WMTS 1.0.0(KVP 与 RESTful 两种编码):GetCapabilities、GetTile、GetFeatureInfo。WMTS 的瓦片与 MapServer 切片、TMS、OGC API Tiles 共用同一份缓存,同一位置取到的内容相同。启用方式、API Key 与异常的通用规则见 OGC 服务概览。
地址与启用
- 发布时勾选 WMTS。矢量图层、栅格图层与栅格切片包默认勾选。未启用时返回 404「服务未启用 WMTS」。
- 下表中
$W为https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/<服务路径>/MapServer/WMTS。
| 用途 | 地址 |
|---|---|
| 能力文档(RESTful) | $W/1.0.0/WMTSCapabilities.xml |
| 能力文档(KVP) | $W?SERVICE=WMTS&REQUEST=GetCapabilities;不带任何参数的 $W 同样返回能力文档 |
| 瓦片(RESTful) | $W/tile/1.0.0/<图层>/<样式>/<矩阵集>/{TileMatrix}/{TileRow}/{TileCol}.<png|jpg|pbf> |
| 瓦片(KVP) | $W?SERVICE=WMTS&VERSION=1.0.0&REQUEST=GetTile&LAYER=…&STYLE=default&FORMAT=image/png&TILEMATRIXSET=…&TILEMATRIX=…&TILEROW=…&TILECOL=… |
| GetFeatureInfo(RESTful) | $W/tile/1.0.0/<图层>/<样式>/<矩阵集>/{TileMatrix}/{TileRow}/{TileCol}/{J}/{I}.<json|html|txt> |
- 瓦片地址请从能力文档每个图层的
ResourceURL模板中读取,不要自己拼图层名:中文图层名在模板中已经过百分号编码。 - KVP 的参数名不区分大小写;给了
SERVICE或REQUEST时按标准校验:SERVICE=WMTS必填,GetTile 与 GetFeatureInfo 的VERSION=1.0.0必填。 - 只有 GET。能力文档带
ETag,内容未变时返回 304;也支持Sections、AcceptVersions与UpdateSequence。 - API Key 级别的服务:能力文档地址加
token=gb_xxx…后,文档中的 KVP 地址与ResourceURL模板都会带上token;也可以给每个请求加请求头X-GeoBridge-Token。
图层、样式与格式
| 服务 | 图层 | 格式 |
|---|---|---|
| 按需出图(未预切片,控制台发布的矢量与栅格服务默认如此) | 地图整体(标识为地图名)+ 每个子图层(标识为 WMS 图层名,分组展开;子图层的瓦片只画该图层) | image/png(透明)、image/jpeg;服务器支持时另有 image/webp |
| 预切片(含切片包) | 只有地图整体 | 切片配置的格式:image/png、image/jpeg 或 application/vnd.mapbox-vector-tile(矢量切片) |
- 样式只有
default。 - 能力文档中每个图层有经纬度范围(
WGS84BoundingBox)、每个矩阵集坐标系下的BoundingBox(4326、4490 纬度在前)、格式、可查询图层的 FeatureInfo 格式、矩阵集链接(预切服务带TileMatrixSetLimits)与ResourceURL。
矩阵集
| 标识 | 坐标系 | 网格 | 用于 |
|---|---|---|---|
GoogleMapsCompatible | EPSG:3857 | 0–24 级,第 z 级 2^z × 2^z,与 XYZ / MapLibre / OpenLayers 默认网格相同 | 按需出图;与之同网格的预切服务 |
WebMercatorQuad | EPSG:3857 | 与 GoogleMapsCompatible 同一网格(OGC 2D-TMS 的标识) | 同上 |
WorldCRS84Quad | CRS84(经纬度) | 0–20 级,第 z 级 2^(z+1) × 2^z,原点 (-180, 90) | 按需出图;同网格的 4326 预切 |
CGCS2000Quad | EPSG:4490 | 网格同 WorldCRS84Quad,左上角按 EPSG 轴序写作 90 -180 | 按需出图;同网格的 4490 预切 |
default028mm | 服务坐标系 | 由预切服务的切片方案推导(实际级别、分辨率、原点、瓦片尺寸),带 TileMatrixSetLimits | 预切服务 |
- 矩阵标识(
TileMatrix)为级别号0、1、2…;比例尺分母按 OGC 约定的 0.28 mm 像素换算。 - 按需出图的服务在前四种网格下都能出图,数据由平台重投影;能力文档不声明行列范围,数据范围外是透明瓦片。
- 预切服务只声明与其实际网格一致的矩阵集(推导的
default028mm,以及级别与内置网格一致时的内置矩阵集);请求其他矩阵集为InvalidParameterValue,超出TileMatrixSetLimits为TileOutOfRange。
GetFeatureInfo
- KVP:GetTile 的全部参数,加
I、J(瓦片内的像素列、行,从 0 开始)与INFOFORMAT;RESTful 写法用扩展名表示格式。 INFOFORMAT:application/json(GeoJSON,属性中带layer)、text/html、text/plain。识别规则同 WMS GetFeatureInfo(像素中心、容差 3 像素、只输出「输出字段」),每个查询图层最多 10 个要素。- 地图整体查询全部可查询的图层,子图层只查该图层;栅格图层不可查询。
客户端示例
下面以 city-basemap 为例,CAPS 为能力文档地址:
bash
CAPS='https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/WMTS/1.0.0/WMTSCapabilities.xml'QGIS:图层 → 添加图层 → 添加 WMS/WMTS 图层,新建连接,URL 填能力文档地址(API Key 级别加 ?token=gb_xxx…),连接后在「图块集」中选择图层与矩阵集。
ArcGIS Pro:插入 → 连接 → 新建 WMTS 服务器,URL 填能力文档地址。
GDAL
bash
# 列出图层与矩阵集(每个组合一个子数据集)
gdalinfo "WMTS:$CAPS"
# 按图层与矩阵集打开并转出
gdal_translate -of PNG -outsize 512 0 "WMTS:$CAPS,layer=<图层>,tilematrixset=WorldCRS84Quad" out.pngOpenLayers:读能力文档后用 optionsFromCapabilities,可用任一矩阵集(4326、4490 需要视图投影一致,4490 须先用 proj4 注册)。
js
import TileLayer from 'ol/layer/Tile'
import WMTSCapabilities from 'ol/format/WMTSCapabilities'
import WMTS, { optionsFromCapabilities } from 'ol/source/WMTS'
const text = await (await fetch(CAPS)).text()
const caps = new WMTSCapabilities().read(text)
const options = optionsFromCapabilities(caps, { layer: '<图层>', matrixSet: 'GoogleMapsCompatible', format: 'image/png' })
const layer = new TileLayer({ source: new WMTS(options) })图层有多种格式时,OpenLayers 10 的 optionsFromCapabilities 会把全部格式的模板放进 urls,可能混用 PNG 与 JPEG;用 JS SDK 的 openlayers.wmtsSource() 可以只保留所选格式,并自动处理 API Key。
Cesium
js
const provider = new Cesium.WebMapTileServiceImageryProvider({
url: 'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/WMTS/tile/1.0.0/<图层>/{Style}/{TileMatrixSet}/{TileMatrix}/{TileRow}/{TileCol}.png',
layer: '<图层>',
style: 'default',
tileMatrixSetID: 'GoogleMapsCompatible',
})
viewer.imageryLayers.addImageryProvider(provider)用 WorldCRS84Quad 或 CGCS2000Quad 时另给 tilingScheme: new Cesium.GeographicTilingScheme()。JS SDK 的 cesium.wmtsImageryProvider() 会读能力文档并自动选择网格与级别范围。
MapLibre:MapLibre 只支持 Web 墨卡托网格。用 GoogleMapsCompatible 或 WebMercatorQuad 的 RESTful 模板,把 {TileMatrix}/{TileRow}/{TileCol} 换成 {z}/{y}/{x}:
js
map.addSource('wmts', {
type: 'raster',
tileSize: 256,
tiles: ['https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-basemap/MapServer/WMTS/tile/1.0.0/<图层>/default/WebMercatorQuad/{z}/{y}/{x}.png'],
})
map.addLayer({ id: 'wmts', type: 'raster', source: 'wmts' })JS SDK 的 maplibre.addWmtsService() 会读能力文档并完成上述转换。
异常
OWS 1.1 ExceptionReport(text/xml):
| 代码 | 情形 | 状态 |
|---|---|---|
MissingParameterValue | 缺少 Service、Request、Version、Layer、Style、Format、TileMatrixSet、TileMatrix、TileRow、TileCol、I、J、InfoFormat | 400 |
InvalidParameterValue | 服务、版本不对;图层、样式、格式、矩阵集、矩阵不存在;行列号不是整数;图层不可查询 | 400 |
TileOutOfRange | 行列号超出矩阵或 TileMatrixSetLimits | 400 |
PointIJOutOfRange | I、J 超出瓦片像素范围 | 400 |
VersionNegotiationFailed | AcceptVersions 中没有 1.0.0 | 400 |
InvalidUpdateSequence | UpdateSequence 大于当前值或不是整数 | 400 |
OperationNotSupported | 未知操作 | 501 |
NoApplicableCode | 服务未配置切片(404);繁忙、超时(503,带 Retry-After: 5);其他(500) | 404 / 503 / 500 |
已知限制
- 只有 GET(KVP 与 RESTful),没有 SOAP。
- 样式只有
default,不支持维度(时间、高程)。 - 预切服务只有地图整体一个图层;按需出图的服务在能力文档中不声明行列范围。
- 预切服务按切片方案推导的
default028mm不是标准四叉树网格,MapLibre 与 Cesium 无法直接使用,请用 OpenLayers、QGIS 或 GDAL。