Skip to content

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.png

OpenLayers

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
TRANSPARENTTRUE 为透明背景;JPEG 忽略
BGCOLOR0xRRGGBB,不透明出图时作为底色
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_FORMATapplication/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.0CRS=EPSG:4326&BBOX=10,100,12,102
1.3.0CRS=CRS:84&BBOX=100,10,102,12
1.1.1SRS=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.11.3.0结果
application/vnd.ogc.se_xml(缺省)XML(缺省)异常报告 XML
application/vnd.ogc.se_inimageINIMAGE按请求的宽高与格式出图,左上角写「异常码:说明」
application/vnd.ogc.se_blankBLANK同上,但只有底色(BGCOLOR,透明 PNG 时为透明)

出错的正是 WIDTH、HEIGHT 时无法出图,仍返回 XML。其他操作一律返回 XML。

代码典型情形
MissingParameterValue缺少必填参数
InvalidParameterValue参数值不合法、版本不支持;SLD_BODY 无法解析或校验失败、使用了 SLD
InvalidCRS / InvalidSRS坐标系不认识
InvalidFormat不支持的图片、图例或 GetFeatureInfo 格式
LayerNotDefined图层名不存在
StyleNotDefined样式不是空、default 或 SLD_BODY 中的样式名,或个数不符
LayerNotQueryable查询栅格图层
InvalidPointI/J 超出图片范围
OperationNotSupported不支持的操作或 XML 请求体
NoApplicableCode服务繁忙、超时、数据源不可用或其他内部错误

已知限制 ​

  • 服务只有 default 样式;请求中的样式只支持 SLD_BODY。带 SLD_BODY 出图时,图层是否因比例尺省略仍按服务自身的样式判定。
  • 不支持时间与高程维度,不支持 WMS-C。
  • 不接受 XML 请求体的 POST(POST 表单可用)。
  • 1.1.1 能力文档不写比例尺范围,1.1.1 客户端在所有比例尺下都会请求图层,出图时仍按比例尺省略。
  • GetMap 没有像素总量上限,4096×4096 的大图占用较多内存,浏览器端地图请优先用切片。