Appearance
WMS
平台在每个服务的 MapServer 之下提供只读的 WMS 1.1.1 / 1.3.0:服务端出图、点查询与图例。启用方式、API Key 与异常的通用规则见 OGC 服务概览。
地址与启用
- 地址:
https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/<服务路径>/MapServer/WMSServer - 能力文档:
…/WMSServer?service=WMS&request=GetCapabilities - 发布时勾选 WMS(不默认勾选),矢量与栅格图层都可以。未启用时返回 404「服务未启用 WMS」。
- 请求方式:GET,或 POST 表单(
application/x-www-form-urlencoded)。不接受 XML 请求体(返回OperationNotSupported)。
客户端示例
QGIS:图层 → 添加图层 → 添加 WMS/WMTS 图层,新建连接,URL 填能力文档地址。API Key 级别的服务在 URL 末尾加 &token=gb_xxx…。
ArcGIS Pro:插入 → 连接 → 新建 WMS 服务器,URL 填 …/WMSServer;API Key 级别的服务在「自定义参数」中加 token。
GDAL
bash
B='https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services'
# 列出子数据集(每个图层一个),再对其中一个出图
gdalinfo "WMS:$B/city-roads/MapServer/WMSServer?SERVICE=WMS&REQUEST=GetCapabilities"
gdal_translate -of PNG -outsize 512 0 "<SUBDATASET_1_NAME 的值>" out.pngOpenLayers
js
import ImageLayer from 'ol/layer/Image'
import ImageWMS from 'ol/source/ImageWMS'
const layer = new ImageLayer({
source: new ImageWMS({
url: 'https://map-demo.geobridge.cn/geobridge-mapserver/rest/geodata/services/city-roads/MapServer/WMSServer',
// API Key 级别:url 末尾加 ?token=gb_xxx…
params: { LAYERS: '<图层名>' },
}),
})OpenLayers 默认发 WMS 1.3.0,坐标系取视图的 EPSG:3857。完整的可运行示例见 OpenLayers 对照。
版本与操作
| 操作 | 说明 |
|---|---|
GetCapabilities | 不带 VERSION 或无法解析时按 1.3.0;版本号小于 1.3.0 时返回 1.1.1 |
GetMap | 出图,支持 SLD_BODY |
GetFeatureInfo | 点查询(矢量图层) |
GetLegendGraphic | 图例,支持 SLD_BODY |
DescribeLayer | 图层对应的 WFS 要素类型或 WCS 覆盖 |
- 除 GetCapabilities 外,
VERSION只接受1.3.0、1.1.1、1.1.0(按 1.1.1 处理),缺省按 1.3.0。 SERVICE可以缺省,给出时必须是WMS;REQUEST必填。
能力文档
- 根图层的标题为服务标题,没有名称;子图层的名称为 WMS 图层名(见名称规则)。分组图层嵌套表示。服务的摘要、关键词、访问约束等见能力文档的元数据。
- 坐标系:服务坐标系、
EPSG:4326、EPSG:3857、EPSG:4490,1.3.0 另加CRS:84。 - 矢量图层可查询(
queryable="1"),栅格图层不可查询。每个命名图层带一个default样式与图例地址(20×20)。 - 1.3.0 声明图片最大宽高均为 4096。
- 每个操作同时声明 GET 与 POST(表单)地址;异常格式列出 XML、INIMAGE、BLANK 三种;声明支持 SLD(只支持
SLD_BODY中引用本服务图层的样式)。 - 1.3.0 中有最小显示比例尺的图层带
MaxScaleDenominator:图层配置了最低显示级别,或数据量大、在小比例尺下会被自动省略。样式按比例尺分级并用属性过滤时,给出的是按实际生效规则还能出图的最小比例尺(与 GetMap 的判定一致,能一直出图时不写)。该值在服务启动或重新加载后由平台在后台统计,统计完成前按整层要素数给出(更保守),完成后的能力文档即为新值。
GetMap
| 参数 | 规则 |
|---|---|
LAYERS | 必填(给了 SLD_BODY 时可缺省,按 SLD 中的图层出图),逗号分隔的 WMS 图层名(区分大小写);分组图层展开为其下全部图层 |
STYLES | 可缺省或为空;非空时个数必须与 LAYERS 相同,每项为空、default,或该图层在 SLD_BODY 中的样式名 |
SLD_BODY | 可选,见下文;SLD(外部样式文档地址)不支持 |
CRS(1.1.1 为 SRS) | 必填,见坐标系与轴序 |
BBOX | 必填,minx,miny,maxx,maxy,轴序见下文 |
WIDTH、HEIGHT | 必填,1–4096 的整数 |
FORMAT | 必填:image/png 或 image/jpeg |
TRANSPARENT | TRUE 为透明背景;JPEG 忽略 |
BGCOLOR | 0xRRGGBB,不透明出图时作为底色 |
EXCEPTIONS | 异常格式,见异常;缺省为 XML |
- 按
BBOX原样出图,不调整宽高比:BBOX与图片宽高比不一致时图像被拉伸(这是 WMS 规定的行为,与 MapServer 的export不同)。DPI 固定为 96。 - 有图层因比例尺被省略时,响应头
X-GeoBridge-Omitted-Layers列出这些图层。 - 绘制顺序固定为服务中的图层顺序,不随
LAYERS中的顺序变化。
SLD_BODY(请求中的样式)
GetMap 与 GetLegendGraphic 接受 SLD_BODY:一份 SLD 1.0.0 或 1.1.0 文档,用其中的样式代替对应图层的样式出图,只影响本次请求,不修改服务。文档较长时请用 POST 表单提交。
xml
<StyledLayerDescriptor version="1.0.0" xmlns="http://www.opengis.net/sld" xmlns:ogc="http://www.opengis.net/ogc">
<NamedLayer><Name>道路_线</Name>
<UserStyle><Name>red</Name><FeatureTypeStyle><Rule>
<LineSymbolizer><Stroke><CssParameter name="stroke">#FF0000</CssParameter></Stroke></LineSymbolizer>
</Rule></FeatureTypeStyle></UserStyle>
</NamedLayer>
</StyledLayerDescriptor>- 只认
NamedLayer,名称为 WMS 图层名;分组图层的样式应用到其下全部图层。UserStyle取IsDefault为真的,否则取第一个;只写NamedStyle时须为default(沿用图层自身样式)。 - 给了
LAYERS时只覆盖其中的图层;不给时按 SLD 中的图层出图。STYLES可以写 SLD 中的样式名。 - 校验与平台的样式编辑器相同:字段、函数、符号、比例尺范围等有错误即拒绝,消息中给出第一条原因。
- 外部资源一律拒绝:图形与字体只允许平台图标库的图标与
data:内嵌图形,任何 http(s) 地址、本地文件与相对路径都拒绝。 - 上限:文本 64 KiB、规则合计 200 条、图层 50 个。
- 不支持:
SLD(外部地址)、UserLayer(内联要素、远程 WFS/WCS)。GetFeatureInfo 不看SLD_BODY。
GetFeatureInfo
GetMap 的全部参数(FORMAT 可缺省),加上:
| 参数 | 规则 |
|---|---|
QUERY_LAYERS | 必填,可以不在 LAYERS 中;含栅格图层时报 LayerNotQueryable |
I、J(1.1.1 为 X、Y) | 像素列、行,须在图片范围内,否则 InvalidPoint |
INFO_FORMAT | application/json(GeoJSON)、text/html、text/plain(缺省) |
FEATURE_COUNT | 每个查询图层最多返回的要素数,默认 1,最大 50 |
- 以像素中心为点、容差 3 像素逐层识别。
EPSG:3857(OpenLayers 默认)与同一范围的EPSG:4326、CRS:84写法查到的要素相同。 application/json的要素id为<WMS 图层名>.<要素 ID>,属性中加上layer(WMS 图层名)。- 只输出图层「输出字段」中的属性;日期为 ISO-8601。
GetLegendGraphic
- 参数:
LAYER(必填,WMS 图层名)、FORMAT(只支持image/png,可缺省)、WIDTH、HEIGHT(单个图标的尺寸,默认 20×20,范围 1–256)、SCALE(可缺省,比例尺分母,须为正数)、SLD_BODY(可选)。 - 按图层样式规则的标签逐行绘制图标与文字。标签依次取规则标题(
Title)、规则名称(Name)。 - 给出
SCALE时只列在该比例尺下显示的规则(MinScaleDenominator ≤ SCALE < MaxScaleDenominator)。比例尺按 OGC 约定(每像素 0.28 mm):256 像素切片第 z 级约为559082264 / 2^z,MapLibre 的zoom约为279541132 / 2^zoom。 - 标签相同的规则只出一行。图标取该标签下最大比例尺档的规则;同一标签在多个
FeatureTypeStyle中都有规则时叠画在一个图标里,所以「先画外框、再画内线」的道路样式在图例中是一个带外框的道路符号。 - 没有标题与名称的规则不单独成行(通常是装饰性外框)。整个样式都没有标签时只有一行,文字为图层标题;没有自定义样式的图层也是如此。
- 按比例尺分档的样式,请给同一等级各档的规则写相同的
Title,外框规则写与内线相同的Title,图例就是每个等级一行。 - 最多 200 行,其余合并为一行「… 另有 N 项」。
- 图例面板通常直接用不带
SCALE的地址,列出全部等级;需要随缩放只显示当前可见的等级时,追加&SCALE=<比例尺分母>并在缩放后更新图片地址。OpenLayers 的ImageWMS#getLegendUrl(resolution)会自动带上SCALE。
DescribeLayer
- 参数:
LAYERS(必填,分组展开为其下的图层)。 - 矢量图层在服务开启 WFS 时指向本服务的 WFS(类型名
gb:<名称>);栅格图层在开启 WCS 时指向本服务的 WCS(覆盖标识)。地址带回查询参数中的token。 - 1.1.1 返回
WMS_DescribeLayerResponse,没有对应服务的图层只写名称;1.3.0 返回 SLD 1.1 的DescribeLayerResponse,没有对应服务的图层不列出,全部都没有时为InvalidParameterValue。
坐标系与轴序
- 接受 EPSG 坐标系代码与平台中登记的自定义坐标系;不认识的坐标系报
InvalidCRS(1.1.1 为InvalidSRS)。 - 写法:
EPSG:n、urn:ogc:def:crs:EPSG::n、http://www.opengis.net/def/crs/EPSG/0/n、http://www.opengis.net/gml/srs/epsg.xml#n、CRS:84等。 - 1.3.0 的
EPSG:写法与所有 URN、HTTP 写法按 EPSG 官方轴序:4326、4490 等地理坐标系纬度在前,BBOX写成miny,minx,maxy,maxx。1.1.1、CRS:84与epsg.xml#n写法一律经度在前。
同一范围(经度 100–102,纬度 10–12)的写法:
| 版本 | 写法 |
|---|---|
| 1.3.0 | CRS=EPSG:4326&BBOX=10,100,12,102 |
| 1.3.0 | CRS=CRS:84&BBOX=100,10,102,12 |
| 1.1.1 | SRS=EPSG:4326&BBOX=100,10,102,12 |
| 任意 | EPSG:3857 等投影坐标系:BBOX=minx,miny,maxx,maxy(东、北在前) |
异常
WMS 的参数错误以 ServiceExceptionReport XML 返回(1.3.0 为 text/xml,1.1.1 为 application/vnd.ogc.se_xml),HTTP 状态码一律为 200,这是 WMS 的惯例。访问被拒绝(401、403)时同样返回 ServiceExceptionReport,但保留 401、403 状态码,GIS 软件据此提示需要鉴权。
GetMap 可以用 EXCEPTIONS 让错误以图片返回,便于在地图上直接看到原因:
| 1.1.1 | 1.3.0 | 结果 |
|---|---|---|
application/vnd.ogc.se_xml(缺省) | XML(缺省) | 异常报告 XML |
application/vnd.ogc.se_inimage | INIMAGE | 按请求的宽高与格式出图,左上角写「异常码:说明」 |
application/vnd.ogc.se_blank | BLANK | 同上,但只有底色(BGCOLOR,透明 PNG 时为透明) |
出错的正是 WIDTH、HEIGHT 时无法出图,仍返回 XML。其他操作一律返回 XML。
| 代码 | 典型情形 |
|---|---|
MissingParameterValue | 缺少必填参数 |
InvalidParameterValue | 参数值不合法、版本不支持;SLD_BODY 无法解析或校验失败、使用了 SLD |
InvalidCRS / InvalidSRS | 坐标系不认识 |
InvalidFormat | 不支持的图片、图例或 GetFeatureInfo 格式 |
LayerNotDefined | 图层名不存在 |
StyleNotDefined | 样式不是空、default 或 SLD_BODY 中的样式名,或个数不符 |
LayerNotQueryable | 查询栅格图层 |
InvalidPoint | I/J 超出图片范围 |
OperationNotSupported | 不支持的操作或 XML 请求体 |
NoApplicableCode | 服务繁忙、超时、数据源不可用或其他内部错误 |
已知限制
- 服务只有
default样式;请求中的样式只支持SLD_BODY。带SLD_BODY出图时,图层是否因比例尺省略仍按服务自身的样式判定。 - 不支持时间与高程维度,不支持 WMS-C。
- 不接受 XML 请求体的 POST(POST 表单可用)。
- 1.1.1 能力文档不写比例尺范围,1.1.1 客户端在所有比例尺下都会请求图层,出图时仍按比例尺省略。
- GetMap 没有像素总量上限,4096×4096 的大图占用较多内存,浏览器端地图请优先用切片。