本节摘要:GIS 服务要互通靠标准。本节讲 OGC(开放地理空间联盟)制定的 WMS、WFS、WMTS 等协议——GIS 服务的通用语言。
阅读完本节,你应当能够:
不同 GIS 软件互不兼容,数据和服务难共享。OGC 制定标准协议,让任何客户端能消费任何符合标准的服务,实现互操作。

| 协议 | 全名 | 返回 | 用途 |
|---|---|---|---|
| WMS | Web Map Service | 渲染图片 | 出图展示 |
| WFS | Web Feature Service | 矢量要素 | 查询分析 |
| WMTS | Web Map Tile Service | 瓦片图片 | 缓存加速出图 |
| WCS | Web Coverage Service | 栅格数据 | 遥感影像 |
WMS 用 HTTP GET 请求,参数指定图层、范围、尺寸:
http://server/wms?SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap &LAYERS=cities&BBOX=39,116,40,117&WIDTH=800&HEIGHT=600 &CRS=EPSG:4326&FORMAT=image/png
返回一张渲染好的地图图片。
WFS 返回矢量数据(GML/GeoJSON),可查询可分析:
http://server/wfs?SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature &TYPENAMES=cities&OUTPUTFORMAT=application/json
返回 FeatureCollection,前端能拿到几何和属性做分析。
WMTS 返回预渲染的瓦片,按层级行列索引,前端拼成地图。比 WMS 快(瓦片已缓存),但不能动态改样式。
现代趋势是矢量瓦片(MVT,Mapbox Vector Tiles):服务端把矢量数据切成瓦片传给前端,前端渲染。兼顾 WMTS 的性能和 WFS 的可分析性,样式前端可控。
⚠️ 常见坑:要数据做分析却用 WMS——WMS 只返回图片拿不到数据。要数据用 WFS,要展示用 WMS/WMTS。
💡 关键直觉:WMS/WMTS 出图(看),WFS 取矢量(分析),WCS 取栅格(影像)。现代用矢量瓦片兼顾性能和分析。
拿到一个服务地址,第一件事是请求它的能力文档(GetCapabilities),它会告诉你这个服务提供了哪些图层、坐标系、格式、操作:
请求 WMS 能力文档 SERVICE=WMS&REQUEST=GetCapabilities 请求 WFS 能力文档 SERVICE=WFS&REQUEST=GetCapabilities
返回的 XML 里有 <Layer> 列表、每个图层的名称(LayerName)、默认坐标系、支持的文件格式。前端框架(OpenLayers 等)通常自带读取能力文档的组件,你只需要把服务地址填进去,它会自动列出图层。这个"先发现、再访问"的设计让 OGC 服务天然具备自描述能力,也是它和一堆私有接口的重要区别。
WFS 不只是"把整个图层拉下来",它支持按属性或空间条件过滤,减少传输量:
请求指定属性的要素 SERVICE=WFS&VERSION=2.0.0&REQUEST=GetFeature &TYPENAMES=parcels&count=100 &CQL_FILTER=landuse='住宅' AND ST_INTERSECTS(geom, POLYGON((116 39,117 39,117 40,116 40,116 39)))
CQL(Common Query Language)是 OGC 的过滤语法,属性条件用普通比较,空间条件用 ST_INTERSECTS、ST_WITHIN 等函数。用上过滤后,前端从 WFS 拉的数据量能小一个数量级,是 Web GIS 性能优化的常用手段。
除了四大件,还有几个协议在特定场景会碰到:
| 协议 | 用途 | 典型场景 |
|---|---|---|
| CSW | 元数据目录服务 | 发现数据目录 |
| WPS | 地理处理服务 | 服务端执行分析算法 |
| GML | 地理标记语言 | WFS 的默认数据格式 |
| Filter Encoding | 过滤编码标准 | CQL 的 XML 形态 |
| 3D Tiles | 三维瓦片标准 | 三维场景流式加载 |
| GeoPackage | 数据封装标准 | 离线数据交换 |
不需要背全,但要知道生态里有这些标准。实际项目中 80% 的需求由 WMS、WFS、WMTS 三个协议覆盖,遇到"找数据""调算法"的需求时,再查对应的 CSW 和 WPS 标准即可。
理论上 OGC 标准保证互操作,实践中不同服务器实现仍有细节差异:有的对 VERSION 参数敏感,有的 CQL 支持不全,有的返回的坐标系范围不同。经验做法:先用 GetCapabilities 摸清对方支持的版本和格式,客户端优先用对方声明支持的能力;跨系统联调时,用 QGIS 或 OpenLayers 先连一次验证,再写正式代码。
用 OpenLayers 接入一个 WMS 图层,是 Web GIS 最常见的起步动作。流程是:先请求 GetCapabilities 确认图层名和坐标系,再在代码里注册图层源:
import TileLayer from 'ol/layer/Tile'; import TileWMS from 'ol/source/TileWMS'; const wmsLayer = new TileLayer({ source: new TileWMS({ url: '/geoserver/ows', params: { 'LAYERS': 'workspace:parcels', 'TILED': true, 'VERSION': '1.3.0' }, serverType: 'geoserver' }) }); map.addLayer(wmsLayer);
遇到图层不出图,按顺序排查:URL 是否指向服务根路径、LAYERS 名称是否和 GetCapabilities 里一致(注意工作区前缀)、坐标系是否匹配、服务端日志有没有报错。
OGC 标准最大的价值是让数据成为公共基础设施。同一个图层发布成 WMS 后,业务系统、领导驾驶舱、公众门户、移动 App 都能按同一套接口消费,不需要为每个场景定制格式。这也是政府部门和大型企业偏爱标准协议的原因:接口是资产,标准让资产可复用。开发时遇到"要不要按标准来"的犹豫,倾向选标准,长期收益大于短期省事。
下一节讲地图服务器——怎么发布这些服务。