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数据
↓
服务器渲染
↓
图片
因此:
| 特性 | WMS | GeoJSON |
|---|---|---|
| 类型 | 地图服务 | 数据格式 |
| 返回内容 | 地图图片 | 矢量数据 |
| 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
核心区别:
| 特性 | WMS | Vector 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 数据