GIS

WMS是什么

了解GIS中WMS(Web Map Service)的基本概念、工作原理、请求方式、常见参数以及WMS与WMTS、WFS、WCS和Vector Tile之间的区别。

阅读约 94 分钟

WMS是什么

WMS(Web Map Service)即Web地图服务

它是一种用于通过网络提供地图图像的GIS服务标准。

简单来说:

WMS负责把GIS数据按照指定的范围、坐标系、样式和图片格式渲染成地图图片,然后通过HTTP返回给客户端。

例如:

GIS数据
    ↓
WMS服务器
    ↓
地图渲染
    ↓
PNG / JPEG
    ↓
浏览器
    ↓
显示地图

用户看到的是一张地图图片,而不是服务器直接返回完整的矢量Geometry。

WMS解决什么问题

传统GIS数据可能存储在:

PostGIS
Shapefile
GeoPackage
Raster
GeoTIFF

如果客户端直接访问这些数据:

浏览器
    ↓
GIS数据

会涉及:

  • 数据格式解析
  • 坐标转换
  • 空间数据传输
  • 地图渲染
  • 样式处理

WMS将这些工作放到服务器端:

GIS数据
    ↓
WMS服务器
    ↓
空间查询
    ↓
坐标转换
    ↓
地图渲染
    ↓
图片

客户端只需要显示最终地图图片。

WMS的核心思想

WMS可以简单理解为:

用户告诉服务器:

我要看哪里?
使用什么坐标系?
地图多大?
需要哪些图层?
返回什么图片?

        ↓

WMS服务器

        ↓

生成地图图片

        ↓

返回图片

例如:

地图范围
+
坐标系
+
图片尺寸
+
图层
+
样式
+
图片格式

共同决定最终返回的地图。

WMS的基本架构

典型WMS架构:

                GIS数据
                   ↓
            ┌─────────────┐
            │ WMS Server  │
            └─────────────┘
                   ↓
              HTTP请求
                   ↓
              Web Browser
                   ↓
                地图图片

更加完整的结构:

PostGIS / Shapefile / Raster
            ↓
       GIS Server
            ↓
      WMS Service
            ↓
         HTTP
            ↓
       WebGIS Client
            ↓
          Map

WMS是一种服务标准

WMS不是某一个具体软件。

它是一套地图服务规范。

常见GIS服务器可以提供WMS服务,例如:

  • GeoServer
  • MapServer
  • QGIS Server
  • ArcGIS Server

因此:

WMS
 ↓
服务标准

而:

GeoServer
MapServer
QGIS Server
ArcGIS Server

属于具体的软件或服务平台。

WMS与OGC

WMS是OGC(Open Geospatial Consortium)制定的开放地理空间服务标准之一。

OGC制定了很多GIS相关标准,例如:

WMS
WFS
WCS
WMTS
WFS-T

这些标准用于规范不同类型的地理空间数据和服务。

可以理解为:

OGC
├── WMS
├── WFS
├── WCS
├── WMTS
└── ...

WMS返回什么

WMS最典型的返回结果是地图图片。

常见格式:

PNG
JPEG
GIF

例如:

请求WMS
    ↓
服务器生成地图
    ↓
map.png

浏览器最终看到:

┌────────────────────────────┐
│                            │
│       GIS地图图片           │
│                            │
└────────────────────────────┘

因此WMS最重要的特点是:

返回的是渲染后的地图图像。

WMS GetCapabilities

WMS最重要的请求之一是:

GetCapabilities

它用于获取WMS服务的能力信息。

例如:

WMS
 ↓
GetCapabilities
 ↓
服务信息

返回内容通常包括:

服务名称
服务标题
支持的WMS版本
图层
图层名称
图层标题
坐标系
边界范围
支持的图片格式
支持的操作

因此客户端通常可以先请求:

GetCapabilities

了解服务器提供什么内容。

GetCapabilities的作用

例如一个WMS服务包含:

roads
buildings
water
landuse

客户端不知道有哪些图层。

可以请求:

GetCapabilities

然后得到:

Layer
├── roads
├── buildings
├── water
└── landuse

客户端就可以选择需要的图层。

WMS GetMap

WMS最核心的地图请求是:

GetMap

它用于请求指定范围的地图图片。

可以理解为:

GetCapabilities
    ↓
查询服务信息

GetMap
    ↓
请求地图图片

GetMap需要哪些参数

一个典型GetMap请求通常需要指定:

LAYERS
STYLES
CRS
BBOX
WIDTH
HEIGHT
FORMAT

例如:

LAYERS=roads

表示:

请求道路图层
CRS=EPSG:3857

表示:

使用Web Mercator坐标系
WIDTH=1024
HEIGHT=768

表示:

返回1024 × 768像素的地图图片

BBOX

BBOX表示地图请求范围。

通常形式:

minX,minY,maxX,maxY

例如:

BBOX=12900000,4800000,13000000,4900000

表示请求一个矩形空间范围。

可以理解为:

             maxY
              ↑
       ┌──────────────┐
       │              │
       │   请求范围    │
       │              │
       └──────────────┘
              ↓
             minY

minX                 maxX

服务器只需要渲染这个范围。

WIDTH和HEIGHT

WMS返回的是图片,因此需要指定图片尺寸。

例如:

WIDTH=800
HEIGHT=600

表示:

800 × 600

像素的地图图片。

注意:

WIDTH和HEIGHT决定的是图片像素尺寸,而BBOX决定的是空间范围。

例如:

BBOX
 ↓
看哪里

WIDTH / HEIGHT
 ↓
图片有多大

FORMAT

FORMAT指定返回图片格式。

常见:

image/png
image/jpeg

例如:

FORMAT=image/png

表示:

返回PNG地图

PNG通常适合:

  • 透明背景
  • 线划地图
  • 行政区
  • 道路
  • GIS专题图

JPEG通常适合:

  • 影像
  • 大面积连续地图
  • 对文件大小比较敏感的场景

TRANSPARENT

WMS通常可以设置:

TRANSPARENT=true

表示地图背景透明。

例如:

底图
+
WMS道路图层

如果WMS背景透明:

┌─────────────────────┐
│     底图             │
│  ───道路───          │
│                     │
└─────────────────────┘

道路可以叠加在其他地图上。

STYLES

STYLES用于指定地图样式。

例如:

STYLES=

或者:

STYLES=default

服务器根据指定样式渲染地图。

因此同一个GIS数据:

roads

可以使用不同样式:

roads + style A
    ↓
一种地图效果

roads + style B
    ↓
另一种地图效果

LAYERS

LAYERS指定需要显示的图层。

例如:

LAYERS=roads

或者多个图层:

LAYERS=roads,buildings,water

服务器可以将多个图层一起渲染。

结构可以理解为:

WMS
├── roads
├── buildings
└── water

请求:

LAYERS=roads,buildings

最终得到:

roads
    +
buildings
    ↓
一张地图图片

CRS

CRS表示坐标参考系统。

例如:

CRS=EPSG:3857

表示使用:

Web Mercator

也可能使用:

CRS=EPSG:4326

表示:

WGS 84

因此WMS请求中的:

BBOX

必须结合:

CRS

一起理解。

因为:

BBOX中的数字到底代表什么,取决于使用的坐标参考系统。

EPSG:4326

EPSG:4326通常表示:

WGS 84

常见坐标形式:

经度
纬度

例如:

116.397
39.908

可以表示:

经度 = 116.397
纬度 = 39.908

EPSG:3857

EPSG:3857是Web地图中非常常见的投影坐标系。

WMS可以使用:

CRS=EPSG:3857

客户端地图也经常使用:

EPSG:3857

这样可以减少:

客户端
    ↕
服务端

之间的坐标转换。

WMS请求流程

一个典型的WMS使用过程:

1. 获取服务信息
        ↓
GetCapabilities

2. 查看图层
        ↓
roads
buildings
water

3. 选择坐标系
        ↓
EPSG:3857

4. 确定地图范围
        ↓
BBOX

5. 设置图片尺寸
        ↓
WIDTH / HEIGHT

6. 请求地图
        ↓
GetMap

7. 返回PNG/JPEG
        ↓
显示地图

一个典型的GetMap结构

可以理解为:

WMS GetMap
├── LAYERS
├── STYLES
├── CRS
├── BBOX
├── WIDTH
├── HEIGHT
├── FORMAT
└── TRANSPARENT

例如:

LAYERS=roads
STYLES=
CRS=EPSG:3857
BBOX=...
WIDTH=1024
HEIGHT=768
FORMAT=image/png
TRANSPARENT=true

服务器收到请求以后:

读取参数
    ↓
查询空间数据
    ↓
裁剪数据
    ↓
投影转换
    ↓
应用样式
    ↓
渲染
    ↓
PNG

WMS与GeoJSON

GeoJSON:

GeoJSON
    ↓
Geometry
+
Properties

WMS:

GIS数据
    ↓
服务器渲染
    ↓
图片

因此:

特性WMSGeoJSON
类型地图服务数据格式
返回内容地图图片矢量数据
Geometry客户端通常不可直接获得可以直接获得
Properties通常不作为主要返回内容包含属性
样式服务端渲染客户端可以控制
空间分析不适合作为原始数据可以进一步处理
地图显示非常适合适合

WMS与WFS

WMS和WFS经常一起学习。

WMS:

数据
 ↓
地图渲染
 ↓
图片

WFS:

数据
 ↓
Feature
 ↓
矢量数据

因此:

WMS主要提供“地图长什么样”,WFS主要提供“地图对象是什么”。

例如道路数据:

WMS:

道路
 ↓
渲染
 ↓
PNG

WFS:

道路
 ↓
Feature
 ↓
Geometry + Properties

WMS与WMTS

WMS:

动态生成地图图片

WMTS:

预先切好的地图瓦片

可以简单理解:

WMS
 ↓
请求范围
 ↓
实时渲染
 ↓
图片

而:

WMTS
 ↓
请求Tile
 ↓
返回已有瓦片

因此WMTS通常更适合:

高并发
固定比例尺
缓存
快速地图浏览

而WMS更加灵活。

WMS与Vector Tile

Vector Tile:

矢量Geometry
    ↓
Tile
    ↓
PBF

WMS:

GIS数据
    ↓
服务器渲染
    ↓
PNG/JPEG

核心区别:

特性WMSVector Tile
返回图片矢量数据
Geometry通常不可直接获取可以获取
样式服务器渲染客户端渲染
交互相对有限更灵活
动态样式较弱很强
大规模地图可以非常适合
实现复杂度较低较高

WMS与Raster Tile

WMS返回图片,但它不等于传统Raster Tile。

WMS:

客户端请求
    ↓
指定BBOX
    ↓
服务器实时生成图片

Raster Tile:

z/x/y
    ↓
读取已有瓦片
    ↓
返回图片

因此:

WMS
 ↓
动态地图图片服务

而:

XYZ / WMTS
 ↓
瓦片地图服务

WMS适合什么

WMS非常适合:

  • GIS专题地图
  • 行政区地图
  • 土地利用图
  • 地质图
  • 气象地图
  • 环境监测图
  • 规划地图
  • 遥感专题图
  • 企业GIS系统
  • 地图叠加服务

例如:

底图
 +
WMS行政区
 +
WMS土地利用
 +
WMS环境监测

可以组成一个完整的GIS应用。

WMS不适合什么

WMS并不是所有GIS场景的最佳选择。

例如:

需要直接获取Geometry
需要客户端大量交互
需要动态修改Feature样式
需要大规模矢量地图

这些场景可能更适合:

WFS
GeoJSON
Vector Tile

而:

海量影像
卫星图片

则更适合:

WMTS
XYZ Raster Tile
COG

WMS的优点

1. 标准化

WMS是成熟的OGC标准。

不同GIS软件可以按照统一方式访问。

2. 客户端简单

客户端主要负责:

发送请求
+
显示图片

不需要自己处理复杂Geometry。

3. 服务端统一渲染

服务器可以统一控制:

样式
符号
颜色
标签
图层

4. 数据安全性较好

客户端拿到的是地图图片,而不是完整原始数据。

因此:

原始数据
    ↓
服务器
    ↓
WMS
    ↓
图片

可以减少原始空间数据直接暴露。

5. GIS软件兼容性好

大量GIS客户端和WebGIS框架都支持WMS。

WMS的缺点

1. 每次需要服务器渲染

用户移动地图:

地图移动
    ↓
新的BBOX
    ↓
新的WMS请求
    ↓
重新渲染

服务器压力可能比较大。

2. 图片无法直接进行空间分析

客户端得到的是:

PNG

而不是:

Geometry

3. 交互能力有限

如果需要:

点击Feature
编辑Feature
修改单个Feature样式

WMS通常不是最佳选择。

4. 高并发下需要缓存

大量用户同时请求WMS:

用户1 → WMS
用户2 → WMS
用户3 → WMS
...

可能导致服务器重复渲染。

因此通常需要:

缓存
CDN
Tile Cache

等机制。

WMS缓存

虽然WMS本质上可以动态渲染,但实际生产环境通常会配合缓存。

例如:

用户
 ↓
WMS
 ↓
缓存

或者:

用户
 ↓
GeoWebCache
 ↓
WMS

通过缓存减少重复渲染。

WMS与地图图层

WebGIS中经常把WMS作为一个地图图层。

例如:

Map
├── Base Map
│
├── WMS Roads
│
├── WMS Buildings
│
└── WMS Landuse

客户端可以控制:

显示
隐藏
透明度
图层顺序

例如:

底图
   ↓
行政区WMS
   ↓
道路WMS
   ↓
专题WMS

最终组成一张地图。

WMS透明度

WMS图层通常可以设置透明度。

例如:

Base Map
    +
WMS

设置:

opacity = 0.5

就可以同时看到:

底图
+
WMS专题图

这种方式非常适合:

  • 天气图
  • 土地利用
  • 污染区域
  • 行政区
  • 规划图

WMS GetFeatureInfo

除了:

GetCapabilities
GetMap

WMS还经常支持:

GetFeatureInfo

它用于查询地图某个位置附近的Feature信息。

流程:

用户点击地图
    ↓
像素位置
    ↓
GetFeatureInfo
    ↓
WMS服务器
    ↓
查询空间数据
    ↓
返回Feature信息

例如用户点击道路:

道路名称:北京路
道路等级:主干道

因此WMS虽然主要返回地图图片,但可以通过GetFeatureInfo实现一定程度的地图查询。

GetFeatureInfo与WFS

两者容易混淆。

GetFeatureInfo:

针对地图上的某个位置进行查询

WFS:

提供Feature数据服务

可以理解为:

GetFeatureInfo
    ↓
点一下地图
    ↓
告诉我这里是什么

而:

WFS
    ↓
我要这一批Feature数据

用途不同。

WMS图层叠加

WMS非常适合多个专题图层叠加。

例如:

            Map
             ↓
      ┌──────────────┐
      │   Base Map   │
      ├──────────────┤
      │   Roads WMS  │
      ├──────────────┤
      │ Buildings WMS│
      ├──────────────┤
      │ Landuse WMS  │
      └──────────────┘

每个WMS图层可以来自不同服务器。

最终客户端负责:

图层排序
透明度
显示隐藏

WMS在OpenLayers中的使用

OpenLayers可以加载WMS图层。

典型结构:

Map
 ↓
TileLayer / ImageLayer
 ↓
WMS Source
 ↓
WMS Server

例如:

WMS Server
    ↓
OpenLayers
    ↓
地图

WMS可以作为:

ImageWMS
TileWMS

等方式使用。

WMS在Leaflet中的使用

Leaflet也可以加载WMS。

基本思路:

Leaflet Map
    ↓
WMS Layer
    ↓
WMS Server

Leaflet根据地图范围生成:

BBOX

然后请求WMS图片。

WMS在Cesium中的使用

Cesium也可以使用WMS作为影像或地图图层。

基本结构:

Cesium
    ↓
Imagery Layer
    ↓
WMS
    ↓
地图图片

这使WMS可以用于三维地球中的专题地图叠加。

WMS常见问题

坐标系不一致

例如:

客户端
EPSG:3857

而服务只支持:

EPSG:4326

可能导致:

地图无法显示

因此需要检查GetCapabilities返回的CRS列表。

BBOX顺序问题

不同WMS版本和CRS可能存在坐标轴顺序差异。

特别是在:

EPSG:4326

等坐标系下,需要注意:

经度 / 纬度

和:

纬度 / 经度

的轴顺序问题。

图层名称错误

例如服务实际提供:

workspace:roads

而客户端请求:

roads

可能导致:

Layer not found

因此应该先使用:

GetCapabilities

确认真实Layer名称。

BBOX范围错误

如果:

BBOX

不正确,可能得到:

空白地图

图片格式不支持

例如服务器不支持:

image/png

客户端请求就会失败。

因此应该从:

GetCapabilities

查看支持的格式。

WMS的完整知识结构

可以这样理解WMS:

WMS
├── OGC标准
│
├── 服务
│   └── HTTP
│
├── 操作
│   ├── GetCapabilities
│   ├── GetMap
│   └── GetFeatureInfo
│
├── 请求参数
│   ├── LAYERS
│   ├── STYLES
│   ├── CRS
│   ├── BBOX
│   ├── WIDTH
│   ├── HEIGHT
│   ├── FORMAT
│   └── TRANSPARENT
│
└── 返回
    └── 地图图片

WMS与其他GIS服务

可以建立下面的关系:

OGC / GIS Web Services
│
├── WMS
│   └── 地图图片
│
├── WFS
│   └── 矢量Feature
│
├── WCS
│   └── 栅格覆盖数据
│
└── WMTS
    └── 地图瓦片

进一步:

WMS
 ↓
地图图片

WFS
 ↓
矢量数据

WCS
 ↓
栅格数据

WMTS
 ↓
地图瓦片

WMS、WFS、WCS、WMTS总结

服务主要内容典型用途
WMS地图图片地图显示
WFS矢量Feature矢量数据访问
WCS栅格覆盖数据栅格数据访问
WMTS地图瓦片高性能地图显示

可以记住:

WMS看地图,WFS拿矢量,WCS拿栅格,WMTS拿瓦片。

WMS完整请求流程

用户打开WebGIS
        ↓
客户端请求GetCapabilities
        ↓
获取服务信息
        ↓
选择Layer
        ↓
确定CRS
        ↓
计算BBOX
        ↓
确定WIDTH / HEIGHT
        ↓
请求GetMap
        ↓
WMS服务器
        ↓
空间查询
        ↓
坐标转换
        ↓
地图样式
        ↓
服务器渲染
        ↓
PNG / JPEG
        ↓
浏览器显示

总结

WMS(Web Map Service)是一种通过网络提供地图图像的GIS服务标准。

它的核心流程是:

GIS数据
    ↓
WMS服务器
    ↓
空间查询
    ↓
投影转换
    ↓
地图渲染
    ↓
PNG / JPEG
    ↓
WebGIS

最重要的三个操作是:

GetCapabilities
    ↓
获取服务能力和图层信息

GetMap
    ↓
获取地图图片

GetFeatureInfo
    ↓
查询地图位置附近的Feature信息

最重要的GetMap参数包括:

LAYERS
STYLES
CRS
BBOX
WIDTH
HEIGHT
FORMAT
TRANSPARENT

理解WMS可以记住一句话:

WMS不是把GIS原始数据直接给客户端,而是根据客户端指定的范围、坐标系、图层和样式,在服务器端生成地图图片。

因此:

WMS
 ↓
服务端渲染
 ↓
地图图片

而:

WFS
 ↓
矢量Feature
Vector Tile
 ↓
切片矢量数据
WMTS
 ↓
地图瓦片

这几种技术共同构成了现代WebGIS中非常重要的地图数据服务体系。

🧰

相关工具

使用 IYATools 在线工具快速处理 GIS 数据